我在MacOS和ubuntu64 16.04上使用Vagrant。运行htop
,我可以看到vagrant ssh
进程几乎可以使用530G(在VIRT
列中)。
这是流浪汉的正常行为吗?我应该恐慌吗?在mac电脑上拥有几乎530G的内存、120G的磁盘和16G的内存是"正常的"吗?还是我没有理解VIRT
的意思?
流浪盒运行在虚拟盒上,只分配1G RAM
chrisroberts在github上的回答:
你好!我能够复制这种行为,但执行了任何流浪命令。vagrant ssh命令是最容易看到这种行为的命令,因为只要ssh会话还活着,进程就会一直运行。
下面的tl;dr版本很简单:不要担心它。没有为VIRT分配内存。如果是的话,你要么需要大量的交换空间,要么什么都不能用。
这是怎么回事?vagrant安装程序包括一个小的go可执行文件(vagrant),它的工作是将当前环境设置为所需的所有内容的适当位置。安装程序的bin目录,ruby和所有其他朋友的lib目录,所有的gem,以及流浪的gem本身。一旦配置好所有这些,它就会生成一个新进程,即实际的Ruby流浪进程。
因为您的示例引用了vagrant ssh,并且正如前面指出的(#7296(注释))一个内核。exec的发生意味着Ruby进程没有持久化,我想一定是包装器出了问题。经过一番搜索(主要是为了找到stackoverflow项,上面写着"不要担心virt")我偶然发现:
keybase/keybase-issues # 1908
他们参考了golang FAQ,该FAQ讨论了一堆预先声明的VIRT,这不是什么大问题,但从来没有绝对说明实际声明了多少VIRT。这里有一个指向lwn的链接(keybase/keybase-issues#1908 (comment)),关于golang在启动时请求大量VIRT的行为,但所有引用的数量仍然比我在本地看到的要少得多。所以我决定深入研究golang运行时代码,并在malloc中。让我们去寻找答案:
golang src/运行/malloc.go
发生这种情况的原因是用于启动vagrant的go包装器。因为您看到的VIRT只是一个预订,而不是实际分配的,所以这不是问题,也不应该担心。
(关于这种方法的利弊,在golang ML上有一些有趣的对话,都是非常好的读物)。
这只是一个复制/粘贴(并持有TLDR),希望它能帮助别人