Як запобігти заміні конкретної програми?


23

Чи можна не допустити, щоб певна програма (наприклад, ритмікс та його залежності) колись мінялася на диск?

Я запитую, тому що у мене виникають проблеми, коли музичний плеєр кидає щоразу, коли Chromium завищує занадто багато пам’яті. Чи є спосіб обійти це? Це вже не проблема в Windows, тому, мабуть, існує спосіб.


У Томбоя є та сама проблема. Це одна з причин, чому деякі люди перейшли на GNote .
Крістіан Цюпіту

1
Я думаю, що проблема гикавки не обов’язково викликана свопом. Якщо програма щось відтворює, Linux повинен помітити це, а не міняти його. Програми, які не роблять багато, - це перші, які поміняються місцями. Ви запустили psчи topпобачили, чи дійсно замінено rhytmbox, перевіривши RSS/ RESполе? Я думаю, що ваша проблема здебільшого викликана неправильним плануванням. Спробуйте спробувати reniceпроцес ритмбоксу або змінити деякі його настройки, наприклад, розмір аудіобуфера.
Крістіан Цюпіту

1
Спасибі! Чи є спосіб встановити початкове приємне значення програми? / тощо / nicetab чи щось таке? :)
Олексій Аверченко

Відповіді:


10

Я думаю, що проблема гикавки не обов’язково викликана свопом. Якщо програма щось відтворює, Linux повинен помітити це, а не міняти його. Програми, які не роблять багато, - це перші, які поміняються місцями. Ви можете перевірити, чи дійсно програма поміняється, переглянувши RSS/ RESполе з ps або вгорі . RSS- розмір набору резидентів, фізична пам'ять, що не замінюється, що використовується завданням (у кілобайтах).

Я думаю, що ваша проблема, швидше за все, викликана неправильним плануванням процесора та вводу / виводу та трохи неефективністю Rhythmbox, що робить його чутливим до великих навантажень системи. Пріоритет CPU можна змінити за допомогою команд nice та renike . Пріоритет вводу / виводу можна змінити за допомогою команди ionice . Лише суперкористувач може використовувати високі пріоритети. Також слід знати, що хлопці з ядра Linux намагаються покращити чутливість настільних систем за допомогою різних патчів з низькою затримкою, тому ви можете подумати про їх використання. Один з них - це патч ~ 200 рядків, написаний Майком Гальбрайтом, який вразив навіть Лінуса. Альтернативою цьому патчу є трюк групи «Леннарт Поеттерінг» що, на мою думку, буде стандартним у Fedora 15.

У будь-якому випадку, без цих патчів є два варіанти: запустити програму з високим пріоритетом або змінити її згодом. Для першого варіанту ви можете використовувати сценарій обгортки навколо Rhythmbox:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

Вам потрібно буде запустити його як root. Якщо ви не хочете увійти як корінь просто для того, щоб почати це, ви можете використовувати або suабо sudo.

Що стосується зміни пріоритету після цього, якщо ви ліниві увійти в систему як корінь, щоб змінити його, ви можете спробувати використовувати роботу cron, яка працює кожні 5 хвилин і встановлює пріоритет rhythmboxпроцесу, але я б не рекомендував це робити:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

Коротка відповідь: Ти не можеш і не повинен.

Здавна виконувані файли вшановували липкий біт, +tякий би сказав ядру не мінятися, але сьогодні це ігнорується.

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

Якщо ви дійсно не хочете міняти місцями, отримайте більше оперативної пам’яті або просто # swapoff -a(не рекомендується, може зробити вашу систему непридатною, якщо у вас вже є проблеми).

Shouldn'tвиходить, коли ви розробляєте якусь програму, і не хочете, щоб вона взагалі мінялася. Погляньте на цю публікацію на stackoverflow .


2
Я не думаю, що резервування близько 100 Мб вб'є мою систему. Можливо, є інший спосіб вирішити мою конкретну проблему (див. Відредаговане запитання)?
Олексій Аверченко

1
Якщо ви маєте намір підтримувати процес на високому рівні реагування на інші процеси, відповідь хороша (ви повинні мати корінь для цього). Заплутатися з підказками пам’яті непросто, якщо ви не хочете забруднити руки (торкніться коду, перекомпілюйте або навіть LD_PRELOAD створити власну бібліотеку, щоб обдурити процес і налаштувати функцію, яка використовується для розподілу пам'яті - знову ж таки, не рекомендується) . Поради? відновіть процес, отримайте більше оперативної пам’яті або перестаньте відкривати вкладки;)
Торіан,

5
"Якщо ядро ​​вирішить, що його потрібно міняти, воно впевнене, що має вагому причину", це неправда. Сьогодні у мене було 1,3 Г вільної пам’яті. Ядро Linux поставило мої процеси httpd в обмін (370 млн).
bluszcz

@bluszcz (ну, інші читають це з огляду на те, скільки років цей коментар): Це може бути тому, що він вирішив, що кеш-диск для файлів, що надсилаються вашим httpd, важливіший, ніж рідко використовувані частини самого httpd - дивіться інші відповіді згадуючи про "заміщення".
Ян Шейбаль

@JanSchejbal thats тому, що Linux, принаймні, не говоривши про це, не знає, які процеси важливі чи ні. У серверному середовищі ви повинні мати можливість сказати системі, які процеси важливі, а які - ні. "Мене не цікавлять інші речі, але ці процеси є найважливішими для роботи цього сервера"
Rahly


3

Існує кілька способів зробити це. Ви можете спробувати "говорить", щоб Linux працював менше за допомогою swap (як правило):

echo 10 > /proc/sys/vm/swappiness

З: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

свавілля

Цей елемент керування використовується для визначення того, наскільки агресивно ядро ​​буде обмінюватися сторінками пам'яті. Більш високі значення збільшать агресивність, нижчі значення зменшать кількість свопу.

Значення за замовчуванням - 60.

Інший варіант - використовувати менеджер ядра cgroups, це специфічно для кожного процесу, але вам доведеться виконати певну "роботу": Відповідь тут: /unix/10214/per-process-swapiness-for -linux # 10227


1
це впливає на заміщення в усьому світі, а не на конкретні процеси.
Лоренцо Фон Маттерхорн

1
так, ви можете помітити, що на "(загалом)" я писав. Можливість здійснювати процес - це посилання на іншу відповідь, використовуючи групи.
ceinmart

Тоді це не допомога, чи не так?
Кен Шарп

Кен Шарп: Ця відповідь є єдиною, що безпосередньо пов'язує те, що здається (принаймні на перший погляд) найкращим рішенням проблеми. Отже ... майже навпаки сказаного вами.
філс

@phils Ви не розумієте, як це працює.
Кен Шарп

0

Можна використовувати mlockall()syscall. mlockall () змушує процес пам'яті залишатися резидентним (= ні своп, ні перевиконання тощо). AFAIK, для цього немає команди оболонки, але її легко створити. Це виглядатиме так:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

Зауважте, для виклику потрібно мати root mlockall().

Однак, як сказано в іншій відповіді, я не думаю, що це дійсно те, чого ти хочеш.


1
Код взагалі не буде працювати, оскільки execvp - це фронт для виконання, який скасовує mlockall. Див. Розділ Примітки на манк-сторінці.
Йоганнес Матокич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.