项目代码开发工作完成,开始代码测试阶段。功能基本ok,测试性能时,发现进程会定时‘吃掉’8k内存。
1.top -Hp 进程Id
top -Hp 2281
top - 12:50:28 up 23 days, 2:30, 22 users, load average: 0.11, 0.20, 0.22
Tasks: 4 total, 0 running, 4 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.4%us, 0.2%sy, 0.0%ni, 98.9%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32937632k total, 1437780k used, 31499852k free, 415048k buffers
Swap: 9409880k total, 53544k used, 9356336k free, 207916k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2281 d5000 15 0 82336 3872 2464 S 0 0.0 0:00.01 response_sync_s
2286 d5000 18 0 82336 3872 2464 S 0 0.0 0:00.00 response_sync_s
2290 d5000 18 0 82336 3872 2464 S 0 0.0 0:00.00 response_sync_s
2294 d5000 18 0 82336 3872 2464 S 0 0.0 0:00.00 response_sync_s
发现 VIRT 和RES每个一段时间就增加8k。我的内存就这样无情的被吃掉了。
2.排查代码(多线程,逐个排查,定位到单个线程后,该线程是每隔5秒钟汇报下进程使用cup及内存使用率,调用系统管理一函数导致。找系统管理组同事,寻求帮助,定位排查发下,fopen()文件后并没有及时fclose。并用lsof -p 进程pid 进行验证,确实发现进程打开大量文件,并每隔一段时间都会增加打开的文件数。修改代码,再次测试,ok~