深度系统监视器无法反映 VirtualBox 虚拟机的实际内存占用
Tofloor
poster avatar
duanyao
deepin
2017-09-20 22:40
Author
深度系统监视器对 VirtualBox 虚拟机的内存占用的报告严重偏小,如图,也包括了 atop 的对比:




这个虚拟机分配了 640M 内存,所以 atop的数据应该是对的。

/proc 中的相关数据:

sudo cat /proc/30563/status
Name:    VirtualBox
Umask:    0022
State:    S (sleeping)
Tgid:    30563
Ngid:    0
Pid:    30563
PPid:    20520
TracerPid:    0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize:    128
Groups:    6 7 27 100 107 111 116 121 122 999 1000 1001
NStgid:    30563
NSpid:    30563
NSpgid:    30563
NSsid:    20519
VmPeak:     3124104 kB
VmSize:     3124104 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:      780944 kB
VmRSS:      753328 kB
RssAnon:       47996 kB
RssFile:      700648 kB
RssShmem:        4684 kB
VmData:      172364 kB
VmStk:         132 kB
VmExe:         148 kB
VmLib:      106256 kB
VmPTE:        2336 kB
VmPMD:          24 kB
VmSwap:           0 kB

Reply Favorite View the author
All Replies
avatar
jingle
deepin
2017-09-20 22:59
#1
已经记录了
Reply View the author
avatar
rdlg
deepin
2017-09-21 00:13
#2
计算的方式不一样 一个用的VmRSS 一个用的RSSAnon 不好说那种准确一些
VmRss包含了映射到文件的页面和一些共享库的占用的内存
Reply View the author
avatar
duanyao
deepin
2017-09-21 00:31
#3
https://bbs.deepin.org/post/145783
计算的方式不一样 一个用的VmRSS 一个用的RSSAnon 不好说那种准确一些
VmRss包含了映射到文件的页面和一些 ...

只算 RssAnon 肯定是不准确的,有不少程序用内存映射之类的方式使用内存,VirtualBox 是其中之一。
Reply View the author
avatar
rdlg
deepin
2017-09-21 01:57
#4
https://bbs.deepin.org/post/145783
只算 RssAnon 肯定是不准确的,有不少程序用内存映射之类的方式使用内存,VirtualBox 是其中之一。 ...

确实不准,不过如果加上RssFile会把共享库占用的内存也算进去,所以这些数据只能看看,可能还是手动看map文件比较准确
Reply View the author
avatar
134******40
deepin
2017-09-21 03:00
#5
想获取虚拟机的实际内存占用,是有点困难的,微软系统都无法获取虚拟机的内存占用。因为虚拟机在启动的时候就已经把这部分内存给拿走了。除了能整体监控占用大小,很难获取具体虚拟机占用的大小。
Reply View the author
avatar
duanyao
deepin
2017-09-21 03:45
#6
本帖最后由 duanyao 于 2017-9-20 19:49 编辑
https://bbs.deepin.org/post/145783
确实不准,不过如果加上RssFile会把共享库占用的内存也算进去,所以这些数据只能看看,可能还是手动看map ...

共享库是应该算进去的,唯一的问题是如何在使用共享库的多个进程间分摊。其实照我的看法,不分摊(重复计算)也没关系,我们通常更关心的是内存占用的相对排名。
Reply View the author
avatar
duanyao
deepin
2017-09-21 03:47
#7
https://bbs.deepin.org/post/145783
想获取虚拟机的实际内存占用,是有点困难的,微软系统都无法获取虚拟机的内存占用。因为虚拟机在启动的时候 ...

办法应该是有的,atop 就可以看到虚拟机的内存占用。
Reply View the author
avatar
wangyong
deepin
2017-10-08 17:01
#8
论坛大神多啊。

https://github.com/manateelazycat/deepin-system-monitor/commit/319e7b2e9f8989763ea0c825b47b35b92bfb4ce2 补丁已经修复

原理:
探测每个进程的 cmdline 如果是以 /usr/lib/virtualbox/VirtualBox 开头的,并有 --startvm 参数(代表虚拟机)的,就计算 resident 内存,其他非虚拟机的内容使用 resident - share 的算法

代码参考:
    long getProcessMemory(QString cmdline, long residentMemroy, long shareMemory)
    {
        if (cmdline.startsWith("/usr/lib/virtualbox/VirtualBox") && cmdline.contains("--startvm")) {
            return residentMemroy * sysconf(_SC_PAGESIZE);
        } else {
            return (residentMemroy - shareMemory) * sysconf(_SC_PAGESIZE);
        }
    }

Reply View the author
Comments
ihipop
2017-10-11 21:31
这个workaround是不是有点dirt。。。
avatar
wangyong
deepin
2017-10-08 17:02
#9
https://bbs.deepin.org/post/145783
论坛大神多啊。

https://github.com/manateelazycat/deepin-system-monitor/commit/319e7b2e9f8989763ea0c ...

可能还有其他虚拟机,比如kvm/vmware,欢迎继续盖楼提这些虚拟机的bug. ;)
Reply View the author
avatar
duanyao
deepin
2017-10-11 19:06
#10
https://bbs.deepin.org/post/145783
论坛大神多啊。

https://github.com/manateelazycat/deepin-system-monitor/commit/319e7b2e9f8989763ea0c ...

VirtualBox 的内存映射大部分是到 /dev/zero 的,这可以作为一个特点:


  1. $ sudo cat /proc/9497/maps
  2. 00400000-00425000 r-xp 00000000 08:06 276734                             /usr/lib/virtualbox/VirtualBox
  3. 00624000-00625000 r--p 00024000 08:06 276734                             /usr/lib/virtualbox/VirtualBox
  4. 00625000-00626000 rw-p 00025000 08:06 276734                             /usr/lib/virtualbox/VirtualBox

  5. 7fc26cc00000-7fc26ce00000 rw-s 00000000 00:05 1727893                    /dev/zero (deleted)
  6. 7fc26ce00000-7fc26d000000 rw-s 00000000 00:05 1727892                    /dev/zero (deleted)
  7. 7fc26d000000-7fc26d200000 rw-s 00000000 00:05 1727891                    /dev/zero (deleted)
  8. 7fc26d200000-7fc26d400000 rw-s 00000000 00:05 1727889                    /dev/zero (deleted)
  9. 7fc26d400000-7fc26d600000 rw-s 00000000 00:05 1727888                    /dev/zero (deleted)
  10. 7fc26d600000-7fc26d800000 rw-s 00000000 00:05 1727887                    /dev/zero (deleted)
  11. 7fc26d800000-7fc26da00000 rw-s 00000000 00:05 1727886                    /dev/zero (deleted)
  12. 7fc26da00000-7fc26dc00000 rw-s 00000000 00:05 1728889                    /dev/zero (deleted)
  13. ...
Copy the Code


把到 /dev/zero 的内存范围累加起来差不多就是虚拟机分配的内存了。
还可以考虑其它几个维度:映射到普通文件还是设备文件、可写映射还是不可写映射。
Reply View the author