Linux 内存分析

Linux 内存分析 2023-12-06 11:31:01 838

1 内存信息

分析内存之前,我们得知道怎么查看系统内存信息,有以下几种方法。

1.1 /proc/meminfo

这个文件记录着比较详细的内存配置信息,使用下面命令查看:

cat /proc/meminfo

我们比较关心的是下面几个字段:

  • MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 8G,但其实显示只有 7.72G。
  • MemFree:系统空闲内存。
  • MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
  • Buffers:缓冲区内存
  • Cached:缓存

上面信息没有 MemUsed 的值,虽然可以用现有的值大致估算出来,但是我们想一步到位,就用下面的 free 命令。

1.2 free

这个命令估计用的人就多了(我一般都是用这个命令)。

这里存在一个计算公式:

MemTotal = used + free + buff/cache(单位 K)

几个字段和上面 /proc/meminfo 的字段是对应的。还有个 shared 字段,这个是多进程的共享内存空间,不常用。

我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。

要看比较直观的值,可以加 -h 参数:

1.3 dmidecode

同样可以使用这个命令,对于内存,可以使用如下命令查看:

dmidecode -t memory

从截图可以看出,我这是两块内存条,每块内存条的大小都是4G。注意:dmidecode命令需要root权限。

1.4 vmstat

这个命令也是非常常用了。但对于内存,显示信息有限。它更多是用于进行系统全局分析和 CPU 分析。注意下面命令后面的参数是数字1。

2 进程内存使用情况分析

最常用的两个命令 ps 和 top。

2.1 top/htop

top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认,然后按“q”退出编辑界面即可。

可以看到,我按照 “%MEM” 排序的结果。这个结果对于查看系统占用内存较多的那些进程是比较有用的。

然后这里我们会重点关注几个地方,上面横排区,和前面几个命令一样可以查看系统内存信息,中间标注的横条部分,和内存相关的有三个字段:VIRT、RES、SHR。

  • VIRT:virtual memory usage,进程占用的虚拟内存大小。
  • RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
  • SHR:shared memory,共享内存大小,不常用。

2.2 ps

ps 同样可以查看进程占用内存情况,一般常用来查看 Top n 进程占用内存情况,如:

ps aux --sort=rss | head -n

表示按 rss 排序,取 Top n。

这里也关注三个字段:

  • %MEM:进程使用物理内存所占百分比。
  • VSZ:进程使用虚拟内存大小。
  • RSS:进程使用物理内存大小,我们会重点关注这个值。

2.3 pmap

这个命令用于查看进程的内存映像信息,能够查看进程在哪些地方用了多少内存。常用下面命令查看

pmap -x [pid]

可以看到该进程内存被哪些库、哪些文件所占用,据此,我们可以定位程序对内存的使用。

几个字段介绍一下:

  • Address:占用内存的文件的内存起始地址。
  • Kbytes:占用内存的字节数。
  • RSS:实际占用内存大小。
  • Dirty:脏页大小。
  • Mapping:占用内存的文件,[anon] 为已分配的内存,[stack] 为程序堆栈

最后的 total 为统计的总值。我们可以使用 pmap -x pid | tail -1 这样只显示最后一行,循环显示最后一行,达到监控该进程的目的。使用:

while true; do pmap -x pid | tail -1; sleep 1; done

3 注意

前面提到的信息查看和分析方法,在x86的Linux系统上比较容易支持,默认不支持的命令根据提示安装即可。如果要在arm linux系统上使用,比如rv1126,就需要编译整包的时候将需要用到的分析工具配置上,默认为了减少固件大小,很多工具是没有配置上的,或者是一些工具即使配置上了,但是参数不全。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 1 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区