我有幾個進程在RHEL 6.3上運行,但由於某些原因,它們超出了線程堆棧大小。在RedHat Enterprise Linux 6上超過線程堆棧大小限制的進程?
例如,Java進程在運行時在啓動時被賦予了-Xss256k的堆棧大小,並且C++進程在實際代碼中使用pthread_attr_setstacksize()給出了1MB的線程堆棧大小。
出於某種原因然而,這些過程都沒有堅持到這些限制,我不知道爲什麼。
例如,當我運行
pmap -x <pid>
爲C++和Java過程中,我可以看到每個數百「不久又看到」的線程(我已經證實是由每個這些創建的內部工作線程過程),但這些都各64MB的分配值,而不是上面設置的限制:
00007fa4fc000000 168 40 40 rw--- [ anon ]
00007fa4fc02a000 65368 0 0 ----- [ anon ]
00007fa500000000 168 40 40 rw--- [ anon ]
00007fa50002a000 65368 0 0 ----- [ anon ]
00007fa504000000 168 40 40 rw--- [ anon ]
00007fa50402a000 65368 0 0 ----- [ anon ]
00007fa508000000 168 40 40 rw--- [ anon ]
00007fa50802a000 65368 0 0 ----- [ anon ]
00007fa50c000000 168 40 40 rw--- [ anon ]
00007fa50c02a000 65368 0 0 ----- [ anon ]
00007fa510000000 168 40 40 rw--- [ anon ]
00007fa51002a000 65368 0 0 ----- [ anon ]
00007fa514000000 168 40 40 rw--- [ anon ]
00007fa51402a000 65368 0 0 ----- [ anon ]
00007fa518000000 168 40 40 rw--- [ anon ]
...
但是,當我運行與64MB「匿名」的所有線程在上述過程以下
cat /proc/<pid>/limits | grep stack
Max stack size 1048576 1048576 bytes
它顯示了一個1MB的最大線程堆棧大小,所以感到有些困惑,這到底是怎麼回事。另外,調用這些程序的腳本也會設置'ulimit -s 1024'。
應當注意,這僅僅似乎發生使用非常高的端機器(例如48GB的RAM,24個CPU核心)時。這個問題不會出現在功能不太強大的機器上(例如4GB RAM,2個CPU核心)。
任何幫助瞭解這裏發生的事情將不勝感激。
感謝這個答案,爲我節省了很多時間! 爲什麼進行此更改併發布時沒有任何提醒? – omid