nice,ionice 还不够

nice,ionice 还不够

我有一个脚本,它以很大的 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。

相关内容