Почему kswapd0 работает на компьютере без подкачки?


21

У меня есть облачный сервер с ~ 14 ГБ оперативной памяти и без подкачки. Однако иногда я вижу, как kswapd0 загружает некоторый процессор при запуске top. Зачем вообще запускать kswapd0, если для него нет места подкачки?

Ответы:


8

У него все еще есть процесс, чтобы проверить, есть ли обмен. Чтобы уменьшить его, вам нужно установить свою перестановку -

отредактируйте "/etc/sysctl.conf" как root, затем измените (или добавьте)

vm.swappiness = 0

3
Хорошо, но почему он использует 1% моего процессора?
portforwardpodcast

2
Если kswapd0используется какой-либо процессор, а у вас нет раздела подкачки, система почти не имеет ОЗУ и пытается справиться с ситуацией путем (на практике) замены страниц из исполняемых файлов. Правильное решение заключается в том, чтобы уменьшить рабочую нагрузку, добавить подкачку или (желательно) установить больше оперативной памяти. Добавление свопа улучшит производительность, потому что у ядра будет больше опций о том, что перенести на диск. Без обмена ядро ​​практически вынуждено менять код приложения.
Микко Ранталайнен

Если у вас включен своп, и kswapd0вы используете какой-то процессор, но вам это не нужно, уменьшите swappinessнастройку. Однако, если ваш обмен не поддерживается SSD, который страдает от записи (например, плохой алгоритм выравнивания износа), снижение swappinessснижает общую производительность системы. Идея состоит в том, чтобы сохранить копию ОЗУ в разделе подкачки на тот случай, если потребуется больше ОЗУ - в этом случае копия в ОЗУ сразу же выбрасывается, вместо того, чтобы начинать менять ее перед использованием ОЗУ. Этот оптимистический обмен выполняется только тогда, когда система достаточно простаивает, поэтому она никогда не должна замедлять работу вашей системы.
Микко Ранталайнен

26

Пространство подкачки используется только для данных, которые не поддерживаются никаким другим файлом. Данные, сопоставленные с другими файлами на диске (например, исполняемыми программами), по-прежнему обмениваются на соответствующие файлы, даже если у вас нет устройства подкачки.


9
Например, рассмотрим случай, когда у вас нулевой своп, и системе почти не хватает ОЗУ. Ядро будет брать память, например, из Firefox (это может быть сделано, потому что Firefox запускает исполняемый код, который был загружен с диска - код может быть загружен с диска снова, если это необходимо). Если затем Firefox необходимо снова получить доступ к этой ОЗУ через N секунд, ЦП генерирует «серьезный сбой», который вынуждает Linux освободить часть ОЗУ (например, извлечь часть ОЗУ из другого процесса), загрузить недостающие данные с диска и затем позволить Firefox продолжить работу как обычный. Это очень похоже на обычный обмен, и kswapd0 делает это.
Микко Ранталайнен

4

Это хорошо известная проблема, что когда Linux не хватает памяти, он может вводить циклы подкачки вместо того, чтобы делать то, что он должен делать, убивая процессы, чтобы освободить оперативную память. Есть убийца OOM (Out of Memory), которая делает это, но только если Swap и RAM заполнены.

Однако это не должно быть проблемой. Если существует несколько процессов, вызывающих сбой, например, Firefox и Chrome, у каждого из которых есть вкладки, которые используют и захватывают память, то эти процессы вызовут обратное чтение свопинга. Затем Linux входит в цикл, в котором одна и та же память перемещается вперед и назад между памятью и жестким диском. Это, в свою очередь, приводит к инверсии приоритетов, когда переключение нескольких процессов назад и вперед делает систему не отвечающей на запросы.

Если вы отключите swap, вы усугубите эту проблему, поскольку у kswapd0 теперь нет другого выбора, кроме как поменять отображаемую память, такую ​​как исполняемые файлы. Если вы меняете исполняемые файлы, еще более вероятно, что они будут снова возвращены обратно довольно быстро.

Я попытался запустить это поведение в NetBSD для тестирования, и в результате произошел невероятный медленный процесс, а сама ОС была очень отзывчивой. Это означает, что проблема обмена происходит, но нет инверсии приоритетов. Однако в NetBSD нет драйверов AMDGPU, поэтому я пока что придерживаюсь Linux. Возможно, NetBSD не выполняет исполняемые файлы карты памяти, и поэтому он не входит в циклы подкачки, но я не знаю достаточно о его реализации, чтобы сказать, почему он не перестает отвечать.

Facebook также столкнулся с этой проблемой и создал OOMD, который является демоном Out Of Memory. Это демон, который обнаруживает активность kswapd0 и запускает процессы уничтожения. И, согласно Facebook, это почти полностью устранило проблему, когда серверы Linux перестали отвечать на запросы. Однако я не тестировал его и не знаю, насколько хорошо он будет работать на других серверах или настольных компьютерах / ноутбуках. Похоже, что OOMD имеет некоторую логику, решающую, какие процессы убивать в первую очередь, чтобы сохранить системные процессы и часть их серверной системы, которые отвечают за перезапуск всего, что было убито.

Однако это не так, как это должно быть решено. OOMD - Гадкий Хак. Реальное решение состоит в том, чтобы исправить инверсию приоритетов, которую вызывает цикл подкачки, а также сделать ядро ​​OOM Killer более агрессивным при уничтожении процессов для освобождения памяти. Исправление принадлежит ядру, потому что это единственное место, где мы можем быть уверены, что проблема обнаружена вовремя и процессы должным образом уничтожены.

Установка swappiness = 0 не является решением, потому что, когда системе не хватает свободной оперативной памяти, она начинает меняться несмотря ни на что. Нет возможности гарантировать, что система не начнет подкачку.

А также исправление оскорбительных приложений не является исправлением. Особенно, если пользователь хочет использовать эту ошибку, чтобы преднамеренно заставить ОС не отвечать на запросы. Быть отзывчивым является обязанностью ядра. Если Firefox перестает отвечать на запросы, то это исправление для приложения. Однако это не только делает себя не отвечающим, но и заставляет всю ОС становиться очень медленной и не отвечающей. До уровня, который может занять полчаса, чтобы войти в SSH. SSH не имеет ничего общего, и если он не запускается, это ошибка в ядре, а не в любой другой части системы. И это не ошибка, это две ошибки. Одной из ошибок является инверсия приоритетов, когда цикл замены вне рельсов может мешать другим процессам, кроме процесса (ов)-нарушителя, и это само по себе плохо. Другая ошибка в том, что это не Обнаружить, что он находится в цикле обмена и вызывает безумный износ жесткого диска / твердотельного накопителя или любого другого хранилища, поддерживающего обмен. При замене исполняемого файла это не проблема, поскольку они предназначены только для чтения карт памяти, которые не записываются обратно на диски, но kswapd0 по-прежнему блокируется при чтении того, что он одновременно удаляет из памяти.

Ну и есть третий баг. Тот факт, что нет никакого способа защитить диск CACHE от того, чтобы его можно было съесть, когда голодные приложения проглатывают всю доступную память. Это одна из причин того, что kswapd0 делает систему не отвечающей на запросы. Наиболее горячие данные, отображаемые в памяти, обычно хранятся в дисковом кеше, но когда Firefox съел этот кеш, это, очевидно, означает, что должно произойти чтение с диска.

Проблема не обязательно в Firefox, но это браузер по умолчанию, а не Chrome. И оба, как известно, вызывают эту проблему, поскольку они рассматривают доступную память как что-то, что тратится впустую, включая кэш-память и память подкачки, которая в Linux считается «доступной памятью». Таким образом, чтобы не потерять «доступную память», используйте ее для кеширования и прочего. Очевидно, что использование SWAP для DISK CACHE - ОЧЕНЬ ПЛОХАЯ ИДЕЯ, но ребята из Firefox и Chrome отвечают на это «свободная память - это потерянная память».

Итак, у нас есть три ошибки ядра, которые команда ядра, похоже, не рассматривает как ошибки. И ошибка в Firefox, Chrome и всех производных, которые они не считают ошибкой. Я попытался собрать Firefox на своем ноутбуке Fedora, чтобы разобраться с этой проблемой и, возможно, исправить ее. Угадай, что. Сборка Firefox с GCC на 4-ядерном процессоре с оперативной памятью 4 ГБ запускает SWAP LOOP с ПРИОРИТЕТНОЙ ИНВЕРСИЕЙ. Таким образом, одно из приложений, которое должно быть переписано - это GCC. В NetBSD происходит только 4 запущенных экземпляра GCC, которые работают медленнее, чем один, но не замораживают систему.

Да, это немного напыщенная речь, но я надеюсь, что она прояснит текущую проблему с подсистемами памяти Linux, а также с приложениями, которые ее вызывают.


1

Если у вас нет свопа и kswapd0он работает, ваша система фактически использует почти всю оперативную память в тот момент. Пришло время получить лучшие инструменты для мониторинга использования памяти (или свободной / доступной памяти в системе).

Реальное исправление состоит в том, чтобы уменьшить использование памяти (запускать процессы с меньшими утечками памяти, запускать меньше процессов, вообще пропустить запуск некоторых процессов, ограничить число дочерних / рабочих процессов некоторого серверного программного обеспечения) или получить больше оперативной памяти. Если потребность в ОЗУ вызвана утечками памяти, вы можете вместо этого использовать своп. Линукс должен быть достаточно умным, чтобы вытекать части, чтобы заменить, достаточно времени. Наличие свопа лучше, чем ничего, но это не реальная замена наличия достаточного количества оперативной памяти.


Здесь и в ваших комментариях есть хорошая информация, но включение подкачки не является решением в пределе, когда вся доступная память (ram + swap) заполняется. Это особенно плохое решение в случае утечки памяти, потому что неизбежно, что вся память в конечном итоге заполнится. Результат, когда swap + ram заполнен, такой же, как и при заполнении ram, когда swap отключен.
Код
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.