Linux内存查看通用方法
目录
linux查看内存通用命令
命令1:free -h
命令2:cat /proc/PID/status
命令3:cat /proc/PID/maps
命令4:cat /proc/PID/smaps
对于内存的检测提供两个脚本方案:
对全部进程进行内存统计
对特定模块进行内存统计
linux查看内存通用命令
命令1:free -h
输出结果如下:
描述信息分为两行,Mem(内存相关描述)和Swap(交换分区相关描述)。通常在嵌入式上不使用Swap分区,所以不进行论述
项目名 |
数值 |
意义 |
Total |
1.2G |
系统物理内存总量 1.2G |
Used |
769M |
表示总计分配给缓存(包含buffers与cach)使用的大小为769M,但其中可能有部分缓存并未实际使用。 |
Free |
347M |
系统剩余总量347M |
Shared |
12M |
共享内存12M |
Buff/cache |
137M |
统称缓冲区137M,区别如下:写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘。磁盘读出后,暂留在缓冲区(cache),为后续程序的使用做准备。 |
available |
405M |
Free是指真正未使用的物理内存量,available是从程序角度可以看到的可用的内存数量。程序角度认为,未使用的内存和缓冲区都可以用来使用,所以理论上available=free+buff+cache,但这是一个理想的计算方法。实际上会有一些偏差 |
通常,需要使用free -h命令对整体内存进行判断。如果free一直在下降或used一直在上升则认为内存存在泄漏。
命令2:cat /proc/PID/status
输出结果如下:
Status下会有很多进程描述信息,但对于内存仅需要关注红框中内容即可
项目名 |
数值 |
意义 |
VmPeak |
399256kB |
是当前进程使用的虚拟内存的峰值 |
VmSize |
333860kB |
是当前进程实时的虚拟内存使用情况 |
VmHWM |
7628kB |
是当前进程使用的物理内存的峰值 |
VmRSS |
7628kB |
是当前进程实时的物理内存使用情况 |
RssAnon |
4692kB |
当前进程使用的匿名内存大小 |
RssFile |
2936kB |
当前进程文件使用内存大小 |
RssShmem |
0kB |
当前进程共享内存大小 |
VmData |
67056kB |
是当前进程数据段的大小 |
VmStk |
132kB |
是当前进程堆栈段的大小 |
VmExe |
8kB |
是当前进程代码段的大小 |
VmLib |
4472kB |
是当前进程使用的LIB库的大小 |
针对内存问题的检证,首先要确认VmSize和VmRSS的变化情况确认来是否有内存泄漏。如果出现泄漏则需要观察其他项目来判断是哪里出现了问题。
命令3:cat /proc/PID/maps
首先,要理解在Linux上,系统会对每个进行分配8G(默认设定)的虚拟空间。本命令是对当前进程的虚拟内存的具体分配结果(简略信息)。
输出的结果中会包含栈信息,堆信息,已经使用了哪些库。如下图。
命令4:cat /proc/PID/smaps
本命令是对命令3 的详细描述,会对每一具体分配段进行详细的数据展开,如下图
对于每一段的数据都会有上图所示信息,但仅需要关注红框部分信息即可,有四个关键字段 Rss 和Pss ,shared 和Private
项目名 |
数值 |
意义 |
Rss |
8kB |
是进程的物理内存占用,包括进程本身和所有链接库,RSS = private + share |
Pss |
8kB |
链接库的共享内存平摊计算后的使用内存,(比如一个动态库有5个人引用,则将其代码段和共享内存除于5),PSS = private + share |
Shared_Clean |
0kB |
和其他进程共享的未改写页面 |
Shared_Dirty |
0kB |
和其他进程共享的已改写页面 |
Private_Clean |
0kB |
未改写的私有页面页面 |
Private_Dirty |
8kB |
已改写的私有页面页面 |
其中: private = private_clean + private_dirty: 这个数据一般能够比较准确反映一个进程内部占用的内存,在内存优化的时候使用这个作为参考值比较合理,进程的物理内存占用就是smaps中所有的private的相加(链接的动态库的也要统计进去)。
仅仅你自己使用的库 是属于Private的,如果别人也用这个库 则是属于Shared。当然你的代码如果链接给别人,也是属于Shared。
所以想要得到确定的内存使用量,将/proc/PID/smap中的所有Private_Clean和Private_Dirty累加起来,是很好的解决方案
对于内存的检测提供两个脚本方案:
对全部进程进行内存统计
检测全部进程内存量的脚本,(输出时通过 ] 符号进行分割,方便用excel进行分列数据统计)
#!/bin/basha=1echo "8 > /proc/sys/kernel/printk"
while [ $a -eq 1 ];doecho "########################"
echo `date "+%Y-%m-%d %H:%M:%S"`echo "free"
free -hfor pid in `ls -1 /proc/ | egrep "[[:digit:]]"`;
do if [ -f "/proc/$pid/status" ]; then proc_name=`grep '^Name' /proc/$pid/status | awk '{print $2}'`; mem_VmPeak=`grep '^VmPeak' /proc/$pid/status | awk '{print $2}'`; mem_VmRSS=`grep '^VmRSS' /proc/$pid/status | awk '{print $2}'`;mem_VmSize=`grep '^VmSize' /proc/$pid/status | awk '{print $2}'`;mem_VmData=`grep '^VmData' /proc/$pid/status | awk '{print $2}'`;if [[ $mem_VmPeak != "" ]]; then echo "]$proc_name] VmPeak : ]$mem_VmPeak] kB VmRSS : ]$mem_VmRSS] kB VmSize : ]$mem_VmSize] kB VmData : ]$mem_VmData] kB";fifidoneecho "########################"sleep 30sdone
对特定模块进行内存统计
当确认是某一个模块的问题时,在通过下面的脚本对单独的模块进行内存统计
(下面的脚本中替换loggmr为想调查的进程名即可)
#!/bin/bash
while [ 1 -eq 1 ];do
echo "########################"
echo `date "+%Y-%m-%d %H:%M:%S"`
free
pid=$(ps -aux |grep logmgr|head -n 1|awk '{print $2}')
echo "++++++++++++++++++++"
echo RssSum_SUM:`cat /proc/$pid/smaps |grep Rss|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo PssSum_SUM:`cat /proc/$pid/smaps |grep Pss|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Shared_Clean_SUM:`cat /proc/$pid/smaps |grep Shared_Clean|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Shared_Dirty_SUM:`cat /proc/$pid/smaps |grep Shared_Dirty|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Private_Clean_SUM:`cat /proc/$pid/smaps |grep Private_Clean|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Private_Dirty_SUM:`cat /proc/$pid/smaps |grep Private_Dirty|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo "-----------------------"
cat /proc/$pid/statussleep 30s
done
Linux内存查看通用方法相关推荐
- linux cpu uuid 查看,Linux下查看UUID方法介绍
Linux下查看UUID方法介绍. 1. sudo blkid /dev/sda1: UUID="9ADAAB4DDAAB250B" TYPE="ntfs" / ...
- Linux内存泄漏检测方法总结
Linux内存泄漏检测方法总结 一.mtrace分析内存泄露 mtrace原理 设置日志生成路径 测试实例 日志 泄露分析 使用addr2line工具定位源码位置 使用mtrace工具分析日志信息 二 ...
- linux日志查看常见方法
linux日志查看常见方法 作为一个常年的码农,常年与日志打交道,我自己常用的日志就有各种linux访问日志,php错误日志,nginx访问日志,mysql慢日志- 那么日志是如何查看与分析呢?这里的 ...
- Linux下查看网关方法
Linux下查看网关方法:1.route -n2.ip route show3.traceroute www.prudentwoo.com -s 100 [第一行就是自己的网关]4.netstat - ...
- Linux下查看网关方法:
Linux下查看网关方法: route -n ip route show traceroute www.prudentwoo.com -s 100 第一行就是自己的默认网关 netstat -r ca ...
- linux内存泄漏通用排查方法
一. 概述 Linux下经常遇到内存泄漏的问题,尤其对C/C++开发人员来说是一个亘古不变的话题,现在介绍解决Linux内存泄漏问题的方法层出不穷,让人眼花缭乱,但是作为开发人员应该从本质上了解为 ...
- Linux内存手动释放方法
Linux服务器内存释放在有些人看起来好像可以提高不少的效率,但是它实际的工作效果并不是很理想,这里我们说一下如何进行这份工作,帮助我们更好的去理解Linux系统的工作方式. 大众释放内存方法 1. ...
- linux电脑内存查看工具,Linux内存查看工具---Smem
物理内存不足对Linux桌面系统和服务器系统的性能影响都很大.当你的计算机变慢时,要做的第一件事就是释放内存.尤其是在多用户环境以及执行关键任务的服务器环境下,内存消耗会变得更加关键,因为多个用户和应 ...
- linux 内存查看 kvm,Linux虚拟化KVM-Qemu分析(五)之内存虚拟化
原标题:Linux虚拟化KVM-Qemu分析(五)之内存虚拟化 背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousa ...
- linux查看内核启动信息log,Linux内核查看log方法
1 printk()打印内核消息. 2 管理内核内存的daemon(守护进程) Linux系统当中最流行的日志记录器是Sysklogd,Sysklogd 日志记录器由两个守护进程(klogd sysl ...
最新文章
- php留言板只能留言一次,php如何实现留言板修改留言
- 实用线性代数和凸优化 Convex Optimization
- MySql第几行到第几行语句
- 模拟IE登录一个需要(windows身份)验证的网站
- mysql 聚簇索引和非聚簇索引_MySQL学习之——索引
- 一个大胖鲸-Docker(2):简单的几个docker命令
- 使用python连接kafka
- 支付宝上线小程序,外国人来中国旅游再也不用烦恼了
- python函数isdisjoint方法_Python中的isdisjoint()函数
- 图片横向滚动,两边有按钮控制
- 深入浅出SCSI子系统(五)SCSI设备探测
- 单片机第1季:零基础学51单片机-蜂鸣器介绍
- 迅雷调用Potplayer边下边播
- 人工智能基础——知识的表示方法,产生式表示法
- virtualbox安装androidx86进入console控制台,不能进入启动界面,卡死在detecting android-x86 found at /dev/sda1
- Allegro Cadence 视频教程+信号完整性
- python京东自动签到_利用python Selenium实现自动登陆京东签到领金币功能
- 计算机软件过期黑屏怎么办,Adobe flashplayer过期怎么办
- 二进制“<”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换
- 周志华机器学习--绪论