Process-Management

執行緒數的限制是多少?

  • February 11, 2017

我想知道我可以在我的機器上創建多少個程序(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 個程序,接近我的 32k pid_max

現在,如果我使用普通使用者shell 的 PID ( echo $$),並在另一個 shell 中以 root 身份prlimit --pid $SHELLPID --nproc=30000執行: ,然後在這個 shell 中啟動你的程序,我可以創建近 30k 個程序:

RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678

最後:您還應該考慮記憶體使用情況,因為在我的系統上,我使用了大量RAM 和交換來創建所有這些程序,也許這是您達到的限制。檢查與free

引用自:https://unix.stackexchange.com/questions/343296