cpulimit на сценарии удара, который выполняет другие команды

Жесткая ссылка является, по существу, исходным файлом. Так, размер, который Вы видите, сообщил, размер файла, связываемого с. Это - гибкие ссылки, которые только занимают место их имен (своего рода).

Что касается файловой системы, жесткая ссылка и оригинал является тем же самым, они указывают на тот же inode, таким образом, о том же размере сообщают.

4
23.08.2015, 09:29
4 ответа

Наверное, нет. Логика

cpulimit довольно проста: он берет идентификатор процесса и просто отправляет свой сигнал kill -STOP $ PID , затем kill -CONT $ PID и снова, и снова, и снова, и снова ......

И измерение использования процессора для расчета задержки между STOP и CONT.

В вашем случае pstree сложного bash-скрипта займет N * x экранов консоли.

Я могу предложить вам еще один способ понизить использование процессора для любого bash-скрипта или даже бинарного исполняемого файла.

1) хороший - процесс получения и увеличение или уменьшение его приоритета с -20 (высший приоритет) до 20 (низший приоритет). Вероятно, в слишком низком диапазоне, поэтому появляются еще две утилиты и хуки ядра:

2) ionice - может быть это второе поколение nice . Вы можете разделить процессы по приоритету от 0 (самый низкий приоритет) до 7 (самый высокий приоритет). Кроме того, вы можете разделить процессы по классам: в реальном времени (Самый высокий), Максимальный (Средний), Неактивный (Самый низкий) и Нет (по умолчанию).

3) chrt - высшая вещь, которую я когда-либо встречал, она похожа на cpulimit своей силой и властью над процессом. Здесь тоже можно встретить классы приоритета, холостой ход , в реальном времени , fifo , пакетный и т.д. приоритеты очень большие, от 1 до 99.

Например, вы можете запустить один огромный процесс с помощью chrt -r -p 99 process - и он съест все ваши ресурсы.

Точно так же любой огромный демон может мягко работать "в фоновом режиме" с chrt -r -p 0 process - он будет ждать всех остальных, пока ресурсы системы заняты.

В любом случае, я настоятельно рекомендую вам прочитать man chrt и man ionice , прежде чем вы начнете.

Например, я использую rtorrent для p2p. Это задача с самым низким приоритетом для моей системы, тогда я запускаю ее таким образом:

nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent

Или вы можете пойти путем хуков и хаков. И напишите свой собственный скрипт cpulimit_wrapper. Например:

# cat bash_script.sh 
#!/bin/bash


while sleep 0; do
        find /

        dd if=/dev/random of=/tmp/random.bin bs=1M count=1000
done

плюс

# cat cpulimit.sh 
#!/bin/bash


TARGET=$1

[ -z "$TARGET" ] && echo "Usage bash cpulimit.sh command" && exit 1

cpulimit -l 1 bash $TARGET

while sleep 0;do
        lsof -n -t $TARGET | xargs pstree -p | sed -e 's/(/(\n/g' | sed -e 's/)/\n)/g' | egrep -v '\(|\)' | while read i; do 
                echo $i; 
                cpulimit -l 1 -b -p $i; 
        done
done
1
27.01.2020, 20:57

Я попытался настроить псевдоним для cpulimit -l 50 ffmpeg в .bashrc

alias ffmpegl = "cpulimit -l 50 ffmpeg"

, а затем использовал его в моем скрипте со следующим кодом для исходных псевдонимов

shopt -s expand_aliases
source /home/your_user/.bashrc

Теперь я могу использовать cpulimit с ffmpeg в любом месте сценария для нескольких команд с использованием псевдонима. Протестировано на Scientific Linux 6.5. Работает отлично.

-1
27.01.2020, 20:57

Согласноcpulimit --help:

-i, --include-children limit also the children processes

Я не проверял, относится ли это к детям детей, и не изучал, как это реализовано.


В качестве альтернативы вы можете использовать cgroups, который является функцией ядра.

Cgroups изначально не предоставляют средств для ограничения дочерних процессов, но вы можете использовать демон обработчика правил cg (cgred ), предоставляемый libcgroup; команды cgexecи cgclassify, поставляемые из пакета libcgroup, предоставляют флаг --sticky, чтобы правила применялись и к дочерним процессам.

Имейте в виду, что существует состояние гонки, которое может(по крайней мере теоретически )привести к неправильному ограничению некоторых дочерних процессов. Однако, поскольку в настоящее время вы используете cpulimit, который в любом случае работает в пользовательском пространстве, вы уже не имеете 100% надежных ограничений ЦП, поэтому это состояние гонки не должно -препятствовать вам..

Я довольно подробно писал о демоне механизма cg rules в своем -ответе здесь:

2
27.01.2020, 20:57

Теперь лучшим способом для меня было запустить скрипт, который позволяет cpulimit управлять процессами в фоновом режиме из Askubuntu:

#!/bin/bash

#The first variable is to set the number of cores in your processor. The reason that the number of cores is important is that you need to take it into consideration when setting cpulimit's -l option.  This is explained on the cpulimit project page (see http://cpulimit.sourceforge.net/):  "If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power."

NUM_CPU_CORES=$(nproc --all) #Automatically detects your system's number of CPU cores.

cpulimit -e "ffmpeg" -l $((50 * $NUM_CPU_CORES))& #Limit "ffmpeg" process to 50% CPU usage.
cpulimit -e "zero-k" -l $((50 * $NUM_CPU_CORES))& #Limit "zero-k" process to 50% CPU usage.
cpulimit -e "mlnet" -l $((50 * $NUM_CPU_CORES))& #Limit "mlnet" process to 50% CPU usage.
cpulimit -e "transmission-gtk" -l $((50 * $NUM_CPU_CORES))& #Limit "transmission-gtk" process to 50% CPU usage.
cpulimit -e "chrome" -l $((40 * $NUM_CPU_CORES))& #Limit "chrome" process to 40% CPU usage.

Отредактируйте процессы, используемые в вашем скрипте, и запустите его. cpulimit будет работать в фоновом режиме и отслеживать запрошенные процессы и ограничивать их использование. Если какой-либо из процессов завершится , cpulimit все равно останется и ограничит процессы, если они когда-либо снова оживут.

(Я столкнулся со странной проблемой, когда пытался запустить ffmpeg через цикл for -в терминале. Парадоксальным образом это породило два экземпляра ffmpeg, что сделало cpulimit'ing практически бесполезным. Я не смог найти ответ, в чем проблема. Таким образом, даже если это «просто цикл for -», вам может понадобиться написать сценарий для этого.)

1
27.01.2020, 20:57

Теги

Похожие вопросы