如何在 Linux 上減慢 grep 和 zgrep?
我有一堆大日誌文件(超過 4 GB),我無法從伺服器下載它們(下載速度有限),所以我需要在生產伺服器上執行 grep 和 zgrep。但是執行 grep 或 zgrep 會消耗大量 CPU 資源,並且會影響生產系統的性能。
有什麼方法可以“減慢” grep 或 zgrep 命令或限制它使用 CPU 資源?例如,某個鍵告訴 grep 命令在掃描 0.7 秒後停止工作 0.3 秒?
我的環境是 Linux CentOS 6.9
在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-bound 範例)使用者時間現在大約是實時時間的 1/10。
該命令也可以通過提供
-p <PID>
而不是命令用於正在執行的程序。此命令在 CentOS7(但不是 CentOS8)上也可用。
一個可能更好的方法是使用cgroups。
在較新的系統上,我寧願使用 cgroups 讓核心自己處理所有限制,但我沒有簡單的方法來測試 CentOS6(使用容器)。以下是關於它的指針,CentOS6 的第一個指針:
使用 nice、cpulimit 和 cgroups 限制程序 CPU 使用率
如果您的實際問題是磁碟 I/O 垃圾而不是 CPU,那麼我認為只有 cgroups v2 可以正確處理它(包括磁碟記憶體和記憶體),但是 AFAIK 它在 CentOS6 核心上不可用。