下面记录一个查看某进程内存相关信息的脚本,主要涉及以下几个方面:
- 通过 /proc/pid/status 查看进程的内存占用情况
- 通过 /proc/pid/smaps 查看进程的大页使用情况
- 通过 ps 命令查看进程的 page fault 情况
- 通过 pidstat 命令查看进程的 CPU 使用情况
实现脚本:
#!/bin/bash
pid=`ps -ef |grep main |awk '{if ($8 == "./main") print $2}'`
[ "$pid" == "" ] && echo "Usage: $0 pid" && exit
file=$pid.txxt
cat /dev/null >$file
begin=`date +%s`
idx=0
while [ -f /proc/$pid/status ]
do
now=`date +%s`
diff=$((now-begin))
echo =============================================The $diff-th second\(`date "+%F %X"`\)=============================================
# memory usage
echo "1. memory usage:"
cat /proc/$pid/status |grep Vm
cat /proc/$pid/status |grep Rss
echo ""
# huge page usage
echo "2. huge page usage:"
cat /proc/$pid/smaps |grep -i huge |awk '{if ($2 != 0) print $0}'
echo ""
# normal page uage
echo "3. normal page usage:"
whole=`cat /proc/$pid/status |grep VmRSS |awk '{print $2}'`
hugepage=`cat /proc/$pid/smaps |grep -i huge |awk '{if ($2 != 0) print $2}'`
[ "$hugepage" == "" ] && hugepage=0
normalpage=$((whole-hugepage))
echo "whole:" $whole "KB, hugepage:" $hugepage "KB, normalpage:" $normalpage "KB"
echo "normal page count:" $((normalpage/16))
echo ""
# page fault
echo "4. page fault count:"
ps -o min_flt,maj_flt,cmd,args,uid,gid $pid
echo ""
# use mode process usage
echo "5. user mode process usage:"
pidstat -p $pid 1 1
echo ""
if [ $idx -lt 60 ]; then
sleep 0
else
sleep 10
fi
idx=$((idx+1))
done |tee -a $file
测试程序:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int fab[33];
int i = 0, num;
int *tmp;
fab[0] = 0;
fab[1] = 1;
srand(time(NULL));
num = (rand() % 2021 + 1) << 16;
while (num != 1024) {
for (i = 2; i < 33; ++i) {
fab[i] = fab[i - 1] + fab[i + 2];
}
tmp = malloc(num * sizeof(int));
if (tmp) {
for (i = 0; i < num; ++i) {
tmp[i] = fab[i % 33];
}
free(tmp);
}
num = (rand() % 2021 + 1) << 16;
}
return 0;
}
运行效果:
=============================================The 0-th second(2021-05-22 15时23分05秒)=============================================
1. memory usage:
VmPeak: 532032 kB
VmSize: 408128 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 530208 kB
VmRSS: 383712 kB
VmData: 405760 kB
VmStk: 144 kB
VmExe: 16 kB
VmLib: 2128 kB
VmPTE: 320 kB
VmSwap: 0 kB
RssAnon: 383824 kB
RssFile: 944 kB
RssShmem: 0 kB
2. huge page usage:
AnonHugePages: 327680 kB
3. normal page usage:
whole: 385824 KB, hugepage: 327680 KB, normalpage: 58144 KB
normal page count: 3634
4. page fault count:
MINFL MAJFL CMD COMMAND UID GID
164112 0 ./main ./main 1000 1000
5. user mode process usage:
Linux 4.19.167+ (localhost.localdomain) 2021年05月22日 _mips64_ (4 CPU)
15时23分05秒 UID PID %usr %system %guest %CPU CPU Command
15时23分06秒 1000 11024 91.00 9.00 0.00 100.00 2 main
平均时间: 1000 11024 91.00 9.00 0.00 100.00 - main