【文章前言】
粗略解读了下【systemctl】和【ps -aux】所输出的内存使用情况有那么大的差距,并进一度了解RSS等进程内存知识。
我最近在写一个go程序的小demo,结果发现go程序占用内存太大了,尝试减低内存占用情况,结果发现…………
针对同一个进程id服务,查看其内存占用情况
而ps -aux查看
其中字段信息解析
-
总虚拟内存:包含总虚拟内存、这里为1430116KB,约1.37G
-
驻留集大小(RSS):进程已装入内存的页面的集合,也就是分配内存未释放的一部分,正在使用的,这里为31508KB,约为30.76MB(真实使用内存情况)
【回归正题,为什么这两者查看内存时,会显示不一样?】
主要是systemctl 和ps -aux计算方式不一样!!!
-
systemctl:它通过查询CGroup对应的memory.usage_in_bytes来获取内存使用情况。这个值等于cache + RSS + swap。systemctl显示的内存使用情况包括了服务使用的所有内存,包括堆内存、栈内存、页缓存等。
-
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