Освобождение пространства подкачки

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

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

Роберт Мунтяну
источник

Ответы:

2

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

Nik
источник
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

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


источник
+1 за sysctl. При экспериментировании с различными значениями swappiness вы можете записать напрямую в файл proc (echo "30"> / proc / sys / vm / swappiness). Эти изменения являются временными и не будут записываться в /etc/sysctl.conf. Если вы довольны настройками, используйте sysctl, чтобы внести «постоянные» изменения.
Шон Чин
6

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

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

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

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

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

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

  • когда при большой нагрузке ввода / вывода ядро ​​решило, что страницы, которые не использовались целую вечность, лучше поменять местами, чтобы использовать ОЗУ для кеширования / буферизации, хотя, глядя на ваш freeвывод, это, вероятно, не так для вас иметь часть действительно нераспределенной оперативной памяти, а также ту, которая используется кэшем / буферами ввода-вывода.
  • страницы по какой-то причине были заменены ранее, и с тех пор они больше не нужны - возможно, это память, используемая процессом, который неактивен в течение некоторого времени. В этом случае освобождение раздела подкачки (то есть загрузка страниц обратно в ОЗУ) может улучшить время отклика этого процесса в следующий раз, когда нужно будет сделать что-то, кроме сна, но если оно уже неактивно в течение некоторого времени, оно может не понадобиться. в любое время в ближайшее время в любом случае.
Дэвид Спиллетт
источник
1
+1 за отличное объяснение. К вашему сведению, vmstat позволяет просматривать данные / proc / meminfo не во всех этих файлах.
1

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

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

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

Рождество
источник
Спасибо за ответ. Моя проблема не в том, что используется своп, а в том, что он теперь используется для активных программ, например Firefox и Thunderbird, которые чувствуют себя вялыми. Свап-офф / свапон заставили их снова почувствовать себя быстрыми.
Роберт Мунтяну