我想知道如何设置 NGINX 来为大型 (1-4 GB) 静态文件提供服务,而无需消除由同时读取引起的磁盘 I/O 等待。文件服务器如何实现这一点?
答案1
这些可以帮助您减少磁盘上的 I/O:
sendfile
在 NGINX 中打开。- 对你的分区使用 VFS 文件系统。
output_buffers
在 NGINX 中调整。directio
在 NGINX 中禁用。
答案2
为我预读改变了一切。wa(iowait)从30%降到了0。平均负载从4.00降到了0.04,只能通过以下命令将其从256增加到4096:
blockdev --setra 4096 /dev/sda3
成功的故事:https://arstechnica.com/civis/viewtopic.php?f=16&t=35113
教程:http://fibrevillage.com/storage/291-blockdev-command-examples
答案3
只要您能从系统获得预期的性能(响应时间、吞吐量),iowait 并不一定是坏事。可以减少它:
- 更多的 RAM 可提高文件系统缓存的命中率。
- 更快的存储系统。
在 Linux 上,考虑线程异步 I/O对于大型请求,使用缓冲 I/O 处理较小的请求。AIO 并不适合所有人,因为它会通过许多并行请求访问存储,并且没有文件系统缓冲区。但它可以让工作任务在 I/O 仍在进行时继续进行。
sendfile on;
aio threads;
directio 8m;