RT-CentOS7虚拟机cgroup绑定多CPU后stress仅单CPU运行求助
问题:RT-CentOS7虚拟机中stress工具无法充分利用绑定的全部CPU
环境与现象
- 环境:RT-CentOS7虚拟机,内核版本4.19.265-rt117
- 操作:通过cgroup绑定CPU2-5,将stress相关PID(2216至2222)加入该cgroup
- 现象:期望stress能利用全部4个指定CPU,但htop显示仅CPU3(编号2)满负载运行,其余3个CPU完全未工作
stress脚本内容
#!/bin/bash stress --cpu 3 --io 3 --vm 1
执行命令
nohup /home/wxh/scripts/stress_test.sh &
cgroup配置命令(其余为默认)
echo 2-5 > cpuset.cpus echo 0 >cpuset.mems echo 2216 >> tasks echo 2217 >> tasks echo 2218 >> tasks echo 2219 >> tasks echo 2220 >> tasks echo 2221 >> tasks echo 2222 >> tasks
已排查项
已检查cpuset.effective_cpus和cpuset.cpu_exclusive,排除此类配置问题。
虚拟机配置XML
<domain type='kvm'> <name>centos7</name> <memory unit='GiB'>16</memory> <vcpu>6</vcpu> <os> <type arch='aarch64' machine='virt'>hvm</type> <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader> <nvram>/var/lib/libvirt/qemu/nvram/centos7_VARS.fd</nvram> </os> <features> <acpi/> <gic version='3'/> </features> <cpu mode='host-passthrough'> <topology sockets='2' cores='3' threads='1'/> </cpu> <iothreads>1</iothreads> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' iothread="1"/> <source file='/home/xxx/v1_2th.qcow2'/> <target dev='vda' bus='virtio'/> <boot order='1'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/home/xxx/softwares/Minimal_2th.iso'/> <readonly/> <target dev='sdb' bus='scsi'/> <boot order='2'/> </disk> <interface type='network'> <source network='default'/> </interface> <console type='pty'/> <video> <model type='virtio'/> </video> <controller type='scsi' index='0' model='virtio-scsi'/> </devices> <seclabel type='dynamic' model='dac' relabel='yes'/> <vcpu placement='static' cpuset='64,65,66,67,68,69,70,71'>6</vcpu> <cputune> <vcpupin vcpu='0' cpuset='64'/> <vcpupin vcpu='1' cpuset='65'/> <vcpupin vcpu='2' cpuset='66'/> <vcpupin vcpu='3' cpuset='67'/> <vcpupin vcpu='4' cpuset='68'/> <vcpupin vcpu='5' cpuset='69'/> <emulatorpin cpuset='70'/> <iothreadpin iothread='1' cpuset='71'/> </cputune> </domain>
解决方案
- 调整stress线程数量与绑定CPU匹配:当前stress仅指定
--cpu 3,生成3个CPU压力线程,无法占满4个绑定的CPU。修改脚本为stress --cpu 4 --io 3 --vm 1,确保线程数覆盖全部绑定的CPU。 - 验证线程CPU亲和性:用
taskset -c -p <PID>检查每个stress线程的亲和性范围,确认是否包含CPU2-5。若线程亲和性被限制到单个CPU,需确认cgroup的cpuset.sched_load_balance是否开启(执行cat cpuset.sched_load_balance,若为0则执行echo 1 > cpuset.sched_load_balance开启负载均衡)。 - 适配RT内核调度特性:RT内核调度器对线程优先级敏感,用
chrt命令调整stress进程的实时优先级,例如chrt -f 99 stress --cpu 4 --io 3 --vm 1,帮助调度器更均匀地分配线程到不同CPU。 - 检查虚拟机CPU拓扑:虚拟机配置的CPU拓扑为2 sockets、3 cores,可能影响内部CPU的调度效率。可尝试调整为
sockets=1, cores=4, threads=1(需物理机支持),让虚拟机内部CPU结构更集中,利于线程分布。
内容的提问来源于stack exchange,提问作者Blue_me
相关产品推荐
相关产品推荐

