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

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

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

那怎么办呢?

答案1

您可能可以通过使用来实现类似的目标cgroups内存资源控制器

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

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

答案2

哦,但是 cgroup 很简单:) 安装 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";
        }
}

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

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

然后你只需要获取进程的 PIDsshd并将其移至 sshd 任务文件中:

cgroup]# echo $PID >> sshd/tasks

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

答案3

用于renice获得 的更高优先级sshd,或检查会计。 (acct) -> 通过这个你可以为用户设置资源,所以用 s 运行 sshd

答案4

解决应用程序资源使用问题的更通用的解决方案是在容器中运行应用程序码头工人。那么你可以跑步具有与 cgroup 类似的 CPU 和内存使用限制的容器。

docker run -c=10 -m=1g my-container

相关内容