使用 systemctl 和 top 命令查询 libvirtd 服务占用内存不同
问题描述
使用 systemctl 和 systemd-cgtop 命令查询 libvirtd 服务占用内存超 1.5G,而使用 top 命令查询 libvirtd 服务占用内存仅 70M 左右。
原因分析
systemd 管理的服务(包括 systemctl 和 systemd-cgtop)中显示的内存通过查询 CGroup 对应的 memory.usage_in_bytes 得到。top 是直接统计 /proc 下内存相关信息计算得出。两者的统计方法不同,不能直接比较。
一般来说,业务进程使用的内存主要有以下几种情况:
- anon_rss:用户空间的匿名映射页(Anonymous pages in User Mode address spaces),比如调用 malloc 分配的内存,以及使用 MAP_ANONYMOUS 的 mmap。当系统内存不够时,内核可以将这部分内存交换出去。
- file_rss:用户空间的文件映射页(Mapped pages in User Mode address spaces),包含 map file 和 map tmpfs,前者比如指定文件的 mmap,后者比如 IPC 共享内存。当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据。
- file_cache:文件缓存(page in page cache of disk file),发生在程序通过普通的读写(read/write)文件时。当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据。
- buffer pages:属于 page cache,比如读取块设备文件时的相关缓存。
其中 anon_rss 和 file_rss 属于进程的 RSS,file_cache 和 buffer pages 属于 page cache。简单来说:
top 里的 RSS = anon_rss + file_rss,SHR = file_rss。
CGroup 里的 memory.usage_in_bytes = cache + RSS + swap。
由上可知,syestemd 相关命令和 top 命令的内存占用率含义不同,所以查询结果不同。