Що насправді керує параметром 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 використовує стратегію заміни сторінки найменш розповсюдженого (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нуль, це не дозволить ядру вилучати анонімні сторінки на користь сторінок із кеш-файлів.


Чи є спосіб змінити примхливість file_prio? Або обмежити його певним каталогом?
CMCDragonkai

13

Існує формула, яка використовується для обчислення того, яку сторінку буде розміщено. У vmscan.cцьому алгоритмі ви можете побачити:

тенденція до swap = mapped_ratio / 2 + distress + vm_swappiness

Тут ви можете побачити, що свопппінг - це шкала, яка додається в деякому алгоритмі, і ви можете керувати цим параметром, як буде вести себе ядро, коли воно повинне змінюватись. Ви можете визначити це як відсоток ймовірності того, що якась неактивна сторінка пам'яті буде замінена. Якщо встановити swappiness в 100, немає ймовірності, але гарантії, що він буде поміняти місцями, і якщо встановити його на 0, ядро ​​намагатиметься взагалі не міняти місцями, поки у нього є порожня пам'ять.


6

Було сказано (я думаю, Норман 1986), що часто кнопка "ЗАКРИТИ ДВЕРІ" в ліфті або зламана, або ніколи не підключалася ні до чого. Це робить контроль ersatz не способом маніпулювання ліфтом, а заспокоєнням надто поспішаючого вершника.

Аналогічним чином заміщення має ефект, не пов'язаний з чітко визначеним детермінованим керуванням присудком ядра. Як зазначив @neon_overlord на askubuntu.com

Оскільки більшість вважає, що заміна = погана, і якщо ви не зменшите свопп, система буде міняти місцями, коли цього насправді не потрібно. Жодне з них не є правдою. Люди пов'язують обмін із часом, коли їхня система забуває - однак, це в основному відбувається обмін, тому що система забивається, а не навпаки. Це правда, що є певні періоди, коли за заміну може бути помітно покарання, але зменшення простоти в цьому випадку може зменшити загальну продуктивність системи або стабільність іншими способами, які згодом можуть стати помітними ...

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.