질문에 대한 그의 대답에는Linux에서 proc 파일 시스템은 얼마나 자주 업데이트됩니까?,조나단 벤 아브라함/proc/.../statm
읽으면 커널 콜백이 직접 트리거되므로 읽는 동안 최신 상태임을 나타냅니다 .
이러한 커널 콜백이 읽은 데이터는 어떻습니까? 이것이 항상 사실입니까, 아니면 malloc/new가 요청한 메모리와 측정을 가능하게 하는 커널 사이에 약간의 시간 지연이 있습니까 /proc/.../statm
?
malloc
전달되거나 할당된 개체의 현재 크기를 측정하는 방법을 찾으려고 합니다 new
.
일부 데이터를 할당하는 작은 테스트 프로그램을 실행하면 /proc/.../statm
호출이나 호출 모두 sbrk()
프로세스에서 할당한 메모리 양과 직접적인 관련이 없는 것 같습니다.
정확한 정보를 얻을 수 있는 방법은 없을까요?
프로그램은 64KB 및 128KB 블록을 할당합니다.
$ ./a.out
MALLOC TEST. Size = 131072
0 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1083 201 173 2 0 341 0
1 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1083 211 182 2 0 341 0
2 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1116 215 185 2 0 374 0
3 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1149 216 185 2 0 407 0
4 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1182 217 185 2 0 440 0
5 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1215 218 185 2 0 473 0
6 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1248 219 185 2 0 506 0
7 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1281 220 185 2 0 539 0
8 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1314 221 185 2 0 572 0
9 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1347 222 185 2 0 605 0
$ ./a.out
MALLOC TEST. Size = 65536
0 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1067 201 174 2 0 325 0
1 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1067 211 182 2 0 325 0
2 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1067 215 185 2 0 325 0
3 ALLOC: HEAP SIZE: 196608 MEMORY USAGE (statm): 1115 216 185 2 0 373 0
4 ALLOC: HEAP SIZE: 196608 MEMORY USAGE (statm): 1115 217 185 2 0 373 0
5 ALLOC: HEAP SIZE: 196608 MEMORY USAGE (statm): 1115 218 185 2 0 373 0
6 ALLOC: HEAP SIZE: 393216 MEMORY USAGE (statm): 1163 219 185 2 0 421 0
7 ALLOC: HEAP SIZE: 393216 MEMORY USAGE (statm): 1163 220 185 2 0 421 0
8 ALLOC: HEAP SIZE: 393216 MEMORY USAGE (statm): 1163 221 185 2 0 421 0
9 ALLOC: HEAP SIZE: 589824 MEMORY USAGE (statm): 1211 222 185 2 0 469 0
테스트 프로그램
class CfgProfileList
{
public:
bool obtainSystemProfileList();
void leakTest();
void leakObjTest();
std::set<std::string> mProfileList;
private:
char dummy[1024 * 1024]; // use up some space
};
class ComUtil
{
public:
static void printMemoryUsage();
private:
static unsigned int mHeapOrigin;
};
/* static */
unsigned int ComUtil::mHeapOrigin = 0;
// Print current process memory utilization
/* static */ void
ComUtil::printMemoryUsage()
{
unsigned int pHeap = (unsigned int)sbrk(0);
if (mHeapOrigin == 0)
mHeapOrigin = pHeap;
printf("HEAP SIZE: %u\t", pHeap - mHeapOrigin);
char fname[256], line[256];
sprintf(fname, "/proc/%d/statm", getpid());
FILE *pFile = fopen(fname, "r");
if (!pFile)
return;
fgets(line, 255, pFile);
fclose(pFile);
printf("MEMORY USAGE (statm): %s", line);
}
void
CfgProfileList::leakTest()
{
char *pointerList[50];
int n = 10;
int sleep = 1;
int size = 64 * 1024;
printf("MALLOC TEST. Size = %d\n", size);
for (int i = 0; i < n; i++)
{
pointerList[i] = (char *)malloc(size);
printf("%d ALLOC: ", i);
ComUtil::printMemoryUsage();
usleep(sleep);
}
}
int
main(int argc, char **argv)
{
CfgProfileList pl;
pl.leakTest();
}
답변1
귀하의 추적은 기본적으로 괜찮은 것 같습니다... (귀하의 코드에서 측정할 수 없는 초기 힙이 있다는 것을 기억하십시오.)
MALLOC TEST. Size = 131072
여기서는 128KB 블록을 할당하므로 할당자가 sbrk()
아직 사용되지 않을 수 있습니다 mmap()
.
0 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1083 201 173 2 0 341 0
1 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1083 211 182 2 0 341 0
이상합니다. 힙은 늘어났지만 프로그램 페이지는 그렇지 않았습니다.
2 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1116 215 185 2 0 374 0
3 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1149 216 185 2 0 407 0
4 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1182 217 185 2 0 440 0
5 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1215 218 185 2 0 473 0
6 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1248 219 185 2 0 506 0
7 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1281 220 185 2 0 539 0
8 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1314 221 185 2 0 572 0
9 ALLOC: HEAP SIZE: 135168 MEMORY USAGE (statm): 1347 222 185 2 0 605 0
여기서 각 할당은 힙에서 추가로 33페이지 또는 132KB를 차지하므로 모든 것이 정상입니다.
MALLOC TEST. Size = 65536
0 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1067 201 174 2 0 325 0
1 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1067 211 182 2 0 325 0
2 ALLOC: HEAP SIZE: 0 MEMORY USAGE (statm): 1067 215 185 2 0 325 0
여기서 할당은 초기 힙에 맞습니다.
3 ALLOC: HEAP SIZE: 196608 MEMORY USAGE (statm): 1115 216 185 2 0 373 0
4 ALLOC: HEAP SIZE: 196608 MEMORY USAGE (statm): 1115 217 185 2 0 373 0
5 ALLOC: HEAP SIZE: 196608 MEMORY USAGE (statm): 1115 218 185 2 0 373 0
힙은 192KB 증가하여 할당된 페이지와 일치하고 3개의 할당에 적합합니다.
6 ALLOC: HEAP SIZE: 393216 MEMORY USAGE (statm): 1163 219 185 2 0 421 0
7 ALLOC: HEAP SIZE: 393216 MEMORY USAGE (statm): 1163 220 185 2 0 421 0
8 ALLOC: HEAP SIZE: 393216 MEMORY USAGE (statm): 1163 221 185 2 0 421 0
또 똑같아...
9 ALLOC: HEAP SIZE: 589824 MEMORY USAGE (statm): 1211 222 185 2 0 469 0
...그리고 다시.
함께 달리면 strace -e brk,mmap
사물을 이해하는 데 도움이 됩니다. sbrk()
제공된 정보는 /proc
정확합니다.