从 ubuntu 18 升级到 ubuntu 24 时,我在运行 Python 解释器时遇到了性能倒退。您认为这是什么原因造成的?有修复或解决方法吗?
我有一些证据表明,Linux 内核的变化(而不是用户空间的任何变化)可能是造成该问题的原因。
我可以通过一个非常简单的测试重现性能差异:
python3 -c "import timeit; print(timeit.Timer('for _ in range(0,1000): pass').timeit())"
我通过在同一 Cisco UCS C220 M5SX 机架系统上启动 ubuntu 18 实时服务器和 ubuntu 24 实时服务器 ISO 来运行此测试。您可以在 Canonical 的网站上找到实时服务器 ISO 并重现实验。
我有一组在 Debian Squeeze 系统上从源代码构建的 Python 3.11 二进制文件,它们可以在各种 Linux 发行版上运行。这使我有机会在 18 和 24 上测试完全相同的 Python 二进制文件。我们将这些 Python 二进制文件称为 python_pegged。我们将通过“apt-get”获取的 Python3 称为 python_sys。
我也尝试在 ubuntu 24 中运行 ubuntu:18.04 docker 容器——它具有 ubuntu 24 的不良性能特征,并且行为不像 ubuntu 18,这让我相信用户空间不负责任。
实验结果:
Ubuntu 18.04.6 bare metal python_sys 13 seconds
Ubuntu 18.04.6 bare metal python_pegged 13 seconds
Ubuntu 18.04.6 bare metal sysbench --test=cpu run 1288 events/s
Ubuntu 24.04 bare metal python_sys 83 seconds
Ubuntu 24.04 bare metal python_pegged 112 seconds
Ubuntu 24.04 bare metal sysbench --test=cpu run 925 events/s
ubuntu:18.04 docker container hosted by Ubuntu 24.04 python_sys 82 seconds
ubuntu:18.04 docker container hosted by Ubuntu 24.04 python_pegged 112 seconds
在 ubuntu 24 中,采取以下操作没有任何效果:
- 将 scaling_governor 设置为 performance
- tuned-adm 配置文件吞吐量性能
- tuned-adm 配置文件虚拟主机
- tuned-adm 配置文件平衡
该系统有 40 个物理核心和 80 个超线程。我尝试运行各种数量的并发实例。
concurrent instances seconds
40 82..83
80 53..53
120 87..115
我很惊讶 80 个实例比 40 个实例更快。我进行了几次实验,结果从未改变。我尝试了不同的调整配置文件,但没有效果。53 秒与 ubuntu18 的 13 秒相差甚远。
python 在 ubuntu24 上遇到了一些昂贵的问题,而 sysbench 不会,或者至少程度不同。我可能会在不久的将来开始使用分析器进行深入挖掘。
对各种中间版本的测试表明,在 21 -> 22 升级过程中出现了回归。
perf stat -a 在 python3 命令上的结果:
统计 | Ubuntu 20 | Ubuntu 22 |
---|---|---|
CPU 时钟 | 80% | 80% |
上下文切换 | 0.003 开尔文/秒(3829) | 6.656 / 秒 (45238) |
CPU 迁移 | 0 公里/秒 (3) | 0.039 / 秒 (268) |
页面错误 | 0.001 开尔文/秒 (620) | 0.151 / 秒 (1029) |
周期 | 0.047 GHz | 0.034 GHz |
指示 | 3.34 指令/周期 | 0.88 insn/周期 |
分支 | 30.703 米/秒 | 5.329 米/秒 |
分支未命中 | 0.03% | 13.18% |
那里有很大的不同。我不相信每秒 6 次上下文切换真的能产生影响。每周期指令数大概是这里最相关的数据点。