19

Можно ли предотвратить какую-либо конкретную программу (т. Е. Rhythmbox и ее зависимости) от загрузки на диск?

Я спрашиваю, потому что у меня есть проблема, когда музыкальный проигрыватель икает, когда Chromium перегружает память. Есть ли способ обойти это? Это больше не проблема в Windows, так что, вероятно, есть способ.

5 ответов5

9

Я думаю, что проблема сбоя не обязательно вызвана обменом. Если программа что-то играет, Linux должен это заметить, а не менять местами. Программы, которые мало что делают - это первые, которые меняются местами. Вы можете проверить, действительно ли программа поменялась местами, посмотрев на поле RSS/RES с ps или top. RSS - это размер резидентного набора, физическая память без перестановки, используемая задачей (в килобайтах).

Я думаю, что ваша проблема, скорее всего, вызвана неправильным планированием процессора и ввода-вывода и некоторой неэффективностью Rhythmbox, что делает его чувствительным к высоким системным нагрузкам. Приоритет процессора можно изменить с помощью команд nice и renice. Приоритет ввода / вывода можно изменить с помощью команды ionice. Только суперпользователь может использовать высокие приоритеты. Вы также должны знать, что ребята из ядра Linux пытаются улучшить быстродействие настольных систем с помощью различных патчей с низкой задержкой, поэтому вы можете рассмотреть возможность их использования. Одним из них является патч ~ 200 строк, написанный Майком Гэлбрейтом, который поразил даже Линуса. Альтернативой этому патчу является трюк cgroups от Lennart Poettering, который, я думаю, будет использоваться по умолчанию в 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. Если вы не хотите входить в систему как root, чтобы начать это, вы можете использовать su или sudo .

Что касается последующего изменения приоритета, если вам лень входить в систему как пользователь root, чтобы изменить его, вы можете попробовать использовать задание cron, которое запускается каждые 5 минут и устанавливает приоритет процесса rhythmbox , но я бы не рекомендовал делать это :

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

Краткий ответ: Вы не можете и не должны.

Давным-давно исполняемые файлы использовали залипший бит +t который говорил бы ядру не обмениваться, но сегодня он игнорируется.

Если ядро решит, что оно должно поменяться местами, у него есть веская причина. Linux очень агрессивно использует память, потому что ОЗУ, которое не используется, является потраченным впустую ресурсом.

Если вы действительно не хотите менять местами, получать больше оперативной памяти или просто # swapoff -a (не рекомендуется, может сделать вашу систему непригодной для использования, если у вас уже есть проблемы).

Shouldn't идти, когда вы разрабатываете какое-то приложение и вообще не хотите, чтобы оно менялось. Посмотрите на этот пост на stackoverflow.

3

Есть несколько способов сделать это. Вы можете попытаться попробовать "говорит" Linux работать меньше с помощью swap (как правило):

echo 10 > /proc/sys/vm/swappiness

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

swappiness

Этот элемент управления используется для определения того, насколько агрессивно ядро будет менять страницы памяти. Более высокие значения увеличат агрессивность, более низкие значения уменьшат объем обмена.

Значение по умолчанию - 60.

Другой вариант - использовать менеджер ядра cgroups, это зависит от конкретного процесса, но у вас будет некоторая "работа": Ответ здесь: https://unix.stackexchange.com/questions/10214/per-process-swapiness-for -linux # 10227

2

Здесь, кажется, уже был дан ответ:

https://stackoverflow.com/questions/578137/can-i-tell-linux-not-to-swap-out-a-particular-processes-memory

Хотя согласие таково, что вы, вероятно, не должны:/

0

Вы можете использовать системный вызов mlockall() . mlockall() заставляет процесс памяти быть резидентным (= без подкачки, без перегрузки и т. д.). AFAIK, нет команды оболочки, чтобы сделать это, но ее легко создать. Это будет выглядеть так:

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

Обратите внимание, что вы должны быть пользователем root для вызова mlockall() .

Однако, как сказано в другом ответе, я не думаю, что это действительно то, что вы хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .