容器绑核
绑核可以避免容器中的进程在不同的核心或节点之间频繁切换和访问远程内存,从而减少延迟和资源浪费,提高容器的性能和资源利用率。在创建Docker时,建议进行CPU与内存的1:1绑定,并确保内存访问与绑定的CPU位于同一Die上,以达到最佳性能优化。
在进行绑核操作时,可以选择按CPU绑核或按
- 默认情况下,不同容器的进程可能会运行在相同的物理CPU核心上,这会导致CPU资源竞争,最终造成性能下降。
按CPU绑核是将容器绑定到特定的CPU核心上,这样可以避免在一个核心上频繁切换不同的进程,从而避免CPU资源竞争的问题,提高系统性能。
- 在多处理器系统中,每个处理器都有自己的本地内存,同时也可以访问其他处理器的内存。但是,由于不同处理器之间的内存访问延迟和带宽不同,因此在访问远程内存时会出现性能瓶颈。
按NUMA绑核是将容器中的进程绑定到特定的NUMA节点上,这样可以避免Docker容器内存访问跨Die和跨片,从而提高容器的性能和资源利用率。
- 查询NUMA信息。
1
numactl -H
预期结果:available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 node 0 size: 130064 MB node o free: 118172 MB node 1 cpus: 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 node 1 size: 130937 MB node 1 free: 129705 MB node 2 cpus: 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 node 2 size: 130937 MB node 2 free: 129097 MB node 3 cpus: 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 11 8 119 120 121 122 123 124 125 126 127 node 3 size: 130935 MB node 3 free: 129229 MB node distances: node 0 1 2 3 0: 10 12 20 22 1: 12 10 22 24 2: 20 22 10 12 3: 22 24 12 10
以鲲鹏920 7260处理器为例,CPU 0~31在NUMA 0节点,CPU 32~63在NUMA 1节点,CPU 64~95在NUMA 2节点,CPU 96~127在NUMA 3节点。为了最大化Docker容器的性能,建议在绑核时避免跨Die和跨片的内存访问,以避免性能下降。
- 为每个容器vCPU绑定一个物理CPU,并为每个vCPU分配同一NUMA节点的内存。
使用鲲鹏920 7260处理器创建一个名为8u16g_01的容器,分配8个核,绑定核4~11,使用NUMA 0节点,内存大小为16GB。在本例中,容器的镜像是centos:latest。
1
docker run -d -i -t --cpus=8 --cpuset-cpus=4-11 --cpuset-mems=0 -m 16g --name 8u16g_01 --privileged=true centos:latest /bin/bash
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
命令参数说明:
- -d:表示后台运行容器,打印容器ID。
- -i:即使没有attach,也保持STDIN打开。
- -t:分配一个pseudo-TTY。
- --cpus:分配核数。
- --cpuset-cpus:指定绑核,允许执行的CPU。如果有多个CPU,CPU编号之间需使用-连接。
- --cpuset-mems:指定NUMA节点。
- -m:分配内存大小。此参数需要根据实际情况带单位填写,例如m表示MB,g表示GB。
- --name:Docker容器的名称。
- --privileged:打开容器内的root权限。
- centos:latest:本地镜像,centos是REPOSITORY,latest是TAG。
父主题: 容器调优