Как предотвратить подкачку определенной программы?

23

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

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

Алексей Аверченко
источник
У Tomboy та же проблема. Это одна из причин, по которой некоторые люди перешли на GNote .
Кристиан Чиупиту
1
Я думаю, что проблема сбоя не обязательно вызвана обменом. Если программа что-то играет, Linux должен это заметить, а не менять местами. Программы, которые мало что делают - это первые, которые меняются местами. Вы запускали psили topпроверяли, действительно ли rhytmbox поменялся местами, проверив поле RSS/ RES? Я думаю, что ваша проблема в основном вызвана неправильным планированием. Вы должны попытаться reniceвыполнить процесс rhytmbox или изменить некоторые его настройки, например, размер аудио-буфера.
Кристиан Чиупиту
1
Благодарность! Есть ли способ установить начальное приятное значение программы? / etc / nicetab или что-то еще? :)
Алексей Аверченко
связанные: stackoverflow.com/questions/2360116/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

10

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

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

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

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

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

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

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

Torian
источник
2
Я не думаю, что резервирование около 100 MiB убьет мою систему. Может быть, есть другой способ решения моей конкретной проблемы (см. Отредактированный вопрос)?
Алексей Аверченко
1
Если вы намереваетесь поддерживать высокий уровень отзывчивости процесса над другими процессами, ответ будет хорошим (для этого вы должны быть пользователем root). Возиться с подкачкой памяти нелегко, если вы не хотите испачкать руки (коснитесь кода, перекомпилируйте или даже LD_PRELOAD настраивайте библиотеку, чтобы обмануть процесс и настроить функцию, используемую для выделения памяти - опять же, не рекомендуется) , Совет ? ускорите процесс, получите больше оперативной памяти или прекратите открывать вкладки;)
Torian
5
«Если ядро ​​решит, что должно поменяться местами, у него есть веская причина», это не так. Сегодня у меня было 1,3G свободной памяти. Ядро Linux помещает мои процессы httpd в обмен (370M).
bluszcz
@bluszcz (ну, другие читают это, учитывая, сколько лет этому комментарию): Это может быть потому, что он решил, что дисковый кеш для файлов, обслуживаемых вашим httpd, важнее, чем редко используемые части вашего httpd - посмотрите другие ответы упоминание "перестановки".
Ян Шейбал
@JanSchejbal это потому, что linux, по крайней мере, без ведома, не знает, какие процессы важны или нет. В серверной среде вы должны быть в состоянии сказать системе, какие процессы важны, а какие нет. «Меня не волнуют другие вещи, но эти процессы являются наиболее важными для работы этого сервера»,
Рахли,
3

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

echo 10 > /proc/sys/vm/swappiness

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

swappiness

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

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

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

ceinmart
источник
1
это влияет на обмен в глобальном масштабе, а не на процесс.
Лоренцо фон Маттерхорн
1
да, вы можете заметить, что на "(вообще)" я написал. Опция для каждого процесса - это ссылка на другой ответ с использованием cgroups.
Ceinmart
Тогда это не поможет, не так ли?
Кен Шарп
Кен Шарп: Этот ответ - единственный ответ, напрямую связанный с тем, что кажется (по крайней мере, на первый взгляд) лучшим решением проблемы. Так что ... в значительной степени противоположно тому, что вы сказали.
phils
@phils Ты не понимаешь, как это работает.
Кен Шарп
0

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

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

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

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

Жером Пуйлер
источник
1
Код не будет работать вообще, так как execvp - это интерфейс execve, который отменяет mlockall. Смотрите раздел Примечания на странице руководства mlock.
Йоханнес Матокич