일 (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 발견?
malloc()은 "작은"할당을 위해 새로운 힙을 생성합니다. malloc 구현에 따라 다른 할당 크기에 대해 다른 힙을 얻을 수 있습니다 (예 : 4096 ~ 8092 바이트 사이의 malloc() 호출 용, 10 ~ 20MB 사이의 할당 용 다른 바이트 ...). 다른 mmap() 호출에 대한 백 트레이스를 확인하고 할당 크기를 확인할 수 있습니까? – oliver
또한 작은 할당을 많이하면 어쩌면 힙이 조각화되어 메모리 낭비가 될 수 있습니까? 작은 할당으로 malloc() 및 free() 호출 수를 확인할 수 있습니까? 또한 개요는 http://stackoverflow.com/questions/3770457/what-is-memory-fragmentation을 참조하십시오. – oliver