目的:動態調整系統cpu核數後,如何在不停止容器服務的情況下,docker動態使用最新的CPU資源
事件由來:
1、在ucloud上購買了一臺可以熱升級的機器,熱升級指的是動態更改系統cpu和內存資源
2、隨着業務的擴展,發現cpu、內存負載過高,需要在不停止業務的情況下動態擴容,因此使用了ucloud提供的熱升級服務,從4核12G擴容爲8核16G
3、熱升級了cpu和內存後,使用docker info,發現docker已經成功識別到8核16G資源
4、容器中內存可以立馬正常使用,但是容器中的所有進程還是跑在0-3cpu上,即沒有使用到最新的cpu(4-7)
環境
失敗方案:
1、docker container update --cpuset-cpus功能。發現調整後,容器中進程還是跑在舊cpu上
2、taskset -pc 0-7 containerpid。發現調整後,顯示還是使用0-3cpu
原因:
1、/sys/fs/cgroup/cpuset/docker/cpuset.cpus限制了docker所創建的容器能夠使用的cpu資源,該文件內容爲0-3,
2、容器資源受限於docker資源:使用taskset方式設置容器在宿主機上的pid資源,還是隻能使用0-3,因爲容器資源受docker資源影響
解決方案
1、更改docker能夠使用的cpu資源
2、更改容器能夠使用的cpu資源
具體操作步驟:
[root@br_node3 ~] cd /sys/fs/cgroup/cpuset/docker/
[root@br_node3 docker]# cat cpuset.cpus
0-3
#更改docker能夠使用的cpu資源,因爲容器的cpuset依賴於docker的cpuset內容
[root@br_node3 docker]# echo 0-7 cpuset.cpus
0-7 cpuset.cpus
[root@br_node3 docker]# echo 0-7 > cpuset.cpus
[root@br_node3 docker]# cat cpuset.cpus
0-7
[root@br_node3 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98d89fd476bf server_game_ver:20190412b "/start/run.sh" 7 hours ago Up 7 hours 22/tcp tt_server_game2_1
c6c5e3eb4e68 server_game_ver:20190412b "/start/run.sh" 47 hours ago Up 47 hours 22/tcp wx_server_game1_1
[root@br_node3 ~]# cd /sys/fs/cgroup/cpuset/docker/98d89fd476bf2d495234398de50199fe48d8e6c6ee2ee67cf38c20133ef0f40c/
[root@br_node3 98d89fd476bf2d495234398de50199fe48d8e6c6ee2ee67cf38c20133ef0f40c] cat cpuset.cpus
0-3
#更改容器能夠使用的cpu資源
[root@br_node3 98d89fd476bf2d495234398de50199fe48d8e6c6ee2ee67cf38c20133ef0f40c]# echo 0-7> cpuset.cpus
[root@br_node3 98d89fd476bf2d495234398de50199fe48d8e6c6ee2ee67cf38c20133ef0f40c]# cat cpuset.cpus
0-7