升级setuptools至65.3.0后进程内存异常升高问题求助
问题:setuptools升级至65.3.0后导入distutils导致内存占用飙升
升级setuptools至65.3.0版本后,系统中多数进程突然出现内存占用升高的情况。排查发现,脚本中导入distutils的操作会导致新版本加载大量动态库,进而增加加载耗时并提升内存占用。两台测试机器的Python版本均为3.9.16。
测试脚本
from distutils.version import StrictVersion import time while True: time.sleep(1000)
setuptools 65.3.0环境测试结果
[root@controller(FHGW-83) /home/robot] # pmap 2440334 | wc -l 196 [root@controller(FHGW-83) /home/robot] # pmap 2440334 | grep cpython | wc -l 111 # pmap 2432196 | grep cpython 00007f8606e8a000 72K r---- _ssl.cpython-39-x86_64-linux-gnu.so ... 00007f8606f02000 24K r-x-- _json.cpython-39-x86_64-linux-gnu.so ... 00007f8607296000 4K rw--- _csv.cpython-39-x86_64-linux-gnu.so ... 00007f860786f000 4K rw--- _sha512.cpython-39-x86_64-linux-gnu.so ... 00007f86078fe000 8K rw--- pyexpat.cpython-39-x86_64-linux-gnu.so ... 00007f86079f9000 4K rw--- _struct.cpython-39-x86_64-linux-gnu.so ... and more... $ top -p 2440334 PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND 2440334 root 20 0 31.9m 27.2m 0.0 0.2 0:00.68 S python test.py
setuptools 57.0.0环境测试结果
# python test.py & [1] 1562394 # pmap 1562394 | wc -l 67 # pmap 1562394 | grep cpyth | wc -l 5 PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND 1562394 root 20 0 14.0m 9.3m 0.0 0.1 0:00.05 S python test.py
问题分析
与setuptools的关联
setuptools从60.x版本开始,改变了对distutils的处理逻辑:原本Python标准库自带独立的distutils实现,而新版setuptools会接管distutils的导入路径,用自身内置的distutils替代系统原生版本。在65.3.0这个版本中,setuptools内置的distutils存在依赖膨胀问题。
为何加载大量库
- 在setuptools 57.0.0及更早版本中,导入
distutils.version.StrictVersion使用的是Python原生distutils,该模块依赖极少,仅会加载必要的基础库,因此内存占用低。 - 在setuptools 65.3.0中,当你导入
distutils相关模块时,实际加载的是setuptools内置的distutils。为了扩展包管理等功能,这个内置版本在初始化过程中会隐式导入大量额外模块(如ssl、json、csv等),这些模块对应的CPython扩展动态库会被加载,直接导致进程内存占用飙升,同时也增加了加载耗时。
内容的提问来源于stack exchange,提问作者Dinesh Reddy
相关产品推荐
相关产品推荐

