項目代碼開發工作完成,開始代碼測試階段。功能基本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~