Что действительно контролирует параметр vm.swappiness?


37

Согласно документации ядра:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

Однако это немного расплывчато. Я пытаюсь выяснить, что именно параметр в конечном итоге контролирует. Я знаю, что он регулирует, насколько агрессивно ядро ​​пытается поменять страницы, но на какой процесс принятия решений в коде ядра это влияет?

Настраивает ли он, как давно должен был быть доступ к странице, прежде чем ядро ​​ее поменяет? Если так, что означает значение по умолчанию 60? И сколько изменится с шагом / уменьшением 1 (формула была бы хороша)?
Или он меняет страницы в зависимости от частоты их доступа?
Или что-то другое?


2
Да, swapiness является расплывчатым ;-)
ℝaphink

Ответы:


27

Начиная с версии ядра 2.6.28, Linux использует стратегию замены страницы Split Least недавно Used (LRU). Страницы с источником файловой системы, такие как текст программы или общие библиотеки, принадлежат кешу файлов. Страницы без поддержки файловой системы называются анонимными страницами и состоят из данных времени выполнения, таких как пространство стека, зарезервированное для приложений и т. Д. Как правило, страницы, принадлежащие файловому кешу, дешевле извлечь из памяти (так как при необходимости их можно просто прочитать с диска) , Поскольку у анонимных страниц нет резервной копии файловой системы, они должны оставаться в памяти до тех пор, пока они нужны программе, если только для этого не предусмотрено место подкачки.

vm.swappinessВариант вступает в игру в get_scan_count()определенном в mm/vmscan.c. get_scan_count()определяет, насколько настойчиво нужно сканировать анонимные и файловые списки LRU при поиске страниц для выселения. Значение каждого случая определяется плавающей средней недавно повернутых и недавно отсканированных соотношений, где более свежие ссылки имеют больший вес, чем более старые, чтобы учитывать изменяющуюся рабочую нагрузку системы.

Это vm.swappinessмодификатор, который изменяет баланс между заменой страниц файлового кэша в пользу анонимных страниц. vm.swappinessявляется значением приоритета для анонимных страниц, по умолчанию установлено значение 60 . Файловому кешу присваивается значение приоритета 200, из которого vm.swappinessвычитается модификатор ( file_prio=200-anon_prio). Это означает, что по умолчанию веса приоритетов стоят умеренно в пользу анонимных страниц ( anon_prio=60, file_prio=200-60=140). Однако, когда система близка к состоянию нехватки памяти , списки как анонимного, так и файлового LRU сканируются одинаково, если только vm.swappinessне установлено нулевое значение.

Когда vm.swappinessустановлено значение 100, приоритеты будут равны ( anon_prio=100, file_prio=200-100=100). Установка vm.swappinessв ноль предотвратит удаление ядром анонимных страниц в пользу страниц из файлового кэша.


Есть ли способ изменить swappiness file_prio? Или ограничить его конкретным каталогом?
CMCDragonkai

13

Существует формула, которая используется для вычисления того, какая страница будет заменена. В vmscan.cвы можете увидеть этот алгоритм:

тенденция обмена = mapped_ratio / 2 + distress + vm_swappiness

Здесь вы можете видеть, что перестановка - это масштаб, который добавляется в некоторый алгоритм, и вы можете управлять этим параметром, как ядро ​​будет вести себя, когда оно должно поменяться местами. Вы можете изобразить это как процент вероятности того, что какая-то неактивная страница памяти будет заменена. Если вы установили swappiness на 100, вероятность не будет, но есть гарантия, что она поменяется, и если вы установите ее на 0, ядро ​​будет пытаться вообще не менять местами, пока у него есть какая-то пустая память.


6

Говорят (я думаю, что Норман 1986), что часто кнопка «ЗАКРЫТЬ ДВЕРЬ» в лифте либо сломана, либо вообще никогда не была связана с чем-либо. Это делает эрзац контроль не способом манипулирования лифтом, а умиротворением чрезмерно спешного наездника.

Аналогичным образом, перестановка имеет эффект, не связанный с ее четко определенным, детерминированным контролем предиката ядра. Как было отмечено @neon_overlord на сайте askubuntu.com

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.