Могу ли я сказать Linux не выгружать память определенного процесса? - PullRequest
43 голосов
/ 23 февраля 2009

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

Это Java-приложение, поэтому в идеале я надеюсь найти способ сделать это из командной строки.

Я знаю, что вы можете установить глобальный обмен на 0, но разумно ли это?

Ответы [ 7 ]

25 голосов
/ 23 февраля 2009

Вы можете сделать это с помощью системного вызова mlockall (2) в Linux; это будет работать для всего процесса, но прочитайте об аргументе, который вам нужно передать.

Тебе действительно нужно вытащить все это в ядро? Если это Java-приложение, вы, вероятно, заблокировали бы всю JVM в ядре. Я не знаю метода командной строки для этого, но вы могли бы написать тривиальную программу для вызова fork, вызова mlockall, затем exec.

Вы также можете посмотреть, соответствует ли одно из уведомлений о шаблонах доступа в madvise (2) вашим потребностям. Консультирование подсистемы ВМ по поводу лучшей стратегии пейджинга может быть лучше, если это применимо для вас.

Обратите внимание, что давным-давно, под SunOS, существовал механизм, похожий на madvise, называемый vadvise (2) .

14 голосов
/ 10 сентября 2012

Если вы хотите изменить swappiness для процесса, добавьте его в cgroup и установите значение для этой cgroup:

https://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux#10227

2 голосов
/ 15 июня 2016

Существует класс приложений, в которые вы никогда не хотите, чтобы они менялись местами. Одним из таких классов является база данных. Базы данных будут использовать память в качестве кэшей и буферов для своих дисковых областей, и нет никакого смысла в том, что они когда-либо будут заменены. Конкретная память может содержать некоторые релевантные данные, которые не нужны в течение недели до одного дня, когда клиент запрашивает их. Без кэширования / замены база данных просто найдет соответствующую запись на диске, что будет довольно быстро; но при обмене вашему сервису может потребоваться много времени, чтобы ответить.

mysqld включает код для использования ОС / системный вызов memlock. В Linux, начиная с версии 2.6.9, этот системный вызов будет работать для процессов без полномочий root, которые имеют возможность CAP_IPC_LOCK [1] . При использовании memlock() процесс должен все еще работать в пределах ограничения LimitMEMLOCK. [2] * * +1011. Одна из (немногих) хороших вещей в systemd заключается в том, что вы можете предоставить процессу mysqld эти возможности, не требуя специальной программы. Если также можно установить ограничения, как вы ожидаете с ulimit. Вот файл override для mysqld, который выполняет необходимые шаги, включая несколько других, которые могут вам понадобиться для такого процесса, как база данных:

[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK

# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1 

# do not kills this process if low on memory
OOMScoreAdjust=-900 

# Use higher io scheduling
IOSchedulingClass=realtime    

Type=simple    
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS

Примечание Стандартное сообщество mysql в настоящее время поставляется с Type=forking и добавляет --daemonize в опции к услуге в строке ExecStart. Это по своей природе менее стабильно, чем описанный выше метод.

ОБНОВЛЕНИЕ Я не на 100% доволен этим решением. После нескольких дней работы я заметил, что процесс по-прежнему требует огромного количества перестановок! Изучая /proc/XXXX/smaps, отмечу следующее:

  • Самый большой вклад в своп - это сегмент стека! 437 МБ и колеблется. Это создает очевидные проблемы с производительностью. Это также указывает на утечку памяти из стека.
  • Есть ноль заблокированных страниц . Это указывает, что опция memlock в MySQL (или Linux) не работает. В этом случае это не будет иметь большого значения, потому что MySQL не может блокировать стеки памяти.
2 голосов
/ 23 февраля 2009

Как суперпользователь, вы можете «довести» его до наивысшего уровня приоритета -20 и надеяться, что этого достаточно, чтобы его не обменивали. Обычно это так. Положительные числа понижают приоритет планирования. Обычные пользователи не могут приятно вверх (отрицательные числа)

2 голосов
/ 23 февраля 2009

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

1 голос
/ 23 февраля 2009

Почему вы хотите это сделать?
Если вы пытаетесь увеличить производительность этого приложения, то вы, вероятно, на неправильном пути. ОС вытеснит процесс для увеличения памяти для дискового кеша - даже если есть свободная оперативная память, ядро ​​знает лучше (на самом деле лучше всего знают парни из samrt, написавшие планировщик).
Если у вас есть процесс, который нуждается в отзывчивости (он заменяется, когда он не используется, и вам нужно его быстро перезапустить), тогда может помочь его высокий приоритет, mlock или использование ядра реального времени.

1 голос
/ 23 февраля 2009

За исключением крайне необычных обстоятельств, если задать этот вопрос, значит, ты делаешь это неправильно (тм).

Серьезно, если Linux хочет поменяться местами, и вы пытаетесь сохранить процесс в памяти, вы предъявляете необоснованные требования к ОС. Если ваше приложение так важно, то 1) купите больше памяти, 2) удалите другие приложения / демоны с машины или выделите машину для своего приложения и / или 3) инвестируйте в действительно быструю дисковую подсистему. Эти шаги разумны для важного приложения. Если вы не можете оправдать их, то, вероятно, вы не сможете оправдать проводную память и голодание других процессов.

...