利用strace和pmap分析进程中做的内存分配的线程
1) 增加crontab规则,定时采集进程内存状态数据, 此处以nscd进程为例。
在crontab中%前要加\转义, 此处是每分钟采样一次,实际如果内存变化缓慢,可以改成每小时或其它间隔时间。
crontab -u root -e
*/1 * * * * pid=$(pidof nscd); cat /proc/${pid}/smaps >/root/temp/test_strace/smaps/smaps_${pid}_$(date +\%Y\%m\%d\%H\%M);
可以用各种工具查看和对比保存后的数据:
1.1) 查看一共有多少内存地址区间
cd /root/temp/test_strace/smaps/
grep -E "^[0-9a-f]" smaps_1085_202004091306 | wc -l
1.2) diff 对比不同时间的smaps采样,观察内存的变化
2) strace 跟踪运行中的进程的系统调用,特别关注mmap,munmap,brk等与内存分配有关的系统调用。
2.1) strace -tt -T -f -p $(pidof nscd)
可以看到每个子线程中的系统调用
linux-d4xo-2:~/temp/test_strace/strace # strace -tt -T -f -p $(pidof nscd)
Process 1085 attached with 11 threads
[pid 1096] 13:48:03.024655 futex(0x55697dd13824, FUTEX_WAIT_PRIVATE, 42469, NULL) = -1 EAGAIN (Resource temporarily unavailable) <0.000030>
[pid 1096