2013-07-26 3 views
1

일 (day) 요청을 처리하고 처리해야하는 mutlithreaded Linux 서버 (64 비트)가 있습니다. 그러나 얼마 동안은 프로세스의 메모리 사용률이 급격하게 증가하는 것을 목격하고 있습니다. 때로는 시간이 지나면 내려 오지 만 가끔 프로세스가 임계 값 한도에 도달 한 후에 충돌합니다. 리눅스 프로세스가 갑작스러운 메모리 점프를 표시합니다.

은 내가 이 매핑을 찾아PMAP을 현재 smaps 사용이 때의 총 메모리 사용률이 4.5GB했다 반면 힙 크기가 390메가바이트 것을 발견했다.

나는 pmaps 출력에서 ​​익명 메모리 세그먼트의 많은 그래서 내가 strace를 달렸다 memery시 내 프로세스가 1백34메가바이트 크기의 mmap 호출 된 점프 것을 발견 볼 수

: 내가 쓴

29045 19:52:45 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aabf8000000 
29045 19:53:12 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac00000000 
29045 19:53:21 mmap(0x2aac04000000, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac04000000 
29045 19:53:28 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac08000000 

을 내 래퍼 malloc에 대한 내 응용 프로그램에서 수행 한 최대 메모리 할당은 점프 시점에 한 개의 30MB 할당과 한 개의 20MB 할당이었습니다. 그리고이 기억은 해방되었습니다.

내 프로세스가 왜 이러한 큰 mmaps를 호출하는지 알아야합니까?

추가 정보 :

#0 0x00000032af6d0940 in mmap64() from /lib64/libc.so.6 
#1 0x00000032af66f9cf in new_heap() from /lib64/libc.so.6 
#2 0x00000032af673515 in _int_malloc() from /lib64/libc.so.6 
#3 0x00000032af674cde in malloc() from /lib64/libc.so.6 

malloc 함수는 5060 바이트로 호출했지만 malloc에가) (new_heap 호출 왜의 mmap의 크기가 134217728. 호출되었습니다 :

내가 BT 다음의 mmap에 breaked 발견?

+0

malloc()은 "작은"할당을 위해 새로운 힙을 생성합니다. malloc 구현에 따라 다른 할당 크기에 대해 다른 힙을 얻을 수 있습니다 (예 : 4096 ~ 8092 바이트 사이의 malloc() 호출 용, 10 ~ 20MB 사이의 할당 용 다른 바이트 ...). 다른 mmap() 호출에 대한 백 트레이스를 확인하고 할당 크기를 확인할 수 있습니까? – oliver

+0

또한 작은 할당을 많이하면 어쩌면 힙이 조각화되어 메모리 낭비가 될 수 있습니까? 작은 할당으로 malloc() 및 free() 호출 수를 확인할 수 있습니까? 또한 개요는 http://stackoverflow.com/questions/3770457/what-is-memory-fragmentation을 참조하십시오. – oliver

답변

0

프로세스에 GDB를 연결하고 mmap()에 조건부 중단 점을 설정할 수 있습니다. 그것은 거대한 할당에 대한 역 추적을 줄 것입니다.

+0

좋아, 이것을 시도하지만 내 코드는 직접 mmap을 어디서나 호출하지 않습니다. 내 힙이 그렇게 크지 않고 malloc이 큰 크기로 호출되지 않는다는 것이 놀랍습니다. 그렇다면 내 기억은 어디로 가고 있을까요? –