2013-02-20 3 views
1

Я запускаю экземпляры JVM на компьютере CentOS 6.3 x64. Иногда использование ЦП одного из них идет бурно, а I/O блокирует всю машину.Bash: ограничение использования ЦП всех процессов с указанным именем

Как я могу ограничить использование всех процессов Java в одном ядре? Или два ядра? Или как указано?

Я пробовал cpulimit, который не работал для нескольких ядер, а также несколько процессов с тем же именем.

Есть ли простой способ ограничить использование ЦП всеми процессами указанного имени?

ответ

1

Ну, я думаю, что все, что вам нужно, это pgrep (чтобы найти PID) и taskset. А затем в зависимости от ваших потребностей вы бы работать (как суперпользователь) что-то вроде:

for pid in $(pgrep <pattern>); 
do 
    taskset -p 0x00000001 $pid 
done 

Обратитесь к странице taskset вручную для получения дополнительной информации о том, как использовать его. Возможно, вам потребуется установить пакет schedutils.

Конечно, вы можете поменять эту схему на любую сложную сложность, изменив маску процессора (т. Е. Какой процессор вы назначили).

Я хотел бы добавить, что я думаю, что cpuset (предполагая, что вы имели в виду, что я не знаю инструмента под названием cpulimit, но это ничего не значит) использует те же базовые механизмы. Поэтому это может быть напрасно, как ваши прошлые попытки.

+0

Я использовал 'taskset' в отдельном процессе, но он продолжает использовать до 3 потоков. Знаете ли вы, почему? – hexacyanide

+0

@hexacyanide: нет, я не потому, что не знаю точной программы (и даже если бы я это сделал, это не могло бы изменить ситуацию). Но потоки - это «сущность» внутри процесса. Действительно, каждый процесс имеет хотя бы один поток (технически). Нить - это то, что выполняет «поток инструкций», образно говоря, тогда как процесс представляет собой контейнер, обеспечивающий пространство памяти и т. Д. Однако с 'taskset' все эти потоки все равно будут ограничиваться использованием CPU или CPU, которые вы назначили в маске процессора ... – 0xC0000022L

Смежные вопросы