У меня есть этот код для оптимизации размера всех моих изображений внутри /dir
каталога:
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
Когда я запускаю этот код, он потребляет много ресурсов процессора моего сервера. Поэтому мне интересно: возможно ли мне добавить задержку между каждым exec
? Например, я хочу задержку в 100 миллисекунд между каждым exec
вызовом каждого изображения, таким образом процессор не будет слишком загружен.
Что бы вы посоветовали? Мой сервер работает на Centos 8.
решение1
Вы также можете добавить больше команд, используя more -exec
s
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \; -exec sleep 0.1 \;
Но как правило, если вы хотите, чтобы он работал на полную мощность, но при этом былхорошийдля других процессов очень просто использовать nice:
nice find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
решение2
Именно поэтому были созданы такие команды, как nice
и .ionice
nice
может использоваться для снижения приоритета ЦП процессаionice
может использоваться для снижения приоритета ввода-вывода процесса
Сочетание этих факторов может гарантировать, что ваш процесс займет лишь небольшую часть доступного процессора и возможностей ввода-вывода. Этот пример перемещает процесс ввода-вывода в самый нижний предел класса "наилучших усилий":
ionice -c2 -n7 find...
Измените -c2
на , -c3
чтобы гарантировать, что ваш процесс будет выполняться только тогда, когда подсистема ввода-вывода бездействует.
В этом примере приоритет процессора снижается до низкого:
nice -n12 find...
Измените -n12
на -n19
для наименее возможного приоритета.
Комбинируйте их для максимального эффекта:
ionice -c2 -n7 nice -n12 find...
решение3
Вы можете использовать цикл оболочки с -exec
опцией find
, который запускает цикл for jpegoptim
для каждого найденного файла изображения с добавленной задержкой
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec sh -c '
for file; do jpegoptim --strip-all "$file"; sleep 0.1; done' -- {} +
решение4
Используя -exec cmd ... {} ';'
, вы запускаете один экземпляр cmd
для каждого файла. jpegoptim
может обрабатывать более одного файла за один вызов, поэтому вы избежите большой нагрузки на процессор, изменив его на -exec cmd ... {} +
:
LC_ALL=C nice find . '(' -name '*.[jJ][pP][gG]' -o -name '*.[jJ][pP][eE][gG]' ')' \
-type f -exec jpegoptim --strip-all {} +
(здесь find
команда преобразована в стандартный синтаксис и улучшена так, что она соответствуетвсеимена файлов, заканчивающиеся на .jpg
или .jpeg
, нечувствительны к регистру и ограничиваются обычными файлами).
nice
сообщает планировщику о необходимости отдавать приоритет другим задачам по сравнению с теми, которые выполняются find
или jpegoptim
. Это намного эффективнее, чем sleep
произвольно задавать эти задачи, даже если у ваших процессоров достаточно свободного времени (также учтите, что для выполнения, загрузки, инициализации и т. д. утилиты требуется некоторое процессорное время sleep
).