日志出现temp_file_write_size相关告警,本质是缓冲与落盘失衡:需先确认proxy_buffering on且响应超proxy_buffers+proxy_buffer_size总和,再检查是否真触发临时文件写入路径,并结合存储介质将proxy_temp_file_write_size设为64k–512k,同步调优proxy_buffers、proxy_max_temp_file_size等参数。

日志里出现跟 temp_file_write_size 相关的性能告警(比如写入频繁、I/O 延迟高、临时文件数量激增),往往不是参数本身报错,而是它背后反映的缓冲与落盘失衡问题。排查重点不在“有没有设这个值”,而在于“为什么系统被迫高频写小块临时文件”。
看是否真触发了磁盘临时写入路径
proxy_temp_file_write_size 只在特定条件下生效:后端响应超出内存缓冲总和、且 proxy_buffering 开启时,才会走磁盘临时文件流程。先确认是否真的进入了这条路径:
- 检查 access log 或 error log 中是否有 upstream response buffered to a temporary file 提示——这是最直接信号;
- 执行
nginx -T | grep -E "(proxy_buffering|proxy_buffers|proxy_buffer_size|proxy_max_temp_file_size|proxy_temp_path)",确认 proxy_buffering 是 on,且 proxy_buffers + proxy_buffer_size 总和明显小于典型响应体(例如下载 2MB 文件,但缓冲总和仅 256KB); - 用
ls -l /var/cache/nginx/proxy/(或你配置的 proxy_temp_path)观察是否有大量小文件(如几 KB 到几十 KB),尤其集中在同一秒内创建的多个文件。
验证当前 write_size 是否成为 I/O 瓶颈
默认值(8k 或 32k)在高吞吐场景下易暴露问题。需从系统层确认是否因块太小导致 write() 调用过密:
- 对运行中的 worker 进程抓取 write 系统调用:
strace -e trace=write -p $(pgrep nginx | head -1) -s 0 2>&1 | grep "write(" | head -20,观察每次 write 的字节数是否稳定接近你设置的 proxy_temp_file_write_size;若多为 8k/16k,说明当前值确实偏小; - 用
iostat -x 1查看 avgrq-sz(平均请求大小):若长期低于 16k,且 %util 高、await 明显,大概率是小 IO 拖累; - 对比前后:调大该值后,avgrq-sz 应上升,r/s(每秒请求数)可能略降,但 wrqm/s(合并写请求数)会上升,整体吞吐(wMB/s)应提升。
排除其他更关键的配置短板
单独调大 temp_file_write_size 效果有限,常见“调了没用”是因为卡在上游环节:
- proxy_max_temp_file_size 太小(如默认 1024m),会导致大响应中途被截断,引发重试或连接中断;建议设为 2048m 或更高,并确保磁盘分区有足够空间和 inodes;
- proxy_buffers 设置不足(如仍用默认 8 4k),意味着数据很快溢出进磁盘,再大的 write_size 也救不了——应按典型响应大小匹配,例如:proxy_buffers 16 128k;
- proxy_busy_buffers_size 过小(如低于 proxy_buffers 总和),会提前强制刷盘,变相绕过 write_size 控制;建议设为 proxy_buffers 总和的 1.5 倍左右;
- 检查后端是否异常慢(如超时、TCP 重传)、客户端接收是否卡顿(如弱网下载),这些都会拉长缓冲时间,放大落盘压力。
结合存储介质做合理取值
没有通用最优值,需匹配你的硬件特性:
- SSD 或 NVMe:可设 128k–512k,发挥顺序写优势;
- 机械硬盘或低配云盘:优先选 64k–128k,避免单次写过大加剧寻道;
- 若临时目录挂载在 tmpfs(内存盘):可设 512k 或 1m,但必须严格限制 tmpfs size,防止 OOM;
- 切忌盲目设到 1m 以上——Nginx 内部仍需预分配 buffer,可能引发内存碎片或延迟抖动。


















