我有一个脚本可以启动大的、消耗 CPU 和内存的进程树。那里有 Python 和可执行文件,但一切都从单个 bash 脚本和 python 子进程开始。
在执行期间,系统的其余部分被完全阻塞。我试图通过 来缓解
$ nice -n10 ionice -c2 ./Script.sh
,但这还不够 - 使用计算机非常滞后(实际上这是开发桌面,但指定服务器上的问题将是相同的)。
我怀疑,问题出在使用大量内存的进程上——一切最终都被换掉并变得迟缓。
有没有办法降低进程(及其递归子进程)访问物理内存的优先级?我更喜欢在后台慢一点,对其他任务的影响有限。
您不能限制消耗内存的“速度”,但您可以通过各种不同的机制限制它的总内存使用量。
1) 安全限制 通过 /etc/security/limits.conf 限制用户运行进程的内存使用量。如果您以同一用户处理不同内容运行此过程,这可能不适用于您的情况。
例子:
2) 控制组 您可以使用 cgroups 创建一个组并限制内存使用量。只需创建 cgroup,如下所示:
Offcourse - 在这两种情况下,您都必须开发您的程序,以便它可以从未能分配更多内存中恢复。
如果不能,您只需要为系统添加更多内存,这样就可以避免交换。一旦交换开始,它就在内核手中,你不能 - 例如 - 降低 kswapd 的优先级,即使你可以 - 这并不能保证你使用的某些程序仍然不会被交换出,从而导致更慢的系统响应。只是不要去那里。
虽然下一个不会帮助您进行内存交换,但它应该可以帮助您处理进程的 IO 影响。
看来您也应该明确设置
level
。仅 C2 可能还不够,具体取决于您的内核。
手册页中的引用 (
man ionice
)基本上:每个新启动的进程都将获得 C2 N4 ,因此当您希望将 IO 降低到尽可能低时,要么继续空闲 (C3) 要么继续 C2 N7。