Рейтинг:2

Как автоматически переместить подкачку обратно в оперативную память?

флаг cn

Моя первоначальная проблема с swap(piness) заключалась в том, что он слишком часто менялся (даже с подкачка = 1! ).

Я также думал, что 0 отключит swappiness, что было заблуждение,
Обмен по-прежнему работает, даже если вы установите sudo sysctl -w vm.swappiness = 0 ! :-)
(Чтобы установить постоянно, отредактируйте /etc/sysctl.conf и добавить/обновить vm.swappiness = 0 - для текстового редактора с графическим интерфейсом я рекомендую "блокнот Linux" "gedit", затем вы можете сделать sudo gedit /etc/sysctl.conf)

Только с обменом 0 он начал вести себя так, как можно было бы ожидать (подкачка начинается примерно при заполнении 98% ОЗУ), однако я все еще испытываю еще одну проблему - когда действительно снова освобождается достаточно ОЗУ, подкачка не возвращается автоматически обратно в ОЗУ, даже не со временем.

Конечно, вы могли бы вручную сделать судо подкачки -а; судо свопон -а каждый раз, когда своп отключается, что в конечном итоге заставляет своп очищаться в ОЗУ, а затем своп запускается снова.

Однако это неудобно по двум причинам: а) своп отключается на мгновение б) это дополнительная ручная проверка/запуск

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

Raffa avatar
флаг jp
Для автоматической проверки: `[ "$(free | awk '/Swap:/{print $3}')" -lt "$(free | awk '/Mem:/{print $7}')" ] ​​&& echo "Свободная память больше, чем использованный своп" || echo "Свободной памяти меньше, чем используемой подкачки"`
user535733 avatar
флаг cn
Ядро действительно возвращает часто используемые страницы подкачки обратно в оперативную память. Он не возвращает редко используемые страницы быстро... потому что они редко используются, поэтому swap - подходящее место для них. Если вы используете систему с ограниченным объемом ОЗУ, не рассматривайте своп как просто переполнение, когда ОЗУ заполнено. Подкачка рассматривается как другая форма памяти с другими характеристиками.
heynnema avatar
флаг ru
Отредактируйте свой вопрос и покажите мне `free -h` и `swapon -s` и `sysctl vm.swappiness`.
jave.web avatar
флаг cn
@user535733 user535733 проблема в том, что у меня есть некоторые вещи, которые мне могут не понадобиться в данный момент, но мне нужно, чтобы они были готовы, когда я туда пойду - своп действительно является для меня только безопасным перерывом при переполнении (так что у меня есть время убить правильный процесс, когда я начинаю снимать слишком много ГБ в ОЗУ)
Рейтинг:3
флаг cn

Afaik, нет доступных настроек для изменения тенденции возврата замененных страниц в ОЗУ. Вы можете, если хотите, работать со сценарием, который проверяет ОЗУ и SWAP и отключает/включает подкачку, когда это безопасно. В системе с ограниченной памятью это может быть никогда: единственный способ очистить память подкачки — закрыть процессы, которым она принадлежит.

Неясно, какие преимущества вы получите от немедленного перемещения SWAP обратно в ОЗУ, когда это возможно. Linux автоматически управляет свопом. Если он не освобождает занятую подкачку, это происходит потому, что эта подкачанная память не нужна и, таким образом, может спокойно оставаться на диске до тех пор, пока она не понадобится. Таким образом, оперативная память и время процессора экономятся для использования приложений, где это важно. Ваш диск защищен тем, что операции подкачки сведены к минимуму.

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

В первом случае вам может потребоваться изменить привычки использования компьютера, чтобы учесть ограничения, связанные с нехваткой оперативной памяти, до тех пор, пока вы не сможете обновить физическую оперативную память. Swap никоим образом не является заменой оперативной памяти, это всего лишь уловка, позволяющая несколько расширить ее и позволить несколько больше в системе с ограниченной оперативной памятью.

Во втором случае оставьте это в покое: ваша система ведет себя оптимально, выгружая неиспользуемую оперативную память, чтобы оставить ее для вашей работы по захвату памяти.

jave.web avatar
флаг cn
проблема в том, что у меня есть некоторые вещи, которые мне могут не понадобиться в данный момент, но мне нужно, чтобы они были готовы, когда я иду туда - своп действительно является для меня только безопасным перерывом при переполнении, поэтому у меня есть время, чтобы убить нужный процесс, когда Я начинаю снимать слишком много ГБ в ОЗУ, что случается, или мне даже приходится делать это довольно регулярно. (и я бы не назвал это трюком) Кстати: мне кажется, что только последний абзац действительно отвечает на вопрос. Также я вижу эту тенденцию обмена ответами, чтобы избежать неизбежного - есть проблема, требующая решения (которого может еще не быть, но проблема остается). :-)
vanadium avatar
флаг cn
Первая часть — это намек на то, что то, что вы считаете проблемой, возможно, не является проблемой. В конце концов, суть такова: купите достаточно оперативной памяти для своих нужд. Никакой другой подход вам не поможет. Вы действительно добавили некоторую информацию об объеме оперативной памяти, с которой вы боретесь? Я вижу, что тем временем кто-то был настолько любезен, что написал для вас сценарий, о котором я упоминал.
vanadium avatar
флаг cn
Переместил "ответ" наверх ;)
jave.web avatar
флаг cn
Это еще одна тенденция, которая мне не нравится - «купить X», я думал, что это очевидно (извините, если это не так), если бы я мог купить/обновить до достаточного количества оперативной памяти, я бы не спрашивал об этом. Извините, что не предоставил информацию об оперативной памяти - есть 2 случая - 16 ГБ и 32 ГБ. Не поймите меня неправильно, я очень рад, что вы готовы помочь :) просто немного разочарован подходом Интернета к людям, которым нужно решение их текущей ситуации.
jave.web avatar
флаг cn
В любом случае, в частности, в моем случае обновление ОЗУ в любом случае не будет вариантом, поскольку оно не будет иметь тех же **поведенческих** последствий (как я описал в своем 1-м комментарии) и перегрузки ОЗУ, которые я ловлю с помощью свопа может быть **практически неограниченным** :)
vanadium avatar
флаг cn
Я понимаю вашу потребность, но не «почему» вашей потребности, и ваш вопрос не проясняет этого, потому что вы вряд ли документируете конкретный вариант использования, который может привести к вашей ситуации. Если кто-то не придумает лучшего, как в настоящее время, вам нужно реализовать сценарий самостоятельно, как я указал в этом ответе. Я вижу, что вы тем временем приняли ответ человека, предоставившего сценарий.
jave.web avatar
флаг cn
Хотя я не задокументировал вариант использования, я думаю, что довольно четко описал потребность и то, что я уже делаю, что подразумевает, что я уже прошел через общие вопросы и ответы, поэтому я нашел большую часть вашего ответа не по теме - быть понятно - вот почему я его не принял, **не** из-за отсутствия кода. Но если вам интересно, общий вариант использования — это случайные утечки памяти/кэш-мусор, генерируемый приложениями, которые я вообще не могу контролировать, но они случаются время от времени, и когда я специально генерирую материал, используя оперативную память, но с данными, которые могут содержать непредсказуемость :)
jave.web avatar
флаг cn
Однако спасибо за ваш вклад, я не хочу показаться неблагодарным :)
Рейтинг:1
флаг jp

Если ты должен это сделать, то замена это путь. Вы можете автоматизировать этот процесс, реализовав скрипт bash следующим образом:

#!/бин/баш

sysctl -w vm.swappiness=0

пока правда
делать
    total_m=$(бесплатно | awk '/Mem:/{print $2}')
    free_m=$(бесплатно | awk '/Mem:/{print $7}') 
    used_s=$(бесплатно | awk '/Swap:/{print $3}')
    total_m_percent=$(("$total_m" / 100))
    free_m_percent=$(("$free_m" / "$total_m_percent"))
    # Деактивировать подкачку и перемещать страницы в ОЗУ, если в ОЗУ достаточно места и свободной ОЗУ более 30%
    [ "$used_s" -gt 0 ] && [ "$used_s" -lt "$free_m" ] && [ "$free_m_percent" -gt 30 ] && swapoff -a
    # Активируем своп, если оставшейся свободной оперативной памяти становится меньше 5%
    [ "$used_s" -eq 0 ] && [ "$free_m_percent" -lt 5 ] && swapon -a
    # Сон в течение 10 секунд, чтобы не нагружать систему
    спать 10
сделано

Запустите скрипт с sudo bash scriptfile.sh или добавить системад service для автоматического запуска скрипта при старте системы.

jave.web avatar
флаг cn
Выглядит интересно — значит, нельзя просто переместить замененные вещи без swapoff? :(
Raffa avatar
флаг jp
@jave.web [Управление памятью](https://www.kernel.org/doc/html/latest/admin-guide/mm/index.html) является сложным и жизненно важным для системы … Ядро Linux принимает позаботьтесь об этом очень хорошо... Так что мудрее всего будет просто "поменяться местами" и позволить волшебству произойти :) ... ... есть другой способ? способ… Я сомневаюсь в этом… Сценарий в моем ответе специально подготовлен для удовлетворения ваших требований, и он должен безупречно работать как служба `systemd`.
muru avatar
флаг us
Обзор кода: при назначении подстановки команды переменной (`var=$(foo)`) кавычки вокруг подстановки команды не нужны (но они не мешают). Но при использовании переменной в команде `[ "$used_s" ...]` переменная должна быть заключена в кавычки.
Raffa avatar
флаг jp
@muru Спасибо за ваш обзор кода, я полностью согласен с вами в отношении концепции хорошей практики ... Однако в этих переменных ожидаются только числовые значения, поэтому кавычки вокруг этих переменных не нужны (но они не помешают). .. Я вижу вашу озабоченность по поводу `$used_s`, но даже при деактивированном свопе эта переменная будет содержать числовое значение `0`... Однако ваше мнение по этому вопросу имеет больший вес с правой стороны :)
Raffa avatar
флаг jp
@muru Мне пришлось отредактировать и добавить `[ "$used_s" -gt 0 ]` и `[ "$used_s" -eq 0 ]`, чтобы предотвратить ненужную выдачу команд `swapoff`/`swapon` ... Я также нашел это шанс разобраться с котировками по пути :) ... Ценю ваше мнение и еще раз спасибо.
jave.web avatar
флаг cn
@Raffa Мне просто интересно, может ли ядро ​​перемещать данные из ОЗУ в своп, если оно может каким-то образом сделать это наоборот, сохраняя при этом своп на случай, если начнет выделяться другая огромная память :)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.