仅存在数毫秒的临时文件是否会被写入SSD?Ubuntu18.04+Python3.7场景
Linux短生命周期临时文件写入行为解答
默认行为说明
Linux内核默认采用**页缓存(Page Cache)**机制处理所有文件IO操作:
- 写入文件的数据会首先暂存在内存的脏页区域,不会立刻写入物理磁盘
- 触发脏页落盘的默认条件如下:
- 脏页占总可用内存比例达到
vm.dirty_background_ratio(默认10%),后台进程开始异步刷盘 - 脏页占总可用内存比例达到
vm.dirty_ratio(默认20%),写入进程会被阻塞等待同步刷盘 - 脏页存在时长超过
vm.dirty_expire_centisecs(默认3000,即30秒),会被强制刷入磁盘
- 脏页占总可用内存比例达到
如果你的脚本从提取JSON文件、处理到删除文件的完整流程耗时短于30秒,且全程没有手动调用fsync类强制刷盘接口、也没有触发上述刷盘阈值,那么这些临时文件的所有数据只会存在内存中,不会实际写入SSD,不会产生额外的写入损耗。
Python脚本的适配情况
Python默认的文件操作逻辑不会主动调用强制刷盘接口,除非你显式执行os.fsync()、或者使用O_SYNC等特殊标志打开文件,否则完全符合上述页缓存规则,短生命周期的临时文件不会落盘。
更稳妥的零写入优化方案
如果想要彻底杜绝临时文件写入SSD的可能性,可以采用以下两种方案:
- 使用tmpfs内存文件系统存储临时文件:Ubuntu 18.04默认的
/tmp目录就是tmpfs挂载点,所有读写都在内存中完成,完全不会触及磁盘,你只需要把脚本的临时工作目录切换到/tmp下即可。 - 内存直接处理解压内容,完全不生成临时文件:借助Python的
zipfile模块可以直接在内存中读取压缩包内的JSON内容,不需要落地到文件系统,从根源上消除写入行为,示例代码如下:
import zipfile import json with zipfile.ZipFile("你的压缩包路径.zip", "r") as zf: # 直接读取压缩包内指定JSON文件到内存变量 json_raw = zf.read("压缩包内的JSON文件名.json").decode("utf-8") json_data = json.loads(json_raw) # 后续直接处理json_data即可
验证方法
你可以通过iostat命令实时监控磁盘写入情况,执行脚本时观察对应SSD设备的wMB/s指标,即可确认是否产生了实际写入:
# 每秒刷新一次磁盘IO统计 iostat -x 1
内容的提问来源于stack exchange,提问作者Cutton Eye
相关产品推荐
相关产品推荐

