为何8核系统中Gunicorn的16个进程仅运行在单个CPU核心?
解决Gunicorn Worker全部集中在单个CPU核心的问题
先验证htop显示的准确性
htop默认显示的是进程最后运行的CPU核心,不是固定绑定的核心,空闲进程大概率会停留在同一个核心显示。用更准确的命令查看实时CPU分布:ps -eo pid,pcpu,psr,cmd | grep gunicorn | sort -k3其中
psr列就是进程当前运行的核心编号,这个数据比htop的视觉显示更可靠。测试高并发场景下的核心分布
默认的sync worker在请求量低时大多处于休眠状态,操作系统调度器不会没事就切换它们的核心。用压测工具模拟流量:ab -n 1000 -c 50 http://你的应用地址/此时worker开始处理请求,调度器会自动把它们分配到不同核心,再看
ps或htop的显示应该会分散开。如果是CPU密集型应用,建议换成gevent这类异步worker,调度效率更高。检查进程核心绑定和系统调度配置
- 用
taskset -p <worker-pid>查看单个worker的核心绑定,如果输出是mask: ff(对应八核物理核心+超线程的16个逻辑核心),说明没有被固定绑定,调度器会自动分配。 - 如果你用systemd管理gunicorn服务,检查服务配置文件里有没有
CPUAffinity参数,要是设置了CPUAffinity=1,所有子进程都会被限制在CPU1上,删掉这个配置重启服务即可。
- 用
确认系统核心配置
用lscpu查看物理核心和逻辑核心数量,八核处理器开超线程的话应该有16个逻辑核心。如果系统只识别到少数核心,那肯定没法分散worker,这种情况需要检查BIOS里的超线程设置或系统内核参数。
内容的提问来源于stack exchange,提问作者abhay patil
相关产品推荐
相关产品推荐

