減少nginx引起的IO

減少nginx引起的IO

我有大量可用 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

相關內容