如何设置Docker容器的CPU优先级(niceness)?

时间:2019-01-27 19:56:33

标签: docker

我的一个容器总是很忙,并且将CPU从需要响应的且仅在不时处于活动状态的其他容器(网络服务器)中夺走了。

我想降低占用CPU的容器的CPU优先级,以便每当其他容器需要CPU时,它都不会被阻塞。

我该怎么做?我已经在网上搜索了一段时间,但找不到答案。

我尝试使用--entrypoint='nice 10 mybinary'运行容器,但事实证明--entrypoint只能运行二进制文件,而不能运行shell命令。

3 个答案:

答案 0 :(得分:4)

您可以在容器级别限制CPU资源。我建议您使用--cpu-shares 512

https://docs.docker.com/config/containers/resource_constraints/

  

将此标志设置为大于或小于默认值1024的值,以增加或减少容器的重量,并允许其访问主机的CPU周期的更多或更少的比例。仅在限制CPU周期时才执行此操作。当有足够的CPU周期可用时,所有容器都会根据需要使用尽可能多的CPU。这样,这是一个软限制。 --cpu-shares不会阻止以群集模式调度容器。它将容器CPU资源的优先级分配给可用的CPU周期。它不保证或保留任何特定的CPU访问权限。

答案 1 :(得分:0)

--cpu-shares看起来是一个很好的答案,尽管我不清楚如何验证它是否有效。我也很好奇最大值是多少?文件没有说。

但是,作为可信容器的替代方案,same document也显示了--cap-add=sys_nice,这将允许更改容器内的过程优先级。也就是说,如果容器中有nicerenice命令,则在您添加sys_nice功能时它应该可以工作。您只想允许此功能用于受信任的容器,因为您不希望不受信任的程序随意更改其优先级。

您可以通过在主机上使用NItopps -efl列中检查相关进程来进行验证。

答案 2 :(得分:0)

设置CPU份额是您请求的最直接答案,通常,与容器添加功能相比,容器内部的恶意行为者可能会首选使用CPU份额来影响主机。我能想到的向容器添加SYS_NICE功能的唯一原因是,如果容器内有多个进程,并且希望为其赋予不同的优先级,或者需要在容器运行时更​​改优先级。

对于嘈杂的邻居,更传统的解决方案是为每个容器配置一个允许使用多少CPU和内存的限制。这是一个上限,因此请注意,如果将此值设置得较低,并且没有其他可用于运行CPU的任务,则可能会有空闲的CPU资源。

通过docker run命令行设置容器限制的最简单方法是使用--cpus,它使您可以配置可用于该容器的部分内核。传递诸如--cpus 2.5之类的选项后,在内核调度程序限制该进程之前,容器可以使用多达2.5个内核。如果您有4核主机,那将确保其他进程始终至少有1.5核可用。

与这些限制有关,在“群集模式”下,您还可以配置CPU(和内存)的预留空间。保留是Docker确保尚未为任何其他容器保留的下限。这用于选择要调度容器的节点,并可能在没有足够的可用资源时阻止某些容器的调度,而不是在单个节点上调度如此之多的作业而导致失败。