/dir
ディレクトリ内のすべての画像の画像サイズを最適化するためのコードがあります:
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
このコードを実行すると、サーバーの CPU が大量に消費されます。そこで疑問に思うのは、各 の間に遅延を追加することは可能かどうかということですexec
。たとえば、各イメージが呼び出されるたびに 100 ミリ秒の遅延が必要ですexec
。こうすると、CPU があまり忙しくなりません。
何かお勧めはありますか? 私のサーバーは Centos 8 を実行しています。
答え1
-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
プロセスのCPU優先度を下げるために使用できるionice
プロセスのIO優先度を下げるために使用できる
これらを組み合わせることで、プロセスが利用可能なプロセッサと IO 機能のごく一部しか使用しないようにすることができます。この例では、プロセス IO を「ベスト エフォート」クラスの最低レベルに押し上げます。
ionice -c2 -n7 find...
IO サブシステムがアイドル状態の場合にのみプロセスが実行されるようにするには、-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 ... {} ';'
のインスタンスを 1 つ実行します。 は1 回の呼び出しで複数のファイルを処理できるため、 を に変更すると CPU の負荷を大幅に軽減できます。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
(ユーティリティの実行、ロード、初期化などに CPU 時間がかかることも考慮してくださいsleep
)。