我有一堆大日志文件(超过 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中光伏发电安装后可用百胜安装光伏