Linux获取进程内存命令
1、top
top -o %MEM | grep 服务名
2、cat /proc/meminfo
/proc/meminfo是了解Linux系统内存使用状况的主要接口,我们最常用的”free”、”vmstat”等命令就是通过它获取数据的。/proc/meminfo所包含的信息比”free”等命令要丰富得多,但也很复杂,感兴趣的话可以看看这篇文章:http://linuxperf.com/?p=142,对 /proc/meminfo 有较详细的解释。
3、ps aux命令
ps aux 命令可以查看系统中各个进程的运行情况,包括了进程占用的内存,%MEM 列就是各个进程的内存占用百分比。
ps aux --sort=-%mem | head -20 #按照内存大小显示前20个进程
4、free (free 命令中的信息都来自于 /proc/meminfo 文件。见cat /proc/meminfo)
free 命令会显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存等。
释义:
Mem:内存使用情况。 Swap:交换空间(虚拟内存)使用情况。 total:系统总共可用物理内存、交换空间大小。 used:已经被使用的物理内存、交换空间大小。 free:剩余可用物理内存、交换空间大小。 shared:被共享使用的物理内存大小。 buff/cache:被 buffer 和 cache 使用的物理内存大小 available:还可以被应用程序使用的物理内存大小。
Mem行: 显示物理内存情况。
列名 | 含义 |
total | 内存总量 |
used | 使用内存 |
free | 可用内存 |
shared | 共享内存 |
buffers | buffer缓存,可回收 |
cached | cached缓存,可回收 |
-/+buffers/cache行: 显示基于应用角度考虑的内存情况,也可理解为真实的内存使用情况。(计算已使用内存时减去buffers/cache,计算可使用内存时加上buffers/cache。)这里的buffers指Buffer cache(缓冲区缓存),cache指Page cache(页面缓存)。在当前的Linux内核中,Page cache是针对内存页的缓存。也就是说,如果有内存是以page进行分配管理的,都可以使用Page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block),这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。
列名 | 含义 |
used | 实际使用内存 |
free | 实际可用内存 |
Mem行和buffers/cache行的各列计算关系如下:(M代表Mem行,B代表buffers/cache行)
total(M) = used(m) + free(m)
total(M) = used(B) + free(B)
used(M) = used(B) + buffers(M) + cached(M)
free(B) = free(M) + buffers(M) + cached(M)
Swap行: 显示交换空间使用情况,交换空间(swap space)是磁盘上的一块区域,可以是一个分区,也可以是一个文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务。而当系统需要访问swap上存储的内容时,再将swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。
列名 | 含义 |
used | 实际使用内存 |
free | 实际可用内存 |
常见用法:
free -k:按照g的计数方式来显示内存信息。
free -m:按照m的计数方式来显示内存信息。
free -g:按照g的计数方式来显示内存信息。
free -t:按照总和的形式显示内存的使用信息。
free -s 5:周期性展示内存使用情况,意思为每隔5秒统计展示,直到我们按下ctrl +c 键取消统计为止。
free -s 2 -c 4:周期性展示统计内存信息。本篇实例为每隔2秒统计一次,统计4次。
free -V:查看版本信息
内存使用率 -- 结果需要进行运算
free | egrep 'Mem' | awk \ '{print $2,$4}\'
5、vmstat命令
vmstat 是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控,是对系统的整体情况进行的统计。
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒中断数,包括时钟中断。【interrupt】
cs: 每秒上下文切换数。 【count/second】
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间
常见用法:
vmstat 1 //每隔1s打印一次
vmstat 1 5 //每隔1秒打印一次,打印五次
vmstat -s //显示内存相关统计信息及多种系统活动数量
6、sar命令
sar 命令用于收集和报告系统活动详细信息。(注:如果使用以下命令提示无法找到该命令可以使用”yum install sysstat“来安装)
sar -r
shell进程内存监控脚本:定时获取相关进程内存大小写入filename.csv文件。
#!/bin/sh
PROC_NAME=$1
LOG_FILE=$2
DATE=`date +%Y-%m-%d_%H-%M-%S`
if [ -z $PROC_NAME ]; then
echo "Please enter parameters !!"
echo "USAGE:"
echo " arg[0] = process name"
echo "EXAMPLE:"
echo " Display name and pid : detect_mem.sh \${NAME} | grep \${PID}"
echo " Display different : detect_mem.sh \${NAME} | grep \'\${PID}.*[+-]\'"
echo ""
exit 1;
fi
PROC_PID=`pgrep ${PROC_NAME}`
if [ -z $LOG_FILE ]; then
#LOG_FILE=$PWD/mem_${DATE}_${PROC_NAME}.csv
LOG_FILE=/tmp/mem_${DATE}_${PROC_NAME}.csv
fi
echo "Pid,Time,VmSize(KB),VmRSS(KB)" > $LOG_FILE
while true; do
for p in ${PROC_PID}; do
MEMERY_VmSize=`cat /proc/${p}/status | grep VmSize | awk -F':' '{print $2}' | awk '{print $1}'`
MEMERY_VmRSS=`cat /proc/${p}/status | grep VmRSS | awk -F':' '{print $2}' | awk '{print $1}'`
MEMERY_VmData=`cat /proc/${p}/status | grep VmData | awk -F':' '{print $2}' | awk '{print $1}'`
DATE=`date +%Y-%m-%d_%H\:%M\:%S`
# Size
eval TMP_VAL='$'"LAST_VmSize_$p"
if [ -z ${TMP_VAL} ]; then
eval LAST_VmSize_$p=${MEMERY_VmSize}
TMP_VAL=${MEMERY_VmSize}
fi
# RSS
eval TMP_VAL='$'"LAST_VmRss_$p"
if [ -z ${TMP_VAL} ]; then
eval LAST_VmRss_$p=${MEMERY_VmRSS}
TMP_VAL=${MEMERY_VmRSS}
fi
DIFF_VmRSS='?'
if [ ${MEMERY_VmRSS} -gt ${TMP_VAL} ]; then
DIFF_VmRSS='+'`expr ${MEMERY_VmRSS} - ${TMP_VAL}`
elif [ ${MEMERY_VmRSS} -eq ${TMP_VAL} ]; then
DIFF_VmRSS='='
else
DIFF_VmRSS='-'`expr ${TMP_VAL} - ${MEMERY_VmRSS}`
fi
eval TMP_VAL='$'"LAST_VmData_$p"
if [ -z '$'"LAST_VmData_$p" ]; then
eval LAST_VmData_$p=${MEMERY_VmData}
TMP_VAL=${MEMERY_VmData}
fi
echo "<${DATE}> Pid:${p}, VmSize:${MEMERY_VmSize}KB, VmRSS:${MEMERY_VmRSS}KB(${DIFF_VmRSS}), VmData:${MEMERY_VmData}KB"
echo "${p},${DATE},${MEMERY_VmSize},${MEMERY_VmRSS}" >> $LOG_FILE
eval LAST_VmSize_$p=${MEMERY_VmSize}
eval LAST_VmRss_$p=${MEMERY_VmRSS}
eval LAST_VmData_$p=${MEMERY_VmData}
done
sleep 5s
done