2012-11-01 1 views
4

RHEL 6.3에서 몇 가지 프로세스가 실행되고 있지만 어떤 이유로 스레드 스택 크기를 초과합니다.RedHat Enterprise Linux 6에서 스레드 스택 크기 제한을 초과하는 프로세스가 있습니까?

예를 들어 Java 프로세스는 시작할 때 런타임에 -Xss256k의 스택 크기가 주어지며 C++ 프로세스에는 실제 코드에서 pthread_attr_setstacksize()를 사용하여 1MB의 스레드 스택 크기가 지정됩니다.

그러나 이러한 프로세스가 이러한 제한을 지키지 않고 있으며 이유가 확실하지 않습니다. 나는 C++ 및 Java 프로세스에 대한

pmap -x <pid> 

실행 예를 들어

, 나는 이들 각각에 의해 생성 된 내부 작업자 스레드를 확정 한 각에 대한 '익명'수백 개의 스레드 (볼 수 있습니다 프로세스), 그러나 이들은, 한계는 위의 설정하지 64메가바이트 각각의 할당 된 값을했다 :

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 ] 
... 

을하지만 실행할 때 모든 64메가바이트 '곧'스레드 위의 과정에서 다음

cat /proc/<pid>/limits | grep stack 

Max stack size 1048576 1048576 bytes 

최대 스레드 스택 크기가 1MB이므로 여기서 무슨 일이 일어나고 있는지 혼란 스럽습니다. 또한이 프로그램을 호출하는 스크립트는 'ulimit -s 1024'도 설정합니다.

매우 고급 컴퓨터 (예 : 48GB RAM, 24 CPU 코어)를 사용할 때만 나타나는 것으로보아야합니다. 덜 강력한 컴퓨터 (예 : 4GB RAM, 2CPU 코어)에는 문제가 표시되지 않습니다.

여기에서 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다.

답변

6

RHEL6 2.11은 가능한 한 각 스레드가 자체 스레드 풀을 할당받을 수 있도록 스레드 모델을 변경했기 때문에, 더 큰 시스템에서는 64MB까지 잡을 수 있습니다. 64 비트에서 허용되는 스레드 풀의 최대 수가 더 큽니다.

:

이에 대한 수정이 (오히려 glibc2.11를 사용하는 것보다) 프로세스를 시작하는 스크립트에

export LD_PRELOAD=/path/to/libtcmalloc.so 

을 추가했다

이에 좀 더 inforation은에서 사용할 수 있습니다 리눅스 glibc> = 2.10 (RHEL 6)의 malloc은 https://www.ibm.com/developerworks/mydeveloperworks/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

의 glibc 버그의 malloc 멀티 스레드 애플리케이션 과도한 메모리를 사용 과도한 가상 메모리 사용을 보여줄 수있다 http://sourceware.org/bugzilla/show_bug.cgi?id=11261

아파치 하둡 https://issues.apache.org/jira/browse/HADOOP-7154

+0

이 답변을 주셔서 감사합니다. 많은 시간을 절약 해 줬습니다! 변경 사항을 적용하고 알림없이 해제하는 이유는 무엇입니까? – omid

0

/proc/1234/limits으로보고 된 스택 크기는 setrlimit(2) (로그인시 PAM 하위 시스템)으로 설정됩니다.

실제 스택 세그먼트가 각각 64Mb 인 것처럼 보이는 이유는 없습니다. 아마도 큰 서버는 huge pages을 사용합니다 (그러나 데스크탑은 그렇지 않습니다).

setrlimit (예 : ulimit 내장형 또는 limit 내장형)을 (를) 호출 할 수 있습니다. 귀하의 프로그램을 호출하는 스크립트.

+0

감사 Basile - 내가 말한대로 - 프로그램을 호출하는 스크립트에서 ulimit -s 1024를 설정했지만 여전히 동일한 결과가 나타납니다. – Rory

0

ulimit -s <size_in_KB>을 사용하여 프로세스의 최대 스택 크기를 설정할 수 있습니다. ulimit -s도 전류 제한을 볼 수 있습니다.

+0

감사합니다. Spap, 나는이 프로세스를 시작하는 스크립트에서 이미 이것을하고 있습니다. 아무 것도 영향을 미치지 않는 것 같습니다. 언급하지 않는 것에 대해 사과드립니다. 이것을 반영하기 위해 위의 게시물을 업데이트했습니다. – Rory

0

MALLOC_ARENA_MAX 설정함으로써이 문제를 해결 한 @ rory 귀하의 답변에 reagentard와 함께, 64mb 블록 주소 힙 주소를해야하지만 지금은 주소가 00007fa50c02a000 스택 주소, 맞습니까?

관련 문제