![減少nginx引起的IO](https://rvso.com/image/567627/%E6%B8%9B%E5%B0%91nginx%E5%BC%95%E8%B5%B7%E7%9A%84IO.png)
我有大量可用 RAM,但我的 IO 始終為 100 %util 或非常接近。有哪些方法可以透過使用更多 RAM 來減少 IO?我的 iotop 顯示了具有最高 io 速率的 nginx 工作進程。這是一個檔案伺服器,提供 1mb 到 2gb 範圍內的檔案。這是我的 nginx.conf
#user nobody;
worker_processes 32;
worker_rlimit_nofile 10240;
worker_rlimit_sigpending 32768;
error_log logs/error.log crit;
#pid logs/nginx.pid;
events {
worker_connections 51200;
}
http {
include mime.types;
default_type application/octet-stream;
access_log off;
limit_conn_log_level info;
log_format xfs '$arg_id|$arg_usr|$remote_addr|$body_bytes_sent|$status';
sendfile off;
tcp_nopush off;
tcp_nodelay on;
directio 4m;
output_buffers 3 512k;
reset_timedout_connection on;
open_file_cache max=5000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
client_body_buffer_size 32k;
server_tokens off;
autoindex off;
keepalive_timeout 0;
#keepalive_timeout 65;
答案1
開啟發送文件。保留 output_buffers 預設值。關閉方向。添加更多內存。
沒有什麼比 Linux VFS 快取更好的了。
答案2
請不要接受這個答案,因為這只是一個觀察。但是對於超過 4M 的檔案使用直接 IO,並且只允許 nginx 為檔案提供 1.5MB 的記憶體緩衝區。
directio 4m;
output_buffers 3 512k;
如果我沒記錯的話,直接 IO 基本上會繞過檔案系統 IO 緩存,直接從 HDD 讀取。因此,對於超過 4M 的文件,您不會使用內存來緩衝文件,而對於 4M 以下的文件,您僅使用 1.5M 內存。
答案3
看來您想直接從記憶體中處理一些請求 - 這實際上相當於快取這些請求。在其基本形式中,您將處理請求,將副本儲存在基於記憶體的快取中,並為記憶體中相同資源的後續請求提供服務(直到快取副本無效/過期)。
其實施將根據您網站的性質而有所不同(即,如果您提供非常大的文件,它不會那麼實用 - 如果您的內容高度動態,它不會提供那麼多的好處,等等) - 但是對於「普通」網站- 大部分頁面的I/O 來自靜態資源(尤其是映像),它將減少磁碟I/O(並且也應該加快速度)。
如果您代理到後端伺服器,則可以使用 nginx 的 proxy_cache 指令來快取頁面。但是,快取位置通常位於磁碟上(這可能會加快速度,但可能不會保存在磁碟 I/O 上) - 您可以透過建立映射到記憶體(即 ramdisk)的 tmpfs 來儲存快取來解決此問題。同樣,如果您使用 FastCGI,則可以使用 fastcgi_cache。
另一個類似的選項(例如,如果您不使用 nginx 作為代理並且不使用 FastCGI)是將頁面儲存在 MemCached 中。 Nginx 附帶了一個 memcached 模組,它允許您設定自己的快取機制。
或者,您可以簡單地在 Nginx 前面新增一個快取代理(例如 Varnish)——它將接收請求,並直接為它們提供服務或將請求傳遞到 Nginx。 Varnish 可以配置為將其快取儲存在記憶體中(或檔案 - 儘管這對您的 I/O 沒有幫助),並且將以最少的磁碟 I/O 提供快取命中。
答案4
worker_processes 32;
——你還猜到為什麼嗎?
我有很多可用 RAM,但是
我還想聽聽有關擁有sendfile off;
和使用的推理directio
- 我是唯一一個(肯定不是)知道 directio(根據定義)禁止 FS 緩存的人嗎?
__ 1 — Martin F,至少記得這一點:減少nginx引起的IO