Linux系统内存监控常用命令

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值