Linux

如何在 Linux 上減慢 grep 和 zgrep?

  • January 19, 2020

我有一堆大日誌文件(超過 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 的第一個指針:

CentOS 6 上的 CGroups

使用 nice、cpulimit 和 cgroups 限制程序 CPU 使用率

如果您的實際問題是磁碟 I/O 垃圾而不是 CPU,那麼我認為只有 cgroups v2 可以正確處理它(包括磁碟記憶體和記憶體),但是 AFAIK 它在 CentOS6 核心上不可用。

引用自:https://unix.stackexchange.com/questions/562809