大量のログファイル(4GB以上)が多数あり、サーバーからダウンロードできないため(ダウンロード速度が制限されている)、本番サーバーでgrepとzgrepを実行する必要があります。ただし、grepまたはzgrepを実行すると、多くのCPUリソースが消費され、本番システムのパフォーマンスに影響を与えます。
grepまたはzgrepコマンドを「遅くする」か、CPUリソースの使用を制限する方法はありますか?たとえば、特定のキーはgrepコマンドに0.7秒間スキャンした後、0.3秒間ジョブを停止するように指示しますか?
私の環境はLinux CentOS 6.9です。
ベストアンサー1
次のように使用できます。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では使用できません)。
おそらくより良いアプローチは、以下を使用することです。cgroup。
最新のシステムでは、cgroupを使用してカーネルにすべての制限を独自に処理させることをお勧めしますが、CentOS6(コンテナを使用)をテストする簡単な方法はありません。これに関するガイドラインは次のとおりです。最初のガイドラインはCentOS6に関するものです。
CentOS 6のCグループ
nice、cpulimit、cgroupを使用してプロセスCPU使用率を制限します。
実際の問題がCPUではなくディスクI/Oごみだとしたら、cgroups v2のみがこれを正しく処理できます。(ディスクキャッシュとメモリを含む)しかし、私が知っている限り、CentOS6カーネルでは使用できません。