Linuxでgrepとzgrepを遅くする方法は?

Linuxでgrepとzgrepを遅くする方法は?

大量のログファイル(4GB以上)が多数あり、サーバーからダウンロードできないため(ダウンロード速度が制限されている)、本番サーバーでgrepとzgrepを実行する必要があります。ただし、grepまたはzgrepを実行すると、多くのCPUリソースが消費され、本番システムのパフォーマンスに影響を与えます。

grepまたはzgrepコマンドを「遅くする」か、CPUリソースの使用を制限する方法はありますか?たとえば、特定のキーはgrepコマンドに0.7秒間スキャンした後、0.3秒間ジョブを停止するように指示しますか?

私の環境はLinux CentOS 6.9です。

答え1

次のように使用できます。EPELリポジトリ()にはコマンドを提供するパッケージがyum install epel-releaseあります。cpulimitcpulimit

Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 400 (required)

[...]

これは、ターゲットプロセスを監視し、定期的にSIGSTOP / SIGCONT信号を送信して強制的に予約するように動作します。 CentOS6バージョンは現在のバージョンよりも多くの制限があります(ターゲットの子も監視できます)。

したがって、忙しいループがある場合:

$ time sh -c 'n=0; while [ $n -lt 50000 ]; do n=$(($n+1)); done'

real    0m0.623s
user    0m0.546s
sys     0m0.076s

CPU使用量を10%に制限するように選択します。例:

$ time cpulimit -l 10 sh -c 'n=0; while [ $n -lt 50000 ]; do n=$(($n+1)); done'

real    0m7.695s
user    0m0.795s
sys     0m0.179s

ここで重要なのは、この非マルチスレッドCPUバインディングの例では、ユーザー時間が実際の時間の約1/10であることです。

-p <PID>このコマンドは、コマンドの代わりに提供して実行中のプロセスで使用することもできます。

このコマンドはCentOS7でも使用できます(CentOS8では使用できません)。


おそらくより良いアプローチは、以下を使用することです。cgroup

最新のシステムでは、cgroupを使用してカーネルにすべての制限を独自に処理させることをお勧めしますが、CentOS6(コンテナを使用)をテストする簡単な方法はありません。これに関するガイドラインは次のとおりです。最初のガイドラインはCentOS6に関するものです。

CentOS 6のCグループ
nice、cpulimit、cgroupを使用してプロセスCPU使用率を制限します。

実際の問題がCPUではなくディスクI/Oごみだとしたら、cgroups v2のみがこれを正しく処理できます。(ディスクキャッシュとメモリを含む)しかし、私が知っている限り、CentOS6カーネルでは使用できません。

答え2

このコマンドを使用できますnice。 ~からウィキペディア:

Niceは、UnixやLinuxなどのUnixファミリーオペレーティングシステム用のプログラムです。これは同じ名前のカーネル呼び出しに直接マップされます。 Niceは、特定のCPU優先順位でユーティリティまたはシェルスクリプトを呼び出して、そのプロセスに他のプロセスよりも多いまたは少ないCPU時間を提供するために使用されます。優先順位-20が最も高い優先順位、19が最も低い優先順位です。プロセスのデフォルトのnicenessは親プロセスから継承され、通常は0です。

niceは、複数のプロセスにCPUが提供できるよりも多くのリソースが必要な場合に便利です。この状態では、優先順位の高いプロセスは、優先順位の低いプロセスよりも多くのCPU時間を取得します。スーパーユーザー(ルート)のみがnicenessをより低い値(つまり、より高い優先順位)に設定できます。

たとえば、プロセスを実行したい場合は、すべてのリソースを消費しないように、優先順位を10程度の値に設定grepできます。nice19

答え3

Mark Plotnickが指摘したように、PVユーティリティは非常に簡単な方法で役立ちます。 grepとzgrepを使うと本当に簡単です。

zcat web.log.2020-01-17.log.gz | pv -L 10m -q | grep someText

またはgrepの場合:

cat web.log.2020-01-17.log |  pv -L 10m -q | grep someText

10 m(毎秒10 MB)の転送速度により、サーバーのCPU消費量が約8%に下がり、低くなりました。

pvの利点は単純さですが、欠点はサーバーに適した転送速度を経験的に決定する必要があることです。 CentOS6でPVインストール後に利用可能Yumは太陽光発電を設置します。

関連情報