[英]How to set the CPU priority (niceness) of a Docker container?
我的一个容器总是很忙,并且正在将CPU从需要响应且仅不时处于活动状态的其他容器(网络服务器)中夺走。
我想降低占用CPU的容器的CPU优先级,以便每当其他容器需要CPU时,它都不会被阻塞。
我该怎么做呢? 我已经在网上搜索了一段时间,但找不到答案。
我试过使用--entrypoint='nice 10 mybinary'
运行容器,但事实证明--entrypoint
仅能运行二进制文件,而不能运行shell命令。
您可以在容器级别限制CPU资源。 我建议为您的情况使用--cpu-shares 512
。
https://docs.docker.com/config/containers/resource_constraints/ :
将此标志设置为大于或小于默认值1024的值,以增加或减少容器的重量,并使其可以访问更多或更少比例的主机CPU周期。 仅在限制CPU周期时才执行此操作。 当有足够的CPU周期可用时,所有容器都会根据需要使用尽可能多的CPU。 这样,这是一个软限制。 --cpu-shares不会阻止以群集模式调度容器。 它将容器CPU资源的优先级分配给可用的CPU周期。 它不保证或保留任何特定的CPU访问权限。
--cpu-shares
看起来是一个不错的答案,尽管我不清楚如何验证它是否正常工作。 我也很好奇最大值是多少? 文件没有说。
但是,作为可信任容器的替代方法,该文档还显示--cap-add=sys_nice
,它将允许更改容器内的进程优先级。 即,如果容器中有nice
或renice
命令,则在添加sys_nice
功能时它应该可以工作。 您只想允许此功能用于受信任的容器,因为您不希望不受信任的程序故意改变其优先级。
您可以通过在主机上使用top
或ps -efl
检查NI
进程中的有关进程来进行验证。
设置CPU份额是您请求的最直接答案,并且通常比容器中添加功能更受容器内部的恶意行为者影响主机。 我可以想到的向容器添加SYS_NICE功能的唯一原因是,如果容器内有多个进程,并且希望为其赋予不同的优先级,或者需要在容器运行时更改优先级。
对于嘈杂的邻居,更传统的解决方案是为每个容器配置一个允许使用多少CPU和内存的限制。 这是一个上限,因此请注意,如果将此值设置得较低,并且没有其他可用于运行CPU的任务,则可能会有空闲的CPU资源。
通过--cpus
docker run
命令行在容器上设置限制的最简单方法是使用--cpus
,它使您可以配置可用于容器的少量内核。 传递--cpus 2.5
类的选项可使容器在内核调度程序限制进程之前使用多达2.5个内核。 如果您有4核主机,那将确保其他进程始终至少有1.5核可用。
与这些限制相关,在群集模式下,您还可以配置CPU(和内存)的预留空间。 保留是Docker确保尚未为任何其他容器保留的下限。 这用于选择要调度容器的节点,并且可能在没有足够的可用资源时阻止某些容器的调度,而不是在单个节点上调度如此多的作业而导致其失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.