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

11148
Robert Munteanu

Иногда ядро, похоже, намеревается сохранить, например, 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 

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

10

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

15
nagul

Вы можете сделать то, что предложил Ник, и использовать 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 

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

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

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

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

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

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

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

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

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

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

1
mas

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

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

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

Спасибо за ответ. Моя проблема не в том, что используется своп, а в том, что он теперь используется для активных программ, например Firefox и Thunderbird, которые чувствуют себя вялыми. Свап / свап заставил их снова почувствовать себя быстрым. Robert Munteanu 14 лет назад 0