如何在 Linux 上减慢 grep 和 zgrep 的速度?

如何在 Linux 上减慢 grep 和 zgrep 的速度?

我有一堆大日志文件(超过 4 GB),我无法从服务器下载它们(下载速度有限),因此我需要在生产服务器上执行 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 上不可用)。


一个可能更好的方法是使用cgroups

在更新的系统上,我宁愿使用 cgroups 让内核自行处理所有限制,但我没有简单的方法来测试 CentOS6(使用容器)。以下是有关它的指示,第一个针对 CentOS6:

CentOS 6 上的 CGroup
使用 nice、cpulimit 和 cgroups 限制进程 CPU 使用率

如果你的实际问题是磁盘 I/O 垃圾而不是 CPU,那么我认为只有 cgroups v2 可以正确处理(包括磁盘缓存和内存),但据我所知,它在 CentOS6 内核上不可用。

答案2

您可以使用该nice命令。从维基百科:

Nice 是 Unix 和类 Unix 操作系统(例如 Linux)上的程序。它直接映射到同名的内核调用。 Nice 用于调用具有特定 CPU 优先级的实用程序或 shell 脚本,从而为该进程提供比其他进程更多或更少的 CPU 时间。 -20 的优先级是最高优先级,19 是最低优先级。进程的默认niceness是从其父进程继承的,通常为0。

当多个进程需要的资源超出 CPU 所能提供的资源时,nice 就变得很有用。在这种状态下,优先级较高的进程将比优先级较低的进程获得更多的 CPU 时间。只有超级用户(root)可以将niceness设置为较低的值(即较高的优先级)

如果您想运行一个进程,例如grep,您可以使用nice将优先级设置为19或 10 左右的值,这样它就不会占用所有资源。

答案3

正如马克·普洛特尼克所指出的光伏发电实用程序以非常简单的方式提供帮助。对于 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中光伏发电安装后可用百胜安装光伏

相关内容