執行緒數的限制是多少?
我想知道我可以在我的機器上創建多少個程序(x64 和 8Gb RAM 並執行 Ubuntu)。所以我做了一個簡單的主程序,它不斷地創建子程序,而子程序一直在睡覺。我只完成了 11-12k 個程序。然後我將程序切換到執行緒並得到完全相同的結果。我的 pid_max 設置為 32768,所有每個使用者的限制都被禁用。物理記憶體使用量只有幾個字節。你能告訴我是什麼阻止了系統在那時創建新執行緒嗎?
ps 這是我用 C 編寫的多處理測試的原始碼
#include <stdio.h> #include <unistd.h> int main() { pid_t pid; int count = 0; while (1) { pid = fork(); if (pid == -1) { printf("total: %d\n", count); return 0; } if (pid == 0) { while (1) sleep(10); } count++; } }
我認為您達到了程序數限製或記憶體限制。
當我在我的電腦上嘗試您的程序並達到該
pid == -1
狀態時,fork()
返回錯誤EAGAIN
,並帶有錯誤消息:Resource temporarily unavailable
。作為普通使用者,我可以創建大約 15k 個程序。發生這種情況的原因有多種
EAGAIN
,詳見man 2 fork
:
- 記憶體不足,
- 達到 RLIMIT_NPROC 之類的限制,
- 截止日期調度程序細節。
就我而言,我認為我剛剛達到了
RLIMIT_NPROC
極限,也就是ulimit -u
通常顯示的。最好是在程序中顯示這個限制,這樣你就有了真正的價值,而不是你的 shell 的限制。#include <sys/time.h> #include <sys/resource.h> int main() { struct rlimit rlim; getrlimit(RLIMIT_NPROC, &rlim); printf("RLIMIT_NPROC soft: %d, hard: %d\n", rlim.rlim_cur, rlim.rlim_max);
產生:
RLIMIT_NPROC soft: 15608, hard: 15608 total: 15242
這看起來很合理,因為我正在執行其他程序,包括 Web 瀏覽器。
現在,作為 root,這些限制不再適用,我可以
fork()
做得更多:我創建了超過 30k 個程序,接近我的 32kpid_max
。現在,如果我使用普通使用者shell 的 PID (
echo $$
),並在另一個 shell 中以 root 身份prlimit --pid $SHELLPID --nproc=30000
執行: ,然後在這個 shell 中啟動你的程序,我可以創建近 30k 個程序:RLIMIT_NPROC soft: 30000, hard: 30000 total: 29678
最後:您還應該考慮記憶體使用情況,因為在我的系統上,我使用了大量RAM 和交換來創建所有這些程序,也許這是您達到的限制。檢查與
free
。