systemctl 和 ps -aux之间为什么显示的内存占用不相同?

【文章前言】

        粗略解读了下【systemctl】和【ps -aux】所输出的内存使用情况有那么大的差距,并进一度了解RSS等进程内存知识。

        我最近在写一个go程序的小demo,结果发现go程序占用内存太大了,尝试减低内存占用情况,结果发现…………

针对同一个进程id服务,查看其内存占用情况

而ps -aux查看

其中字段信息解析

  • 总虚拟内存:包含总虚拟内存、这里为1430116KB,约1.37G

  • 驻留集大小(RSS):进程已装入内存的页面的集合,也就是分配内存未释放的一部分,正在使用的,这里为31508KB,约为30.76MB(真实使用内存情况)

【回归正题,为什么这两者查看内存时,会显示不一样?】

主要是systemctl 和ps -aux计算方式不一样!!!

  1. systemctl:它通过查询CGroup对应的memory.usage_in_bytes来获取内存使用情况。这个值等于cache + RSS + swap。systemctl显示的内存使用情况包括了服务使用的所有内存,包括堆内存、栈内存、页缓存等。

  2. Ps -aux :用于显示当前系统中的进程信息。【ps -aux】命令显示的RSS值等于anon_rss + file_rss,SHR值等于file_rss。ps -aux主要关注的是进程的实际物理内存使用情况,不包括页缓存等。

正常情况下,cache + RSS + swap > anon_rss + file_rss,甚至两者之间会相差极大,就像上面那样显示 ,一个是477M,一个是30M。

【知识补充】业务进程中的内存分为几种类型,每一种又代表什么意思

  • 总虚拟内存 (total-vm): 这是进程使用的总的虚拟内存()。

  • 驻留集大小 (RSS): 驻留集是指进程已装入内存的页面的集合。

  • 匿名驻留集 (anon-rss): 这表示没有映射到文件的内存量,即匿名内存。匿名内存通常是进程通过 malloc() 或类似的方法动态分配的内存。如果你 malloc() 大量内存并真正使用它,你的 anon-rss 会很高。

  • 文件驻留集 (file-rss): 这表示映射到设备和文件上的内存量。所以,如果你在 vim 中打开一个大文件,file-rss 会很高,当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据。

如何理解rss呢?

一句话:可以理解为已分配未释放的内存值(正在使用)

  • 驻留集大小 (RSS) 是指进程当前在物理内存中的页面的总和。这些页面包括进程正在使用的所有内存,比如堆、栈以及内存映射等。

  • 举个例子,假设一个进程分配了1GB的内存,但实际上只使用了其中的300MB,那么这个进程的RSS就是300MB。这是因为操作系统只会为进程实际使用的内存分配物理内存,而不是进程请求的全部内存。

page cache

  • file_cache:文件缓存(page in page cache of disk file),普通读写(read/write)文件时产生的文件缓存。当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据。

  • buffer pages:属于page cache,比如读取块设备文件时的相关缓存。

  • RSS = anon_rss + file_rss

Swap,也称为交换分区,是一种利用磁盘空间来扩展内存的方法,Swap的作用类似于Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。

参考材料

  • https://blog.csdn.net/wylfengyujiancheng/article/details/107529412

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值