我有一个脚本,它以很大的 CPU 和内存消耗进程树开始。那里有 Python 和可执行文件,但一切都以单个 bash 脚本和 python 子进程开始。
在执行过程中,系统的其余部分完全瘫痪。我尝试通过 来缓解
$ nice -n10 ionice -c2 ./Script.sh
,但这还不够——使用电脑非常滞后(实际上这是开发桌面,但指定服务器上的问题将类似)。
我怀疑,问题在于进程使用了太多内存——所有东西最终都会被换出并变得迟缓。
有没有办法降低进程(及其递归子进程)访问物理内存的优先级?我更希望它在后台以较慢的速度完成,对其他任务的影响有限。
答案1
您无法限制消耗内存的“速度”,但您可以通过各种不同的机制限制其总内存使用量。
1) 安全限制通过 /etc/security/limits.conf 限制运行进程的用户的内存使用量。如果您以处理不同内容的同一用户身份运行此进程,则这可能不适用于您的情况。
例子:
username hard as 1000000
2) 控制组 您可以使用 cgroups 创建一个组并限制内存使用量。只需创建 cgroup,如下所示:
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
当然 - 在这两种情况下,您都必须开发您的程序,以便它可以从无法分配更多内存中恢复。
如果不能,你只需要为系统添加更多内存,这样就可以避免交换。一旦交换开始,它就掌握在内核手中,你不能 - 例如 - 降低 kswapd 的优先级,即使你可以 - 这也不能保证你使用的某些程序不会被交换出去,从而导致系统响应速度更慢。不要这么做。
答案2
尽管下一步不会帮助您进行内存交换,但它应该有助于您解决进程的 IO 影响。
看来您level
也应该明确设置。
ionice -c2 -n5 ./slowscript.sh
仅靠 C2 可能还不够,这取决于您的内核。
引自手册页 ( man ionice
)
Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will treat such
processes as if it were in the best-effort class. The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
io_priority = (cpu_nice + 20) / 5.
For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class. The I/O priority is
derived from the CPU nice level of the process (same as before kernel 2.6.26).
基本上:每个新启动的进程都会获得 C2 N4,因此当您想将 IO 降低到尽可能低时,只能进入空闲状态(C3)或 C2 N7。