pthread_create中Resource temporarily unavailable問題

有臺設備發現程序啓動失敗,上去通過日誌發現是線程啓動(pthread_create)失敗,進一步定位,打印errno:11,Resource temporarily unavailable。

但是發現失敗前不管是top還是free,還是swap虛擬內存都不高,不存在內存不足的問題。

百度發現說是ulimit給的線程數量不足。

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 257733
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 30000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) 1200000
file locks                      (-x) unlimited

進程1024個完全足夠,出於實驗目的,修改爲更大的數字,但是發現進程只能啓動幾十個線程,嘗試修改其他參數,發現最多隻能啓動115個線程。

只好和其他設備進行對比,發現其他設備的信息是
virtual memory (kbytes, -v) unlimited
於是進行修改,發現啓動正常。

查了下資源,線程佔用的虛擬內存很高,但是實際上並不使用,只是計算一個預計的大小,所以swap依然會是0
一個線程佔用的虛擬內存是根據stack size來設置的,這個設備剛好是10240,1200000/10240=117.18,所以啓動了115個線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章