10

Иногда ядро, похоже, намеревается сохранить, например, firefox в swap, хотя физической памяти достаточно, и я использую firefox:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

Есть ли команда для указания ядру удалить пространство подкачки и использовать доступную свободную память?


Обновление: хотя в краткосрочной перспективе я использовал swapon/swapoff, я теперь установил

sudo sysctl vm.swappiness=30

как предложено в другом ответе, и получите очень хорошие результаты.

4 ответа4

15

Вы можете сделать то, что предложил Ник, и использовать swapoff. Однако есть еще один, более элегантный способ подстройки "подкачки", или как агрессивно ядро выгружает программы на диск в системах с ядром 2.6.

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

Обратите внимание, что для этого вам нужны привилегии root, как и при выполнении команд swapoff/swapon.

Текущее значение "swappiness" можно проверить в файле /proc/sys/vm/swappiness или с помощью этой команды sysctl :

sudo sysctl vm.swappiness

Значения "подкачки" могут варьироваться от 0 (без перестановки) до 100 (перестановка на диск в максимально возможной степени). Ubuntu поставляется с установкой по умолчанию на 60.

Чтобы изменить это для сеанса, снова вызовите sysctl и передайте ему значение подкачки:

sudo sysctl vm.swappiness=30

Помимо бесплатного, вы, конечно же, можете следить за эффектами этого с помощью отличных утилит htop или iotop .

Если вам нравится то, что вы видите, и хотите сохранить это значение при перезагрузке, просто поместите «vm.swappiness = 30» в файл /etc/sysctl.conf .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

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

6

Помните, что вещи в swap были помещены туда в более загруженное время, чем сейчас

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

Это осуществляется на основе удаления при записи, поэтому при обновлении копии в ОЗУ блоки в разделе подкачки будут освобождены.

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

Вы не можете видеть, сколько данных находится в этом состоянии (как на дисковых страницах в областях подкачки, так и в оперативной памяти) в выводе из free . Вы можете увидеть это через специальную файловую систему /proc . Посмотрите вывод cat /proc/meminfo для подсчета SwapCached .

Еще две причины для использования подкачки при наличии явно свободной памяти:

  • когда при высокой нагрузке ввода / вывода ядро решило, что страницы, которые не использовались целую вечность, лучше заменять, чтобы использовать ОЗУ для кеша / буферов, хотя, глядя на ваш free вывод, это, вероятно, не так, как здесь у вас есть часть действительно нераспределенной оперативной памяти, а также используемая кешем / буферами ввода-вывода.
  • страницы по какой-то причине были заменены ранее, и с тех пор они больше не нужны - возможно, это память, используемая процессом, который неактивен в течение некоторого времени. В этом случае освобождение раздела подкачки (то есть загрузка страниц обратно в ОЗУ) может улучшить время отклика этого процесса в следующий раз, когда потребуется выполнить что-то другое, кроме режима сна, но если он уже некоторое время неактивен, он может и не понадобиться. в любое время в ближайшее время в любом случае.
2

Вы могли бы сделать swapoff - понадобятся права суперпользователя,
но, думаю, это не проблема для вас.

1

Помните, что free это просто снимок использования памяти. Результат, который вы видите, может означать, что в какой-то момент в прошлом системе не хватало оперативной памяти, так что местами был резидентный материал. С тех пор ОЗУ стало свободным, но материал для свопинга не требовался, поэтому он по-прежнему удерживается на свопе, а не просто загромождает ОЗУ. Если это так, отключение свопа было бы плохой идеей. Существуют ли процессы, которые могут потребовать такой большой объем оперативной памяти с момента последней перезагрузки?

Кроме того, вы можете проверить, что у вас нет ограничения на максимальный размер резидента, установленного с помощью ulimit (обычно в /etc /profile, но, возможно, оно зависит от дистрибутивов и может быть установлено для каждого процесса (например, в скрипте запуска)).

Наконец, в Microsoft Windows есть сообщения о конкретных проблемах с выгрузкой Firefox на диск, например, при сворачивании (например, http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113). Я не слышал об этом в системах GNU/Linux, но это, возможно, стоит изучить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .