RESULT_EXPIRE_TIME = 120 # 秒
def _cleanup_expired_results(self):
"""清理超过 120 秒的任务结果"""
now = time.time()
expired_keys = []
with self._results_lock:
for task_id, (result, timestamp) in self.task_results_map.items():
if now - timestamp > RESULT_EXPIRE_TIME:
expired_keys.append(task_id)
for key in expired_keys:
del self.task_results_map[key]
2. 使用 jemalloc 替换 glibc malloc
jemalloc 内存管理更好,能主动归还内存给系统。
Dockerfile 添加:
RUN apt-get install -y libjemalloc2
启动脚本添加:
export JEMALLOC_LIB=${JEMALLOC_LIB:-/usr/lib/x86_64-linux-gnu/libjemalloc.so.2}
if [ -z "$LD_PRELOAD" ] && [ -f "$JEMALLOC_LIB" ]; then
export LD_PRELOAD="$JEMALLOC_LIB"
fi
3. 大文件流式处理
文件大于阈值时不再全部加载到内存,而是流式写入临时文件:
def stream_file_to_path(seafile_obj, dest_path, chunk_size=8*1024*1024):
with open(dest_path, 'wb') as f:
for chunk in iter(lambda: seafile_obj.read(chunk_size), b''):
f.write(chunk)
NVMe over RoCE 的相关配置需要在 vCenter Server Client 下面操作,ESXi Host Client 下是没有相关选项的,至少图形界面是这样,用 esxicli 估计可以直接在 ESXi 下面配置。所以需要先用本地的盘部署一套VCSA,精简配置大约150GB就够了,等NVMe配置好再迁移到存储上。
在配置-网络-虚拟交换机下添加网络,选择 VMkernel 网络适配器、选择新建标准交换机、输入MTU(Dorado 推荐5500),选择一个用于NVMe的物理网络适配器,VLAN ID 填写对应交换机的 NVMe over RoCE 用 VLAN,可用服务中仅勾选 NVMe over RDMA,配置静态IPv4地址。
[root@yaoge123:~] esxcli system module parameters set -m nmlx5_core -p "pfctx=0x08 pfcrx=0x08"
重启后查看,pfctx和pfcrx值均为0x08
[root@yaoge123:~] esxcli system module parameters list -m nmlx5_core | grep pfc
pfcrx int 0x08 Priority based Flow Control policy on RX.
Notes: Must be equal to pfctx.
pfctx int 0x08 Priority based Flow Control policy on TX.
Notes: Must be equal to pfcrx.