我的一个容器总是很忙,并且将CPU从需要响应的且仅在不时处于活动状态的其他容器(网络服务器)中夺走了。
我想降低占用CPU的容器的CPU优先级,以便每当其他容器需要CPU时,它都不会被阻塞。
我该怎么做?我已经在网上搜索了一段时间,但找不到答案。
我尝试使用--entrypoint='nice 10 mybinary'
运行容器,但事实证明--entrypoint
只能运行二进制文件,而不能运行shell命令。
答案 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
,这将允许更改容器内的过程优先级。也就是说,如果容器中有nice
或renice
命令,则在您添加sys_nice
功能时它应该可以工作。您只想允许此功能用于受信任的容器,因为您不希望不受信任的程序随意更改其优先级。
您可以通过在主机上使用NI
或top
在ps -efl
列中检查相关进程来进行验证。
答案 2 :(得分:0)
设置CPU份额是您请求的最直接答案,通常,与容器添加功能相比,容器内部的恶意行为者可能会首选使用CPU份额来影响主机。我能想到的向容器添加SYS_NICE功能的唯一原因是,如果容器内有多个进程,并且希望为其赋予不同的优先级,或者需要在容器运行时更改优先级。
对于嘈杂的邻居,更传统的解决方案是为每个容器配置一个允许使用多少CPU和内存的限制。这是一个上限,因此请注意,如果将此值设置得较低,并且没有其他可用于运行CPU的任务,则可能会有空闲的CPU资源。
通过docker run
命令行设置容器限制的最简单方法是使用--cpus
,它使您可以配置可用于该容器的部分内核。传递诸如--cpus 2.5
之类的选项后,在内核调度程序限制该进程之前,容器可以使用多达2.5个内核。如果您有4核主机,那将确保其他进程始终至少有1.5核可用。
与这些限制有关,在“群集模式”下,您还可以配置CPU(和内存)的预留空间。保留是Docker确保尚未为任何其他容器保留的下限。这用于选择要调度容器的节点,并可能在没有足够的可用资源时阻止某些容器的调度,而不是在单个节点上调度如此之多的作业而导致失败。