使用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命令的内存占用率含义不同,所以查询结果不同。