Как уменьшить потребление процесса vmmem?
Я установил докер в Windows, который использует WSL2 в качестве бэкэнда. Однако, поскольку это делается, процесс называется
vmmem
похоже, постоянно потребляет много вычислительных ресурсов. Я побежал
docker stop $(docker ps -aq)
убить все работающие контейнеры (их было 12 - упс), что значительно улучшило проблему. Однако даже после закрытия докера
vmmem
по-прежнему занимает ~1,5 - 2 ГБ оперативной памяти и ~20% ЦП. Поскольку больше нет запущенных контейнеров, не следует потребление ресурсов
vmmem
быть минимальным? Как уменьшить потребление
vmmem
процесс?
14 ответов
Даниэль Б. в деньгах. Чтобы выключить Vmmem, просто войдите в Powershell или любой другой терминал, который вы хотите использовать с правами администратора, и введите cmd wsl --shutdown, когда закончите играть в wsl1/2.
Я редактирую конфигурацию WSL, чтобы ограничить использование памяти, как указано здесь.
# turn off all wsl instances such as docker-desktop
wsl --shutdown
notepad "$env:USERPROFILE/.wslconfig"
Установите нужные значения для ядра процессора и памяти:
[wsl2]
memory=3GB # Limits VM memory in WSL 2 up to 3GB
processors=2 # Makes the WSL 2 VM use two virtual processors
vmmem
даже после выключения докера будет работать от нескольких секунд до 1 минуты, прежде чем полностью отключится. Поэтому попробуйте закрыть свои контейнеры и докер, и он должен исчезнуть достаточно скоро.
В принятом ответе говорится о выключении
WSL
(подсистема Windows для Linux), что имеет смысл, если вы действительно открыли и установили дистрибутив, но поскольку вы упомянули о
Docker
, я предполагаю, что ты
vmmem
просто показывает использование только контейнеров докеров.
Вот хорошее объяснение от надежного человека: https://devblogs.microsoft.com/oldnewthing/20180717-00/?p=99265
Перезапустите WSL2, выполнив следующую команду в PowerShell, щелкнув правой кнопкой мыши и запустив ее в режиме администратора:
Restart-Service LxssManager
Память используется Linux для кэширования файлов. Это можно увидеть вbuff/cache
разделfree
команда. Чтобы удалить кеш, просто запуститеecho 3 | sudo tee /proc/sys/vm/drop_caches
.
Я только что создал%UserProfile%\.wslconfig
файл с этими двумя строками и оставил все остальное нетронутым. Все работало нормально.
[wsl2]
memory=8GB
Я выполнил полное выключение сразу после добавления файла для WSL, чтобы получить новые настройки.
$ wsl --shutdown
Дополнительную информацию от Microsoft см. здесь: Настройка дополнительных параметров в WSL.
Если вы хотите остановить процесс vmmem, попробуйте этот способ
- откройте меню «Пуск» -> найдите «Диспетчер Hyper-V», просто набрав
- остановить виртуальную машину -> щелкнуть правой кнопкой мыши -> выключить
На тот момент, когда я посмотрел на этот вопрос, было около двух лет, и я только сейчас столкнулся с проблемами. Возможно, это связано с включением Kubernetes внутри Docker для Windows (я в этом не уверен).
Мне удалось завершить работу подсистемы Windows для Linux (WSL) с помощьюwsl --shutdown
команда, которая освободила память, но отключила использование Docker.
Итак, я обновил свой~/.wslconfig
файл (он же%USERPROFILE%\.wslconfig
), как предложено для уменьшения памяти. Я считаю, что это помогло.
Позже выяснилось, что моя подсистема WSL устарела и не обновляется (по умолчанию) с помощью обновлений Windows, потому что я отключилReceive updates for other Microsoft products when you update Windows
.
Поэтому я включил это и запустилwsl --update
(в оболочке администратора), а моя версия WSL была обновлена от 16.03.21 (Kernel Version 5.4.72
) по сегодняшний день (02.05.22) (Kernel Version 5.10.102.1
).
Я надеюсь, что это тоже поможет.
Согласно этой теме: https://github.com/microsoft/WSL/issues/6982, использование параметра памяти в .wslconfig не всегда работает.
Решение, кажется, заключается в следующем:
- Добавьте это в
\Users\<USERPROFILE>\.wslconfig
(создайте файл, если он не существует)
[wsl2]
guiApplications=false
- Перезапустите wsl, запустив
wsl --shutdown
в powershell или командной строке (появляется сообщение о завершении работы, но на самом деле он останавливает и перезапускает все запущенные дистрибутивы wsl)
В моем случае у меня не установлен WSL, но есть Docker. Я некрасиво завершил процесс докера, а через некоторое время заметил, что vmmem использует много CPU. Windows не позволила убить процесс vmmem.
Мне пришлось снова открыть Docker и аккуратно закрыть его с помощью значка на панели задач. После этого vmmem больше не работал.
Может ли это быть связано с этим????
Что касается моих проблем, связанных с высокой загрузкой ЦП и оперативной памяти vmmem, я испробовал все решения, которые мог найти здесь и в других местах для WSL2. Похоже, что для некоторых типов задач WSL2 съедает вашу память, а не выплевывает ее при выполнении...
Исключения для использования WSL 1 вместо WSL 2:
- Использование памяти WSL 2 увеличивается и уменьшается по мере ее использования. Когда процесс освобождает память, она автоматически возвращается в Windows. Однако на данный момент WSL 2 еще не возвращает кэшированные страницы в памяти обратно в Windows до тех пор, пока экземпляр WSL не будет выключен. Если у вас длительные сеансы WSL или вы имеете доступ к очень большому количеству файлов, этот кеш может занимать память в Windows.https://docs.microsoft.com/en-us/windows/wsl/compare-versions
Для этой конкретной задачи мне не нужен WSL2... Сейчас я пробую WLS1...
Я буду публиковать новости о том, как идут дела...
Обновление: кажется, переход на WSL1 решает эту проблему при запуске многих подпроцессов. Я уже давно прошел момент, когда он перегружает ОЗУ и останавливается.
У меня была такая же проблема с Windows 10 версии 20H2 и сборкой ОС 19042.1466, и создание файла «.wslconfig», как сказали ребята, решило мою проблему. Но меня беспокоит: является ли это решение похожим на подавление памяти для контейнеров и замедляет работу моего контейнера? Есть ли какие-либо идеи относительно этого использования памяти? Это утечка памяти? Или Docker/WSL2 делает только резервирование памяти? По крайней мере, до сих пор я не сталкивался с этой проблемой в Windows 11 версии 22H2 и сборке ОС 22621.1555.