web-dev-qa-db-ja.com

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

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

Grepまたはzgrepコマンドだけを「スローダウン」する方法、またはCPUリソースの使用を制限する方法はありますか?たとえば、0.7秒間スキャンした後、0.3秒間動作を停止するようにgrepコマンドに指示するキーはありますか?

私の環境はLinux CentOS 6.9です

2
Dmitry.M

EPELリポジトリyum install epel-release)で利用可能で、cpulimitコマンドを提供するcpulimitパッケージがあります。

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では使用できません)。


おそらくより良い方法は cgroups を使用することです。

最近のシステムでは、cgroupを使用してカーネルにすべての制限自体を処理させたいと思っていますが、CentOS6(コンテナーを使用)でこれをテストする簡単な方法がありません。これは、CentOS6の最初のポインタです。

CentOS 6のCGroups
Nice、cpulimit、およびcgroupsを使用してプロセスのCPU使用率を制限する

実際の問題がCPUではなくディスクI/Oのトラッシングである場合は、 cgroups v2のみが正しく処理できます (ディスクキャッシュとメモリを含む)と思いますが、CentOS6のカーネルでは使用できません。

2
A.B

Niceコマンドを使用できる可能性があります。 Wikipedia から:

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

複数のプロセスがCPUが提供できるよりも多くのリソースを要求している場合、Niceは役に立ちます。この状態では、優先度の高いプロセスは、優先度の低いプロセスよりもCPU時間のチャンクを大きくします。スーパーユーザー(root)のみがnicenessを低い値(つまり高い優先度)に設定できます

grepなどのプロセスを実行する場合は、Niceを使用して、優先度を19または10代の若者に設定し、すべてのリソースを占有しないようにすることができます。 。

1
cutrightjm

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

転送速度10m(10メガバイト/秒)は、サーバーのCPU消費を約8%に減速し、低く保ちます。

Pvの利点は単純さですが、欠点はサーバーの適切な転送速度を経験的に決定する必要があることです。 CentOS6では、pvは、yum install pvを使用してインストールした後に使用できます。

1
Dmitry.M