我有几个在 RHEL 6.3 上运行的进程,但由于某种原因,它们超出了线程堆栈大小。
例如,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 内核)。
任何帮助理解这里发生的事情将不胜感激。