Julia Distributed新增进程时单核性能降至原一半问题求助
问题根因排查
首先明确你使用的Intel Xeon Platinum 9242 CPU的硬件规格:单颗CPU为48物理核/96超线程逻辑核,双路配置下总共有96个物理核、192个超线程逻辑核,你提到的192核实际是超线程得到的逻辑核心,这是性能下降的核心原因。
- 超线程技术是单个物理核共享计算单元、缓存资源同时运行两个线程,仅对IO密集、存在大量等待的任务有性能提升。你运行的是纯计算密集型任务,两个进程抢占同一个物理核的计算资源时,单进程性能必然出现明显下降。你将进程数降到96时刚好占满所有物理核,每个进程独占物理核资源,因此性能下降明显缓解,完全符合这个特性的表现。
- 其次是NUMA架构调度问题:双路CPU属于两个独立的NUMA节点,每个节点有独立的内存控制器和内存空间。如果Julia进程没有绑定固定核心,被操作系统调度跨NUMA节点访问内存时,内存访问延迟会提升30%以上,也会导致单进程耗时增长。
- 你使用的Julia 1.5.3是2020年的老旧版本,分布式进程调度、核心绑定的功能存在大量缺陷,未做对应优化,也会加剧调度混乱的问题。
- 你通过
top看到的CPU空闲率是全局逻辑核统计,无法体现物理核资源抢占、NUMA跨节点访问、缓存命中率下降这些隐性瓶颈,这些瓶颈不会体现在整体CPU使用率上。
解决方案
- 计算密集型场景下不要使用超线程逻辑核,最多开启96个工作进程,刚好占满所有物理核,完全避免物理核资源抢占的问题。如果需要运行的任务数超过96,采用进程池排队执行的模式,总耗时反而比开180个进程抢资源更优:96进程跑180个任务仅需两轮,每轮耗时不到46秒,总耗时不到92秒,比180进程单任务最高100秒的耗时更优。
- 开启进程核心绑定,避免进程跨核心/跨NUMA节点调度:
- 启动Julia时添加环境变量
JULIA_EXCLUSIVE=1,会自动将工作进程绑定到固定物理核,禁止操作系统随意调度 - 也可以用
numactl工具启动Julia,显式绑定NUMA节点:numactl -N 0,1 -m 0,1 julia
- 启动Julia时添加环境变量
- 升级Julia到至少1.8以上的稳定版本,新版本对分布式调度、内存管理都做了大量优化,能解决老旧版本的已知性能问题。
- 如果需要进一步调优,可以用
perf stat查看进程的L3缓存命中率,用numastat查看跨NUMA节点内存访问量,针对性调整进程绑定策略。
内容的提问来源于stack exchange,提问作者Jingze Zhuang
相关产品推荐
相关产品推荐

