Линукс без свопа все равно начинает биться

489
attila lendvai

Debian 9.4, Linux 4.9

Иногда я компилирую что-то, что едва умещается в ОЗУ, или процесс румян внезапно начинает поглощать память сверх того, что доступно. Когда процесс проходит через доступную оперативную память, Linux начинает перебивать диск, даже если у меня включен нулевой своп (никакой своп не был попыткой избежать этого). Я полагаю, он начинает сбрасывать и перезагружать такие вещи, как mmapчасти педалей исполняемых файлов?

На этом этапе мой сеанс X быстро перестает отвечать, и все, что я могу сделать, это подождать десятки минут, пока весь сеанс X не будет уничтожен, и я смогу снова войти в систему.

Я пытался найти решения, но ничего не помогло. Убийца OOM не улавливает этот процесс, и vm.overcommit_memory=2я даже не могу войти через GDM и Gnome.

Есть ли способ сказать Linux не менять местами вообще ? Таким образом, я бы, по крайней мере, получил шанс, что процесс румян будет убит неудачным malloc, и даже если нет, по крайней мере, мне не нужно будет ждать, глядя на неотзывчивую машину.

Или какие-то другие советы, как управлять этим сценарием?

0
Я думаю, что вы смотрите на это неправильно. То, что вы описываете, это именно то, что ожидается, когда требуется больше, чем доступная оперативная память, и нет замены, чтобы компенсировать это. Итак, ваша проблема в том, что ** не имеет подкачки **, а не подкачки Linux с `swapoff`, что не происходит и совершенно бессмысленно. 6 лет назад 2
Алгоритмы подкачки позволяют освобождать кодовые страницы, которые не изменяются, позволяя использовать память для других приложений. Это не перестановка, так как ничего не записывается, но чем больше (неразборчиво) страниц данных в памяти, тем больше дисковой активности для освобождения и чтения кодовых страниц в сокращающуюся оставшуюся память, с очевидным влиянием на производительность. AFH 6 лет назад 0
Кстати, а почему вы пытаетесь бежать без свопа? Это почти наверняка заблокируется в какой-то момент, когда нет свободных страниц памяти. Вы можете в любой момент добавить файл подкачки _file_, как описано в [этой ссылке] (https://help.ubuntu.com/community/SwapFaq#How_do_I_add_a_swap_file.3F). AFH 6 лет назад 1
я уже работаю без подкачки, пытаясь избежать перегрузки и блокировки моего компьютера, когда я, например, забываю выйти из браузера, когда сборка выполняется в фоновом режиме (он работает в течение 3 часов, и только для конца требуется много оперативной памяти) , attila lendvai 6 лет назад 0
Чтобы избежать побоев и «блокировок», нужно либо покупать больше оперативной памяти, либо запускать меньше (или меньше) за один раз. Jamie Hanrahan 6 лет назад 0
Чтобы сделать пейджинг с (и на) диска быстрее, рассмотрим SSD. Не только для вашего пространства подкачки, но и для всех приложений OS +. Jamie Hanrahan 6 лет назад 0
Я ценю вашу попытку помочь, но, пожалуйста, не стесняйтесь больше от людей, болтающихся на superuser.com! У меня уже есть SSD, и я знаю, что если я обновлю свою машину, она будет обновлена. Дух! Решение, которое я ищу, - это разумное поведение Linux при возникновении ошибок. просто замените мой пример компиляции программной ошибкой, которая иногда внезапно пожирает все оперативной памяти. attila lendvai 6 лет назад 0
Является ли * процесс румян * противоположностью * зеленого потока? * tripleee 6 лет назад 0
Аттила, ты не упоминал, что у тебя был SSD. И ответы (и комментарии) здесь не только для оригинального спрашивающего. Принцип, который я изложил о том, как избежать избиения, действителен для всех. Кстати, работать без подкачки, как правило, плохая идея - если у ОС недостаточно ОЗУ, она все равно будет выгружать страницы из ОЗУ; вы просто заставляете его исключать только кодовые страницы и другие файлы mmap'd только для чтения, когда среди измененных страниц данных могут быть более подходящие кандидаты на выселение. Другими словами, ограничивая выбор ОС, вы заставляете ее делать более плохие. Jamie Hanrahan 6 лет назад 0

1 ответ на вопрос

2
Marco Pantaleoni

Если вы компилируете источники, которые требуют почти всей доступной оперативной памяти, если не больше, вероятно, единственное эффективное решение - это добавление реальной оперативной памяти. Сказав это, вы можете попробовать добавить очень большой объем подкачки (скажем, в 2 или 3 раза больше оперативной памяти) и установить /proc/sys/vm/swappinessнизкое значение, например 1 (обратите внимание, что в ядре 3.5+ установка его в 0 полностью отключает своп), так что своп используется только в случае необходимости. Это должно минимизировать побои.

Я согласен с этим ответом. Суть здесь в том, чтобы позволить системе заменять грязные страницы неактивных процессов, освобождая оперативную память для процесса (ов) компиляции. Таким образом, у компиляции больше шансов завершить свою работу в разумные сроки. Если это все еще не помогает, тогда вам действительно нужно больше физической памяти. Johan Myréen 6 лет назад 0
довольно жаль, что нет ничего лучше этого, но спасибо за подсказку! Я бегу с этим и таким образом, я могу получить больше возможностей вмешаться, по крайней мере, когда я рядом, когда это происходит. attila lendvai 6 лет назад 0
Хорошо! Рад слышать, что это помогло! Marco Pantaleoni 6 лет назад 0
вам действительно нужен большой своп, чтобы помочь этому, потому что меньший своп заполняется при первом выделении, а затем во второй раз, с почти полным свопом, он ведет себя подобно сценарию без свопа. attila lendvai 6 лет назад 0