如何限制资源使用以节省某个进程的 CPU+RAM?

phu*_*ehe 25 performance limit

我有一个开发服务器,sshd有时会因为机器内存不足而停止工作。是的,我们的内存不足,升级现在不是一个可行的选择。我想要做的是告诉机器:“做任何你想做的事,但留下 20MB 和一些 CPU 给sshd!”。

那怎么办呢?

Mat*_*Mat 9

您可以通过将cgroupsMemory 资源控制器一起使用来实现类似的目标。

我猜您会将所有消耗资源的任务放在有限的 (CPU 和 RAM) 中cgroup,然后将其留在sshd“外部”以使其不受限制。

(添加更多交换,即使是交换文件的形式,也可能是一个不错的选择。)


mar*_*t1n 6

哦,但是 cgroups 很容易 :) 安装 libcgroup 包。创建一个/etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}
Run Code Online (Sandbox Code Playgroud)

启动cgconfig将创建层次结构、cgroups 并设置限制的过程。如果成功,您将拥有两个 cgroup,它们都分配了 50% 的 CPU 和 1G 可用内存(不知道您的实际可用内存量是多少;假设在此示例中为 2G)。现在您只需要将所有任务(即系统上运行的所有进程)从根组移动到 nosshd cgroup 中:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks
Run Code Online (Sandbox Code Playgroud)

然后您只需要获取sshd进程的 PID并将其移动到 sshd 任务文件中:

cgroup]# echo $PID >> sshd/tasks
Run Code Online (Sandbox Code Playgroud)

Ta-da,你完成了。您现在可以放心,sshd 将始终拥有 50% 的 CPU 和 1G 内存。