Як я можу використовувати промінні місця для надзвичайних ситуацій?


41

У мене ноутбук Debian (Buster) з 8 ГБ оперативної пам’яті та 16 Гб свопом. Я виконую дуже довге завдання. Це означає, що мій ноутбук був залишений упродовж останніх шести днів, поки він перебігає.

Роблячи це, мені періодично потрібно використовувати свій ноутбук як ноутбук. Це не повинно бути проблемою; довге завдання, пов'язане з введенням / виведенням, працює над матеріалами на жорсткому диску USB і не займає багато оперативної пам'яті (<200 МБ) або процесора (<4%).

Проблема полягає в тому, що коли я повернуся до свого ноутбука через кілька годин, він буде дуже млявим і може зайняти 30 хвилин, щоб повернутися до нормального стану. Це настільки погано, що монітори аварійних зборів позначають їхні програми на заморожених (особливо вікна браузера) і все починає неправильно виходити з ладу.

Дивлячись на системний монітор, 2,5 Гб, що використовується близько половини, переходить на своп. Я підтвердив, що це проблема, видаливши swap space ( swapoff /dev/sda8). Якщо я залишу його без місця заміни, він повернеться до життя майже миттєво навіть через 24 години. З заміною, це практично цегла, за перші п’ять хвилин залишилось лише шість годин. Я підтвердив, що споживання пам’яті ніколи не перевищує 3 Гб, навіть коли я відсутній.

Я спробував зменшити свопчість ( див. Також: Вікіпедія ) до значень 10та 0, але проблема все ще зберігається. Здається, що після дня бездіяльності ядро ​​вважає, що весь графічний інтерфейс більше не потрібен, і витирає його з оперативної пам’яті (замінює його на диск). Завдання, що триває, - читання через величезне дерево файлів і читання кожного файлу. Тому ядро ​​може заплутатися в думці, що кешування допоможе. Але при одночасному переході на 2 ТБ USB HD з ~ 1 мільярдом імен файлів додаткова ГБ оперативної пам’яті не допоможе значною ефективністю. Це дешевий ноутбук з млявим жорстким диском. Він просто не може завантажити дані назад в оперативну пам'ять досить швидко.

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

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


Що таке надзвичайна ситуація? - Вам справді треба запитати? ... Сподіваюся, ви ніколи не опинитесь у палаючій будівлі!

Мені неможливо визначити все, що може стати надзвичайною ситуацією в цьому питанні. Але, наприклад, може виникнути надзвичайна ситуація, коли ядро ​​настільки натиснуто на пам'ять, що воно починає вбивати процеси з убивцею OOM . Надзвичайна ситуація НЕ, коли ядро ​​думає, що може покращити продуктивність за допомогою swap.


Остаточне редагування: я прийняв відповідь, яка робить саме те, про що я просив на рівні операційної системи. Майбутні читачі також повинні взяти до відома відповіді, що пропонують рішення на рівні додатків.


11
Визначте "надзвичайний стан" і скажіть щось про те, чим це відрізняється від будь-якої звичайної ситуації, коли використовується swap.
Kusalananda

4
Мені хотілося дізнатись, чи хочете ви якось визначити особливий тип "надзвичайної події" поза межами, який дозволив би ядру використовувати swap, але цей swap інакше не використовується. AFAIK виклик пам'яті - це те, що повільно, і все це робиться лише в "надзвичайних ситуаціях", і "заміщення" - це єдине, з чим ви можете скоригувати цю поведінку (але я не користувач Linux).
Kusalananda

2
Ні, це не правильно. Це робиться не тільки в надзвичайних ситуаціях. Принаймні, я подумав, що в моєму питанні було зрозуміло, що я використовував лише 3 ГБ з 8 ГБ ... Це навряд чи надзвичайна ситуація, але ядро ​​все одно поміняється. Я пропоную вам почитати про свобідність та навколишні теми. Існує досить багато дискусій щодо різних причин заміни. Це правдоподібно, я прошу про концепцію, яка не існує в ядрі, але мої причини просити її досить обґрунтовано ..
Філіп Кулінг,

4
Я усвідомлюю, що порада завжди була "ніколи не бігайте без свопу". Але розміри пам'яті зменшили масштаб жорсткого диска (жорсткий диск не SSD), швидкість читання / запису означає, що своп все частіше є поганою ідеєю. Схоже, деякі вважають, що 8GB оперативної пам’яті + 8GB своп виконає 16 Гб оперативної пам’яті + 0 своп. Якщо це справді, то з ядром Linux щось не так.
Філіп Кулінг

7
@Philip Couling: Ні, справа в тому, що 16 Гб оперативної пам’яті + 16 ГБ своп перевищить 16 ГБ і 0 своп - особливо коли ваш код потребує 17 ГБ пам’яті :-)
jamesqf

Відповіді:


11

В даний час такий величезний обмін часто є поганою ідеєю. На той момент, коли ОС замінила лише кілька ГБ оперативної пам’яті для заміни, ваша система вже переповзла (наприклад, що ви бачили)

Краще використовувати zramз невеликим резервним розділом swap . Багато ОС, як ChromeOS, Android та різні дистрибутиви Linux, роками дозволяють використовувати zram за замовчуванням, особливо для систем з меншою пам’яттю оперативної пам’яті. Це набагато швидше, ніж робити заміну на жорсткому диску, і ви чітко можете відчути чутливість системи в цьому випадку. Менше на SSD, але згідно з результатами тестування, він все ще здається швидшим, навіть якщо алгоритм lzo за замовчуванням. Ви можете змінити на lz4 для ще кращої продуктивності з трохи меншим співвідношенням стиснення. Це швидкість декодування майже в 5 разів швидша, ніж lzo на основі офіційного орієнтиру

Є також, zswapхоча я ніколи його не використовував. Напевно, варто спробувати і порівняти, який з них краще для ваших випадків використання

Після цього ще одна пропозиція - зменшити пріоритет цих процесів, пов'язаних з IO, і, можливо, залишити термінал, який працює з більш високим пріоритетом, щоб ви могли запускати команди на ньому відразу, навіть коли система знаходиться на великому навантаженні

Подальше читання


Просто для того, щоб я зрозумів, ви говорите, що я можу створити zramблоковий пристрій, використовувати його як своп, із заміною нижчого пріоритету як розділ HDD?
Філіп Кулінг

@PhilipCouling, якщо ви використовуєте жорсткий диск, то так, безумовно, ви повинні використовувати zram або подібні рішення. Пріоритет swap повинен бути нижчим, ніж zram, так що Linux спробує спочатку використовувати zram, а потім він розгляне своп. Якщо ви використовуєте Ubuntu, пакет zram-config вже піклується про параметри пріоритету для вас
phuclv

3
Я приймаю цю відповідь, тому що, здається, виконується саме те, про що я просив. Якщо у мене все ще ввімкнено своп 16 Гб із зменшеним пріоритетом, ядро ​​використовуватиме його лише тоді, коли zswap вичерпано. IE: "у надзвичайній ситуації". Зверніть увагу на debian-buster, це дуже легко встановити, просто встановивши zram-інструменти.
Філіп Кулінг

25

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

Якщо ви використовуєте systemd, ви можете встановити +MemoryAccounting=yesі MemoryHigh/ MemoryMaxабо MemoryLimit(залежно від того, якщо ви використовуєте cgroup v1 або v2) в блоці, або фрагмент, що містить його. Якщо це фрагмент, його можна використовувати systemd-runдля запуску програми в фрагменті.

Повний приклад однієї з моїх систем для запуску Firefox з обмеженням пам’яті. Зауважте, що для цього використовується cgroups v2 і встановлюється як мій користувач, а не root (одна з переваг v2 над v1 - те, що делегування цього не-root є безпечним, так це робить systemd).

$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

Я знайшов, щоб користувач працював, мені довелося використовувати фрагмент. Системна система працює лише шляхом введення параметрів у файл служби (або використання systemctl set-propertyв сервісі).

Ось приклад служби (використовуючи cgroup v1), зверніть увагу на останні два рядки. Це частина екземпляра системи (pid = 1).

[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G

Документація знаходиться в systemd.resource-control(5).


1
Ви не можете зробити щось порівнянне та портативне, просто використовуючи ulimit?
Старий Про

1
@OldPro не дуже. По-перше, AFAIK не обмежує загальне використання пам’яті, включаючи кеш-сторінки (це використання тут стає надмірним). По-друге, обмеження для пам’яті - це процес, і групи працюють навіть у тому випадку, коли довгі завдання викочуються.
дероберт

Я вважав, що причина обліку пам’яті включена за замовчуванням у нових системах через зміну systemdверсії 238 .
sourcejedi

1
@sourcejedi, це порівняно недавно. Коли вперше був представлений контролер пам'яті, його наявність (навіть не використовується) мала достатню вартість продуктивності, щоб деякі дистрибутиви принаймні відключили його за замовчуванням, і вам довелося передати цей аргумент командного рядка ядра, щоб увімкнути його. Проблеми з продуктивністю були виправлені, так що змінилися, а останнім часом systemd активує його також за замовчуванням.
дероберт

14

Здається, що після дня бездіяльності ядро ​​вважає, що весь графічний інтерфейс більше не потрібен, і витирає його з оперативної пам’яті (замінює його на диск).

Ядро робить правильну річ ™, вірячи в це. Чому він би зберігав невикористану 1 пам'ять в оперативній пам’яті і так по суті витрачав її, а не використовував її як кеш чи щось?

Я не думаю, що ядро ​​Linux безперешкодно чи не передбачає заміни сторінок, тому, якщо це зробити, це потрібно зберегти щось інше в оперативній пам’яті, тим самим покращуючи ефективність вашої тривалої задачі або, принаймні, з цією метою.

Якщо ви знаєте, коли вам потрібно буде заздалегідь повторно використовувати ваш ноутбук, ви можете скористатися atкомандою (або crontab) для планування очищення підкачки ( swapoff -a;swapon -a).

Як чистка свопу може бути зайвим і навіть викликати ОИЙ вбивця , якщо з якоїсь - то причини, не всі підходять в оперативній пам'яті, ви могли б просто «unswap» 2 всі , що пов'язано з запущеними додатками , які ви хочете , щоб оживити.

Один із способів зробити це - приєднати налагоджувач, як і gdbдо кожного із порушених процесів, і запустити генерацію дампів:

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

Як ви писали, ваша довговічна програма не повторно використовує дані, які вона читає після первинного пропуску, тому ви знаходитесь в конкретному випадку, коли довготривале кешування не корисне. Тоді обхід кеш-пам'яті за допомогою прямого вводу-виводу, як запропонував Вілл Кроуфорд, повинен бути хорошим вирішенням.

Крім того, ви можете просто регулярно обробляти кеш файлів за допомогою відлуння 1або 3до /proc/sys/vm/drop_cachesпсевдофайлу, перш ніж ОС вважає, що це гарна ідея замінити свої GUI-програми та оточення.

Див. Як випорожнюєте буфери та кеш у системі Linux? для деталей.

1 Невикористаний у значенні: більше не використовується активно протягом значного періоду часу, пам'ять як і раніше має відношення до його власників.
2 Поставте назад на сторінки ОЗУ, що зберігаються на ділянці підкачки.


2
Дякуємо за думку про можливі причини. Я трохи додав питання, оскільки це може бути актуальним. Цікаво, чи є спосіб знизити пріоритет кешування проти власної пам’яті програми.
Філіп Кулінг

5
"Я не думаю, що ядро ​​Linux безоплатно або випереджально заміняє сторінки, тому, якщо він це робить, це повинно бути для зберігання чогось іншого в оперативній пам'яті, тим самим підвищуючи продуктивність." - Я думаю, що це формулювання дещо неоднозначне. Ядро обов'язково записує сторінки для обміну, коли це є можливість (наприклад, вводу / виводу диска мало). Однак це не видалить їх з оперативної пам'яті. Таким чином, у вас є найкраще з обох світів: якщо вам швидко потрібні ці сторінки, вони вже знаходяться в оперативній пам'яті, і нічого робити. Якщо виникла надзвичайна ситуація (як зазначає ОП), вам просто знадобиться звільнити ці сторінки в оперативній пам’яті, адже
Jörg W Mittag

3
… Вони вже в свопі. І саме тому ви не хочете використовувати своп "лише в надзвичайних ситуаціях", адже під час надзвичайної ситуації система вже перебуває під напругою, і останнє, що вам потрібно, - це додати велику кількість дискових вводу-виводу.
Йорг W Міттаг

2
Те, що змушує його помінятися, - це, ймовірно, тривалий процес: це доступ до файлів на диску. Ці файли в пам'яті будуть використані недавно, ніж пам'ять GUI.
jpmc26

3
@ JörgWMittag Чи є у вас докази, що ядро ​​Linux, коли використання вводу-виводу є низьким, превентивно записує сторінки в область свопу "на всякий випадок", тобто не звільняючи їх від оперативної пам'яті?
jlliagre

10

Це процес, за допомогою якого ви виконуєте щось, що ви створили самі?

Якщо це так, можливо, варто налаштувати ваш код, щоб відкрити файли за допомогою O_DIRECTпрапора, які цитують сторінку керівництва -

Спробуйте звести до мінімуму ефекти кешу вводу / виводу на цей файл і з нього. Загалом це погіршить продуктивність, але це корисно в особливих ситуаціях, наприклад, коли програми роблять кешування самостійно. Введення / виведення файлів виконується безпосередньо в / з буферів простору користувача. Прапор O_DIRECT самостійно докладає зусиль для передачі даних синхронно, але не дає гарантій прапора O_SYNC щодо передачі даних та необхідних метаданих. Для забезпечення синхронного вводу-виводу, крім O_DIRECT, слід використовувати O_SYNC. Див. ПРИМІТКИ нижче для подальшого обговорення.


1
Інший подібний (але, мабуть, простіший, оскільки я впевнений, що O_DIRECT має обмеження вирівнювання, і ви будете вбивати продуктивність, якщо ваші показання не великі) - це fadvise, щоб сказати ядру, що вам більше не знадобляться ці дані, видаляючи їх з кеш сторінки (по телефону або надаватимуть посилання, вибачте)
derobert

1
@derobert Для однієї nocacheкоманди це зручний хак для цього. (Він використовує LD_PRELOAD для викрадення деяких дзвінків libc).
sourcejedi

6

Ось ідея, яку я ще не пробував (і мені дуже шкода, що зараз не встиг експериментувати з цим).

Припустимо, ви створили невеликий VM з пам'яттю лише 512 Мб для вашого фонового процесу. Я не впевнений, чи хочете ви, щоб у вас відбувся будь-який своп, ваш дзвінок та вимкнено своп у вашій хост-системі.


3

Видаліть своп або зменшіть його приблизно на 20% ( може змінюватися залежно від систем ), оскільки останнім часом ОС вже не використовують своп так само, як це було зроблено за кілька років тому. Це, ймовірно, відповідає на ваше запитання:

-> офіційний redhat.com

деякі відомості про Червону Шапочку нижче,

Раніше деякі постачальники програм рекомендували проводити заміну розміром, рівним ОЗУ, або навіть вдвічі більше ОЗУ. Тепер давайте уявимо вищезгадану систему з 2 Гб оперативної пам’яті та 2 ГБ свопу. База даних у системі була помилково налаштована для системи з 5 Гб оперативної пам’яті. Як тільки фізична пам'ять буде використана, своп звикає. Оскільки диск із свопом значно повільніше, ніж оперативна пам'ять, продуктивність знижується, і відбувається обмолот. У цей момент навіть вхід у систему може стати неможливим. Коли все більше і більше пам'яті записується, з часом фізична та обмінна пам'ять повністю вичерпуються, і вбивця OOM запускається, вбиваючи один або кілька процесів. У нашому випадку доступно досить багато свопів, тому час низької продуктивності довгий.

і

https://wiki.debian.org/Swap

частина посилання Debian вище,

Інформація та міркування, пов’язані із сумою свопу для використання:

"Рекомендований об'єм місця для обміну традиційно вдвічі перевищує об'єм системної пам'яті. Це з часом змінилося в півтора рази системну пам'ять, обидві відповіді є пристойними базовими рівнями, але з часом стає все менше і менш корисними відповідями на питання. Існує багато змінних щодо вашої системи та призначеного використання, які визначатимуть наявний у вас системний своп ".

Ви можете спробувати:

"Найкращий спосіб відключити swap в Linux"


Особиста примітка:


Так як у мене є 6 Гб оперативної пам’яті та в усіх моїх нещодавно ОС Linux. Я ніколи не бачив жодних ознак використання Swap. Я визначив це, я мушу вимкнути його або для простору (на кілька гігабайт більше), і тому, що іноді він уповільнює роботу моєї системи.


1
Раніше деякі постачальники програм рекомендували проводити заміну розміром, рівним ОЗУ, або навіть вдвічі більше ОЗУ. Я відчуваю це набагато старше, бачачи це, якось ... Хоча я все ще маю один із жорстких дисків на бар'єрі ~ 528 МБ, а також 2,5 Гб, якось цитата - ну це щось із дуже давнього часу ... Цікава цитата, хоча і це може пояснити, чому я бачив подібні проблеми кілька років тому. Я вважаю, що я використовував sysctl, щоб виправити це, але я не пам’ятаю, який саме параметр був напередодні.
Прифтан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.