本文首发于个人公众号 CloudDeveloper(ID: cloud_dev),专一于干货分享,号内有大量书籍和视频资源,后台回复 「1024」便可领取,欢迎你们关注,二维码文末能够扫。
前面咱们已经学习了 CPU 篇,这篇来看下内存篇。算法
一样在分析内存以前,咱们得知到怎么查看系统内存信息,有如下几种方法。编程
这个文件记录着比较详细的内存配置信息,使用 cat /proc/meminfo
查看。缓存
咱们比较关心的是下面几个字段:网络
上面信息没有 MemUsed 的值,虽然能够用现有的值大体估算出来,可是咱们想一步到位,就用下面的 free 命令。app
这个命令估计用的人就多了(我通常都是用这个命令)。ide
这里存在一个计算公式:工具
MemTotal = used + free + buff/cache(单位 K)
几个字段和上面 /proc/meminfo
的字段是对应的。还有个 shared
字段,这个是多进程的共享内存空间,不经常使用。学习
咱们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来作系统缓存和缓冲区,提升数据读写的速率。可是当系统内存不足时,buff/cache 会让出部分来,很是灵活的操做。云计算
要看比较直观的值,能够加 -h 参数:spa
一样可使用这个命令,对于内存,可使用 dmidecode -t memory
查看:
这个命令也是很是经常使用了。但对于内存,显示信息有限。它更可能是用于进行系统全局分析和 CPU 分析。详细能够看 CPU 分析一文。
最经常使用的两个命令 ps 和 top,虽然很简单的两个命令,但仍是有很多学问的。
top 命令运行时默认是按照 CPU 利用率进行排序的,若是要按照内存排序,该怎么操做呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另一种是在键入 top 以后,按下 “F”,而后选择要排序的字段,再按下 “s” 确认便可。
能够看到,我按照 “%MEM” 排序的结果。这个结果对于查看系统占用内存较多的哪些进程是比较有用的。
而后这里咱们会重点关注几个地方,上面横排区,和前面几个命令同样能够查看系统内存信息,中间标注的横条部分,和内存相关的有三个字段:VIRT、RES、SHR。
ps 一样能够查看进程占用内存状况,通常经常使用来查看 Top n 进程占用内存状况,如:ps aux --sort=rss | head -n
,表示按 rss 排序,取 Top n。
这里也关注三个字段:
这个命令用于查看进程的内存映像信息,可以查看进程在哪些地方用了多少内存。 经常使用 pmap -x pid
来查看。
能够看到该进程内存被哪些库、哪些文件所占用,据此咱们定位程序对内存的使用。
几个字段介绍一下:
最后的 total 为统计的总值。咱们可使用 pmap -x pid | tail -1
这样只显示最后一行,循环显示最后一行,达到监控该进程的目的。使用:
while true; do pmap -x pid | tail -1; sleep 1; done
OK,以上工具都是 Linux 自带的,固然还有不少高阶的工具,好比 atop、memstat 等等,对于内存泄漏有一个比较经常使用的检测工具 Valgrind,更多干货能够关注个人公众号。
经过以上手段,咱们基本上就能定位内存问题所在了,到底是内存过小,仍是进程占用内存太多,有哪些进程占用较多,这些进程又究竟有哪些地方占用较多,这些问题经过以上方法都能解决。
最后简单总结下,以上很多工具可能有人会犯选择困难症了。对于我来讲,查看系统内存用 free -h,分析进程内存占用用 ps 或者 top(首选 ps),深刻分析选择 pmap,就酱。
参考:
Linux下查看内存使用状况的多种方法 http://stor.51cto.com/art/201...
个人公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复 「1024」便可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎你们关注。