uWSGI环境下pickle文件反序列化性能异常问题排查
pickle反序列化在uWSGI环境下的异常耗时问题
我需要反序列化约200个pickle文件,每个文件包含一个自定义类,类内有一个shape为500×32的numpy.ndarray,以及少量int、str类型的元数据,单个文件大小约50KB。
简化测试代码
#!venv/bin/python3 import random import pickle from pathlib import Path # real live : around 200 files filenames = ["file1.pickle", "file2.pickle"] filepaths = [Path(fn) for fn in filenames] # read all the files and keep them in a list of bytes # This is for debug purposes : I want to be sure that the unpicking is # the time-consuming line. str_datas = [] for filename in filepaths: str_data = filename.read_bytes() str_datas.append(str_data) # shuffle for a reason, see below random.shuffle(str_datas) # unpickle the read data datas = [] num = 0 for str_data in str_datas: num += 1 print(num) data = pickle.loads(str_data) # <---- this line takes 0.02s or 5s !! (see bellow) datas.append(data)
异常现象
- 本地运行时一切正常,每次反序列化耗时约0.02s;
- 在生产环境的uWSGI中运行时,每次执行都会有一个反序列化操作耗时长达5s(而非0.02s);
- 由于对数据做了随机打乱,每次耗时超长的文件不同,但该操作始终出现在第55至63次反序列化之间;
- 已排除IO问题(先将所有文件读取到内存后再进行反序列化),怀疑uWSGI存在隐式并行。
补充说明
- 通过打印日志可明显看到前60次输出几乎同时出现,第61次输出耗时明显更长;
- 已添加
time.time()打印来确认耗时位置就在pickle.loads()这一行。
内容的提问来源于stack exchange,提问作者Laurent Claessens
相关产品推荐
相关产品推荐

