Htop говорит «530G» в «VIRT» для «vagrant ssh»

#macos #memory #vagrant #virtualbox #htop

#macos #память #vagrant #virtualbox #htop

Вопрос:

Я использую Vagrant на macOS с ubuntu64 16.04. Запуск htop , я вижу vagrant ssh , что процесс может использовать практически 530G (в VIRT столбце).

Это нормальное поведение Vagrant? Должен ли я паниковать? Является ли «нормальным» иметь практически 530G на mac с 120G диска и 16G оперативной памяти? Или, может быть, я не понял значения VIRT ?

Vagrant box работает на virtual box и имеет только 1 ГБ выделенной оперативной памяти.

Ответ №1:

Ответ Криса Робертса на github:

Привет! Я смог воспроизвести это поведение, но при выполнении любой команды vagrant. Команда vagrant ssh проще всего увидеть это поведение просто потому, что процесс остается запущенным до тех пор, пока работает сеанс ssh.

Приведенная ниже версия tl; dr проста: не беспокойтесь об этом. VIRT не выделяется память. Если бы это было так, вам либо потребовалось бы огромное пространство подкачки, либо ничего бы не работало.

Итак, что здесь происходит? Установщик vagrant включает в себя небольшой исполняемый файл go (vagrant), задачей которого является настройка текущей среды с правильным расположением всего, что ей нужно. Каталог установщиков bin, каталог lib для ruby и всех других друзей, все драгоценные камни и сам драгоценный камень vagrant. Как только все это настроено, он запускает новый процесс, фактический процесс Ruby vagrant.

Поскольку ваш пример ссылался на vagrant ssh, и, как было указано ранее (#7296 (комментарий)), происходит Kernel.exec, что означает, что процесс Ruby не сохраняется, я решил, что виновником должна быть оболочка. После небольшого поиска (в основном, чтобы найти элементы stackoverflow с надписью «не беспокойтесь о VIRT») Я наткнулся на:

ключевая база / keybase-проблемы # 1908

Они ссылаются на часто задаваемые вопросы golang, в которых говорится о том, что заранее запрашивается куча VIRT, и это не имеет большого значения, но никогда никаких абсолютных данных о том, сколько на самом деле было заявлено. Там была удалена ссылка на lwn (keybase / keybase-issues#1908 (комментарий)) что касается поведения golang при запуске, требующего огромного количества VIRT, но все равно все ссылалось на гораздо меньшую сумму, чем я видел локально. Поэтому я решил покопаться в коде среды выполнения golang, и в malloc.go мы находим ответ:

golang src /runtime / malloc.go

Причина, по которой это происходит, заключается в том, что оболочка go используется для запуска vagrant. Поскольку VIRT, который вы видите, является просто резервированием и фактически не выделяется, это не проблема и не то, о чем следует беспокоиться.

(В golang ML есть несколько интересных разговоров о плюсах и минусах этого подхода, все они довольно хорошо читаются).

Это просто копирование / вставка (и выделенный жирным шрифтом TLDR), надеюсь, это может помочь кому-то еще.