为 Windows 容器实现资源控制

适用于:Windows Server 2025、Windows Server 2022、Windows Server 2019

可以基于每个容器和每个资源实现多个资源控制。 默认情况下,容器运行会受到典型的 Windows 资源管理的约束,一般基于公平共享。然而,通过配置这些控件,开发人员或管理员可以限制或影响资源的使用。 可以控制的资源包括:CPU/处理器、内存/RAM、磁盘/存储和网络/吞吐量。

Windows 容器利用 作业对象 对与每个容器关联的进程进行分组和跟踪。 资源控制在与容器关联的父作业对象上实现。

Hyper-V 隔离 情况下,资源控制会同时应用于虚拟机和虚拟机中运行的容器的作业对象。这样可以确保,即使容器中的进程绕过或逃逸了作业对象的控制,虚拟机仍会确保其不能超出预定的资源控制。

资源

对于每个资源,本部分提供了 Docker 命令行接口之间的映射,例如如何使用资源控制(可能由业务流程协调程序或其他工具配置)到相应的 Windows 主机计算服务(HCS)API,以及通常如何通过 Windows 实现资源控制(请注意,此说明是高级的,基础实现可能会更改)。

记忆

资源 位置
Docker 接口 --memory
HCS 接口 MemoryMaximumInMB
共享内核 JOB_OBJECT_LIMIT_JOB_MEMORY
Hyper-V 隔离 虚拟机内存

备注

对于 Windows Server 2016 中的 Hyper-V 隔离,使用内存上限时,你将看到容器最初分配内存上限量,然后开始将其返回到容器主机。 更高版本的 Windows Server(1709 或更高版本)已优化此过程。

CPU(数量)

资源 位置
Docker 接口 --cpus
HCS 接口 ProcessorCount
共享内核 使用 JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP* 模拟
Hyper-V 隔离 公开的虚拟处理器数

CPU(百分比)

资源 位置
Docker 接口 --cpu-percent
HCS 接口 处理器最大值
共享内核 JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
Hyper-V 隔离 虚拟机监控程序对虚拟处理器的限制

CPU(共享)

资源 位置
Docker 接口 --cpu-shares
HCS 接口 处理器重量
共享内核 JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED
Hyper-V 隔离 虚拟机监控程序虚拟处理器权重

存储(图像)

资源 位置
Docker 接口 --io-maxbandwidth/--io-maxiops
HCS 接口 StorageIOPSMaximum 和 StorageBandwidthMaximum
共享内核 JOBOBJECT_IO_RATE_CONTROL_INFORMATION
Hyper-V 隔离 JOBOBJECT_IO_RATE_CONTROL_INFORMATION

存储(卷)

资源 位置
Docker 接口 --storage-opt size=
HCS 接口 StorageSandboxSize
共享内核 JOBOBJECT_IO_RATE_CONTROL_INFORMATION
Hyper-V 隔离 JOBOBJECT_IO_RATE_CONTROL_INFORMATION

其他备注或详细信息

内存要求

Windows 容器在每个容器中运行一些系统进程,通常提供每个容器的功能,例如用户管理、网络等... 尽管这些进程所需的大部分内存在容器之间共享,但内存上限必须足够高,以便支持这些进程。 系统要求文档中提供了一个表,介绍了每个基础映像类型及其在有无 Hyper-V 隔离时的情况。

CPU 共享(无 Hyper-V 隔离)

在使用 CPU 共享时,基础实现(不采用 Hyper-V 隔离时)会配置 JOBOBJECT_CPU_RATE_CONTROL_INFORMATION,尤其会将控制标记设置为 JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED,并提供一个合适的权重。 作业对象的有效权重范围为 1 - 9,默认值为 5,其保真度低于主机计算服务值 1 到 10000。 例如,份额权重为 7500 将导致权重为 7,而份额权重为 2500 将导致值为 2。