Як приручити чутливість Linux, пам'ять та пейджинги


27

Перше питання про переповнення =) ... +100 баунті. Я не міг придумати щось, про що я насправді дбав:

Мені дуже до вподоби стан реагування на робочий стіл Linux, наприклад, http://brainstorm.ubuntu.com/item/85/ - у ситуаціях з низькою вільною оперативною пам’яттю або з високою пропускною здатністю диска система сповільнюється до повзати ; це абсолютно жахливо для додатків, які потребують гідного виконання. Крім того, інтерфейс користувача повністю не відповідає. Порівняйте це, наприклад, з OS X, де, якщо програма застосує ресурси, завжди можна натиснути на кнопку «Вийти з цього приводу», тоді як в Linux я не можу навіть клавішу alt-перемикання або переключення на робочий стіл або навіть ctrl-alt-f1, щоб отримати термінал - ну, можу, це займає приблизно 1-2 хвилини за операцію.

Я використовую gkrellm, щоб я міг бачити ситуацію, коли вона розгортається. Зазвичай використання пам'яті стає досить високим, або пропускна здатність диска різко скаче.

Це непогана апаратура, з чотирьохядерним процесором 2,6 ГГц та 4 ГБ оперативної пам’яті DDR2 800 МГц (мав би 6 Гб, але через апаратну несумісність не вдалося змішати та збігатися зі старим набором). Ця проблема може зникнути, коли я неминуче отримаю більше оперативної пам’яті, але я не відчуваю, що це суть проблеми. У мене навіть є два swap-розділи на різних дисках.

Я відчуваю, що проблема втричі:

  • утікаючі програми, які накопичують величезну кількість пам'яті - для цих програм повинен бути встановлений закон з обмеженням на їх кількість
    • (наприклад, вкладки на Chrome, кожна з яких 20-50 МБ, деякі з яких можуть використовувати сотні МБ)
    • (наприклад, інші програми, такі як update-db та індексатори, які мені довелося відключити та видалити з cron, оскільки вони сповільнювали систему до сканування кожного разу, коли вони запускалися тощо)
  • щось жахливе, що відбувається в ядрі чи шині, якесь таке, що ситуація з високою прохідністю диска сповільнює всю систему до сканування (можливо, підкачуючи важливі програми)
  • ядро не надає пріоритету користувальницькому інтерфейсу або важливим програмам з точки зору ресурсів, таких як пам'ять, підказка, навіть використання процесора

Оновлення переходять до:

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

Зокрема, мене заінтригує /etc/security/limits.conf( man limits.conf), але я переживаю, що це дає лише контроль за користувачем, а коментовані приклади у файлі здаються досить непростими з точки зору опису або з чого почати. Я сподіваюся, що це limits.confпрацює, але я не здивуюсь, якби це навіть не спрацювало, або якщо це не було відповідним рішенням моєї проблеми, або настільки детальним, як я намагаюся досягти. Ім’я для кожного процесу limits.confбуде ідеальним, якщо припустити, що limit.conf працює. Я був би радий спробувати обмеження.conf, яке люди надають, перевірити, чи працює він, хоча я зараз відкритий для всіх рішень.

Також може бути корисним уявлення про те, як OS X вдається підтримувати таку хорошу інтерфейс інтерфейсу користувача.

Я вже налаштував свої /tmpпапки та кеш-пам’яті tmpfs, і загалом використання диска майже до нуля.

Розпливчасті теми:

  • переповнення пам'яті

Відповіді, я не думаю, що спрацюють:

  • swapoff (це все ще дозволяє програмам свиней пам’яті відійти від вбивства, а система назавжди замерзає, якщо пам’ять справді погана - звертається до тих, хто може запропонувати налаштування, який раніше викликав убивцю OOM перед тим, як заміняти та націлювати конкретні програми)
  • echo ?? > /sys/.../swappiness (відсутність помітного ефекту)
  • nice (ніколи не працював)
  • ionice (ніколи не помічав різниці)
  • selinux (несумісність програми, здається, кошмар)
  • linux в реальному часі, тобто може перервати ядро ​​(не хочу мати справу з компіляцією та оновленням власного ядра; можливо, буде добре, якщо воно перенеслось у сховища)
  • *

хм, я, здається, не в змозі розмістити щедроту; Я думаю, що посилання не з’являється протягом 48 годин? ... ну я буду публікувати щедрість з усією репутацією, яку я придбав тоді
user76871

1
+1, це найбільша проблема, з якою у мене щодня є робочий стіл Linux. У мене періодично замерзають, можливо, раз на пару тижнів, але таких не досить часто, щоб особливо дратувати. Однак, здається, це проблема лише з додатками, які, як ви вже говорили, мають значне використання IO : Програми, що мають значне використання процесора, практично не впливають на загальну продуктивність системи. Не знаючи про ionice, здається, що це було б правильним рішенням цієї проблеми, якби вона працювала належним чином.
crazy2be

1
Через 3 роки, і це все ще проблема в Linux. @ crazy2be або user76871, я не думаю, що ти знайшов рішення тим часом?
Глютанімат

@Glutanimate: так, 32 Гб фізичної оперативної пам’яті і не менше (ну, можливо, 16 ГБ… але це підштовхує), також мааааайбе великі обсяги відео оперативної пам’яті. Це не виправляє безвідповідальність через високий процесор чи перебої або що-небудь ще, але це запобігає невідповідальність у ситуаціях з низькою пам’яттю.
user76871

Відповіді:


6

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

Замість того, щоб вставляти / tmp і "кеш" в tmpfs, я б використовував звичайну дискову файлову систему, змонтовану за допомогою noatimeпараметра. Дані, які часто використовуються, все одно залишаться в кешах, а старі дані можна записати на диск, щоб звільнити деяку оперативну пам’ять для додатків. Якщо / tmp та / або кеш зростає, це може дуже допомогти.


1
+1 для згадки noatime.
ЛоуренсC

Дякую за те noatime, що ви згадували , на жаль, я використовував цей варіант кріплення, і я не думаю, що це дуже допомогло забезпечити чуйність (хоча це допомагає тоні переконатися, що диск не перевантажений); просто, щоб переконатися, що я знову ввімкнув час мого поточного налаштування. Маючи не-tmpfs з noatime, здається трохи дивним, оскільки я все ще думаю, що масові записи повинні відбуватися.
user76871

+1, спробував vmstat 1- надзвичайно корисно при діагностуванні діагнозу, що заміни - це, власне, значна частина основного питання
user76871

2
Ой. Ніколи не бачив системи Linux, яка потребувала таких важких змін. Ви перевірили, df -mскільки пам'яті використовується у файлових системах tmpfs? Що - то буде є ваш RAM відносно швидко.
Turbo J

дякую за пропозицію та навчаючи мене про -mваріант. На жаль, df -h -mсхоже, вказується, що у мене є лише 100 Мб пам'яті tmpfs, тому я сумніваюся, що вона пов'язана будь-якою, якщо вона взагалі використовується з використанням пам'яті для tmpfs та кеш-пам'яті. Це також не здається таким рідкісним; У мене це траплялося на декількох дистрибутивах, коли їх оперативна пам'ять висувається до межі.
користувач76871

5

Я не розробник ядра, але я витрачав роки на те, щоб філософствувати над цим питанням, тому що я багато разів натрапляв на цей ооооо. Я фактично придумав метафору для всієї ситуації, тому дозвольте мені це сказати. У своїй історії я припускаю, що таких речей, як "своп", не існує. Заміни не має великого сенсу з 32 ГБ оперативної пам’яті в будь-який час.

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

Тепер мер (= ви) вирішує, що ви хочете відкрити великий ресторан (= браузер). У цьому ресторані розміститься кілька кухарів (= вкладки браузера). Кожному кухарю потрібно 1 одиниця води в секунду. Ви починаєте з 10 кухарів, тож загальне споживання води для всього мікрорайону становить 100 одиниць води, що все ще добре.

Тепер починається веселощі: ви наймаєте ще одного кухаря у свій ресторан, який забезпечує загальні потреби у воді 101, чого, очевидно, у вас немає. Вам потрібно щось зробити.

Управління водою (= ядро) має 3 варіанти.

1. Перший варіант - просто відключити послугу для будинків, які недавно не користувалися водою. Це добре, але якщо відключений будинок захоче знову використати воду, їм потрібно буде знову пройти довгий процес реєстрації. Керівництво може відключити кілька будинків, щоб звільнити більше водних ресурсів. Насправді вони відключать усі будинки, які останнім часом не вживали воду, таким чином залишаючи завжди доступною кількість безкоштовної води.

Хоча ваше місто продовжує функціонувати, недоліком є ​​те, що прогрес припиняється. Більшість вашого часу витрачається на очікування управління водою, щоб відновити послугу.

Це те, що ядро ​​робить із підтримуваними файлами сторінками. Якщо ви запускаєте великий виконуваний файл (наприклад, хром), його файл копіюється в пам'ять. Якщо не вистачає пам’яті або є частини, до яких недавно не можна було отримати доступ, ядро ​​може скинути ці частини, оскільки воно може перезавантажити їх з диска в будь-якому випадку. Якщо це зроблено надмірно, це перерве ваш робочий стіл, оскільки все буде просто чекати дискового вводу. Зауважте, що ядро ​​також викине багато останніх використаних сторінок, коли ви почнете робити багато IO. Ось чому для переходу на фоновий додаток потрібні віки після того, як ви скопіювали кілька великих файлів, таких як зображення DVD.

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

sed -i 's/may_unmap = 1/may_unmap = (vm_swappiness >= 0)/' mm/vmscan.c

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

2.Керівництво може відхилити запит нового кухаря про воду. Це спочатку звучить як гарна ідея. Однак є два мінуси. По-перше, є компанії, які вимагають багато передплати на воду, навіть не використовуючи їх. Однією з можливих причин цього є уникнення всіх накладних розмов з управлінням води, коли вони потребують додаткової води. Їх споживання води збільшується вгору і вниз, залежно від часу доби. Наприклад, у випадку з рестораном, компанії потрібно набагато більше води протягом полудня порівняно з півночі. Тому вони просять всю можливу воду, яку вони можуть використовувати, але це витрачає виділення води протягом півночі. Проблема полягає в тому, що не всі компанії можуть правильно передбачити своє пікове використання, тому вони вимагають набагато більше, сподіваючись, що їм ніколи не потрібно буде турбуватися про запити більше.

Це те, що робить віртуальна машина Java: вона виділяє купу пам'яті при запуску, а потім працює з цього. За замовчуванням ядро ​​виділяє пам'ять лише тоді, коли ваша програма Java фактично почне її використовувати. Однак якщо ви відключите перезавантаження, ядро ​​сприйме резервування серйозно. Це дозволить розподілу досягти успіху лише в тому випадку, якщо він насправді має ресурси для цього.

Однак існує ще одна, більш серйозна проблема з цим підходом. Скажімо, одна компанія починає запитувати одну одиницю води щодня (а не з кроків 10). Зрештою ви досягнете стану, коли у вас є 0 безкоштовних одиниць. Тепер ця компанія не зможе виділити більше. Це добре, хто все одно переймається великими компаніями. Але проблема в тому, що і малі будинки не зможуть вимагати більше води! Ви не зможете побудувати невеликі громадські санвузли для боротьби з раптовим напливом туристів. Ви не зможете забезпечити аварійну воду для пожежі в сусідньому лісі.

В комп'ютерному відношенні: у ситуаціях з дуже низькою пам’яттю без перевиконання ви не зможете відкрити новий xterm, ви не зможете ssh у свою машину, ви не зможете відкрити нову вкладку для пошуку можливих виправлення. Іншими словами, вимкнення режиму перевиконання також робить ваш робочий стіл непотрібним, коли не вистачає пам'яті.

3. Тепер ось цікавий спосіб вирішення проблеми, коли компанія починає вживати занадто багато води. Управління водою підірває це! Буквально: він заходить на сайт ресторану, кидає в нього динамітів і чекає, поки він вибухне. Це миттєво скоротить потреби води у місті в значній мірі, щоб нові люди могли переселитися, ви могли створити громадські ванні кімнати тощо. Ви, як міський голова, можете відновити ресторан, сподіваючись, що цього разу йому буде потрібно менше води. Наприклад, ви скажете людям не ходити в ресторани, якщо всередині занадто багато людей (наприклад, ви відкриєте менше вкладок браузера).

Це насправді те, що ядро ​​робить, коли у нього закінчуються всі параметри і йому потрібна пам'ять: він викликає вбивцю OOM. Він підбирає велику програму (на основі багатьох евристик) і вбиває її, звільняючи купу пам'яті, але підтримуючи чуйний робочий стіл. Насправді ядро ​​Android робить це ще більш агресивно: воно вбиває найменш використовуваний додаток, коли пам’яті мало (порівняно з біржовим ядром, яке робить це лише в крайньому випадку). Це називається вбивця вікінгів в Android.

Я думаю, що це одне з найпростіших варіантів вирішення проблеми: це не так, як у вас є більше варіантів, ніж це, то чому б не подолати її раніше, ніж пізніше, правда? Проблема полягає в тому, що ядро ​​іноді робить досить багато роботи, щоб уникнути виклику вбивці OOM. Ось чому ви бачите, що ваш робочий стіл дуже повільний і ядро ​​нічого не робить з цим. Але на щастя, є можливість самому викликати вбивцю OOM! По-перше, переконайтеся, що магічна клавіша sysrq увімкнена (наприклад, echo 1 | sudo tee /proc/sys/kernel/sysrqпотім, коли ви відчуєте, що ядро ​​втрачає пам'ять, просто натисніть Alt + SysRQ, Alt + f.

Гаразд, все, що приємно, але ви хочете спробувати? Ситуація з низькою пам’яттю відтворюється дуже просто. У мене є дуже просте додаток для цього. Вам потрібно буде запустити його двічі. Перший запуск визначить, скільки вільної оперативної пам’яті у вас є, другий запуск створить ситуацію з низькою пам’яттю. Зверніть увагу, що цей метод передбачає, що ви замінили своп (наприклад, зробіть a sudo swapoff -a). Код та використання:

// gcc -std=c99 -Wall -Wextra -Werror -g -o eatmem eatmem.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int limit = 123456789;
    if (argc >= 2) {
        limit = atoi(argv[1]);
    }
    setbuf(stdout, NULL);
    for (int i = 1; i <= limit; i++) {
        memset(malloc(1 << 20), 1, 1 << 20);
        printf("\rAllocated %5d MiB.", i);
    }
    sleep(10000);
    return 0;
}

Ось як ви це використовуєте:

$ gcc -std=c99 -Wall -Wextra -Werror -g -o eatmem eatmem.c
$ ./eatmem
Allocated 31118 MiB.Killed
$ ./eatmem 31110
Allocated 31110 MiB.Killed

Перший виклик виявив, що ми маємо 31,118 МБ вільної оперативної пам’яті. Тому я сказав програмі виділити 31,110 Мб оперативної пам’яті, щоб ядро ​​її не вбивало, а з'їдало майже всю мою пам'ять. Моя система замерзла: навіть вказівник миші не зрушив з місця. Я натиснув Alt + SysRQ, Alt + f, і це знищило мій процес eatmem, і система відновилася.

Незважаючи на те, що ми висвітлювали наші варіанти того, що робити в умовах низької пам'яті, найкращий підхід (як і будь-яка інша небезпечна ситуація) - це уникати його в першу чергу. Існує багато способів зробити це. Один із поширених способів, який я бачив, - це помістити недоброзичливі програми (наприклад, браузери) в інші контейнери, ніж у решті системи. У такому випадку браузер не зможе впливати на ваш робочий стіл. Але сама профілактика виходить за рамки питання, тому я не пишу про це.

TL; DR: Хоча в даний час не існує можливості повністю уникнути пейджингу, ви можете пом'якшити повну зупинку системи, відключивши перезавантаження. Але ваша система все ще буде непридатною під час ситуації з низькою пам'яттю, але по-іншому. Незалежно від вищезазначеного, у ситуації з низькою пам’яттю натисніть Alt + SysRQ, Alt + f, щоб знищити великий процес вибору ядра. Ваша система повинна відновити свою чутливість через кілька секунд. Це передбачає, що у вас включена чарівна клавіша sysrq (вона не є за замовчуванням).


Я дав тобі всю свою репутацію, яка була винагородою за цей ресурс, тому я не міг навіть залишити коментар :) Нарешті, я заробив, щоб сказати спасибі за цю чудову відповідь! Я займався цією проблемою весь час, коли у мене був ноутбук з 8 Гб (божевільний, але моя система в ті дні регулярно виходила з пам’яті). Нещодавно я знайшов цей проект: github.com/rfjakob/earlyoom , який може допомогти запобігти зависанню системи, вбиваючи деякі процеси, поки не пізно.
Влад Фролов

4

Якщо помістити всі ваші тимчасові файли та кеш-файли, tmpfsце зменшує кількість вільної оперативної пам’яті, тому ви можете змусити систему перейти на обмін раніше, ніж потрібно.

Здається, у вас є деякі додатки, які покладаються на якусь установку ядра або драйвер, який перевантажується. Ви не надто детально описуєте, які типи додатків, окрім ви використовуєте браузери та індексатори, і що ви відключили індекси.

Ви можете спробувати перейти на робоче середовище або менеджер вікон, який споживає менше ресурсів, таких як LXDE або IceWM. На роботі я використовую систему Linux із встановленим LXDE та ROX-Filer для дуже мінімального робочого середовища. Мета цієї системи Linux - запустити програвач VMWare Player, щоб я міг одночасно запускати Windows XP та Windows 7. Це схоже технічне завдання на те, що ви говорите, і я не маю занадто багато проблем зі швидкістю реагування під цим великим навантаженням, через яке я вкладаю обладнання. У мене немає ніяких проблем чуйності з самого Linux (зазвичай це віртуальні машини , які іноді змушують мене чекати другий, і обмін 1 диск між 2 віртуальних машин + 1 OS очікується , що це) , і завжди були в стані призупинити або виключення віртуальних машин завжди , коли Я хочу.

Тож для мене це вказує на певну проблему з конкретними програмами, які ви запускаєте.

Чи ввімкнено DMA для ваших дисководів? (використання hdparm) Якщо ви використовуєте повне дискове шифрування, для цього потрібен весь дисковий трафік, який проходить через процесор, що заперечує значну частину переваг DMA. Ефект цього полягатиме в тому, що великий дисковий трафік спричиняє сплеск процесора, що потім сповільнить всю систему. (EDIT: для уточнення, вимкнення DMA або АБО dm-cryptспричинить високий процесор під час великого дискового трафіку)


2
Суть питання полягає не в тому, що WM роздувається і змушує систему повільно ставати (вона, швидше за все, чудово реагує при нормальному використанні), а в тому, що ядро ​​не належним чином визначає пріоритетність програм, коли у нього не вистачає пам'яті, і він повинен перейти в важкі заміни. Я мав цю проблему на кожному робочому столі Linux, який я коли-небудь використовував, і хоча використання легших програм або додавання більше оперативної пам'яті може допомогти, це не вирішує корінь проблеми.
crazy2be

У своєму попередньому дописі я говорив наступне: "Здається, у вас є деякі програми, які покладаються на якусь функцію ядра або драйвер, який перевантажується". Тож можливо вузьке місце знаходиться в конкретному модулі ядра. Я не фахівець з ядра, але впевнений, що розподіл пам'яті з боку ядра, особливо з боку модуля, працює інакше, ніж на стороні користувача. Використання процесора на стороні ядра також, ймовірно, обробляється по-різному (не знаю, чи можна "приємно" процесувати ядро). Я не можу далі коментувати, не знаючи конкретних програм.
LawrenceC

Також якщо ви використовуєте FUSE NTFS, які можуть спричинити повільність.
LawrenceC

1
Мені відомо, що файлова система на основі оперативної пам’яті, наприклад, tmpfs (очевидно), приводить до швидшого виходу оперативної пам’яті, і що легкий WM може трохи зменшити симптоми основної проблеми. Я відчував тиск для використання tmpfs через погану чутливість запису на диск. Тим не менше дякую за вашу пропозицію, особливо частину про DMA, яку я додав до переліку можливо пов’язаних тем. Для запису я вважаю, що DMA включена, і я не використовую криптографічну файлову систему.
user76871

1

Це поширена проблема з планувальником Linux. Система сповільнюється до повзання, коли виникають важкі дії вводу-виводу. Насправді не так багато речей ви могли б зробити, щоб покращити ситуацію, якщо ви не зламаєте ядро ​​:)

Можливо, це може допомогти:

http://www.phoronix.com/scan.php?page=article&item=linux_2637_video&num=1

http://www.osnews.com/story/24223/Alternative_to_the_200_Lines_Kernel_Patch_that_Does_Wonders_


1
Як я пам’ятаю, ці патчі ядра дійсно актуальні лише у тому випадку, якщо ви компілюєте програму або робите щось інше, що в терміналі дуже важке для процесора (і IO?) , Намагаючись взаємодіяти з додатками GUI. Це не допомагає у більш поширеній ситуації, коли одна програма GUI виконує важку роботу, і ви, на жаль, намагаєтесь працювати з іншим додатком GUI.
crazy2be

0

Навіть незважаючи на те, що питання вже за два роки, і відповідь @ ypsu чудова, ситуація з ОС на базі Linux виходить поганою через відсутність оперативної пам’яті.

Ось моє спостереження щодо проблеми: навіть якщо у мене взагалі не відбувається заміни, коли система не вистачає пам’яті, індикатор жорсткого диска загорається, оскільки це 100% завантаження диска. Зважаючи на цей факт, здається, що першопричиною є те, що ядро ​​намагається звільнити пам'ять, вивантаживши щось, що можна відновити з диска, а це, звичайно, спільні бібліотеки. Оскільки у програмах GUI зазвичай є багато спільних бібліотек, схоже, що система може подумати, що достатньо просто вивантажити деякі з них, але це працює лише до наступної операції в просторі користувача, яка вимагає повернення цих незавантажених бібліотек назад. Здається, це найбільш вірогідний сценарій, що спричиняє нескінченний цикл вивантаження спільних бібліотек та їх завантаження назад.

Існує проект, який виконує функцію демона простору користувача, вбиваючи найбільш спогадні для пам'яті процеси, поки не пізно: https://github.com/rfjakob/earlyoom

Також я використовував контейнери Docker із обмеженими можливостями пам’яті для додатків, які відчувають пам'ять (наприклад, Chrome).

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