我有一个脚本,它启动大、CPU 和内存消耗进程树。那里有 Python 和可执行文件,但一切都始于单个 bash 脚本和 Python 子进程。
在执行期间,系统的其余部分被完全阻塞。我试图通过 来缓解
$ nice -n10 ionice -c2 ./Script.sh
,但这还不够 - 使用计算机非常滞后(实际上这是开发桌面,但指定服务器上的问题将类似)。
我怀疑,问题在于进程使用了太多内存 - 一切最终都被换出并变得缓慢。
有没有办法降低访问物理记忆的进程(及其递归子进程)的优先级?我更喜欢它在后台执行得更慢,对其他任务的影响有限。
您无法限制消耗内存的“速度”,但您可以通过各种不同的机制限制其总内存使用量。
1) 安全限制 通过/etc/security/limits.conf限制用户运行进程的内存使用。如果您以处理不同内容的同一用户身份运行此进程,则这可能不适用于您的情况。
例子:
username hard as 1000000
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当然,在这两种情况下,您都必须开发您的程序,以便它可以从未能分配更多内存的情况中恢复。
如果不能,您只需向系统添加更多内存,这样就可以避免交换。一旦交换开始,它就掌握在内核手中,你不能 - 例如 - 降低 kswapd 的优先级,即使你可以 - 这也不能保证你使用的某些程序不会仍然被交换出,从而导致系统响应更慢。只是不要去那里。