Nginx 导致 iowait 占用 CPU 100%,无法通过打开 sendfile 和关闭 directio 来解决

Nginx 导致 iowait 占用 CPU 100%,无法通过打开 sendfile 和关闭 directio 来解决

我运行一个执行一些基本图像处理操作的 Web 服务。

网络服务器首先接受用户上传的图片并临时存储。然后后端服务器通过 HTTP get 请求下载图片并执行实际处理。然后将其发送回网络服务器。然后用户下载图片。处理后的图片通常比原始图片大得多。

Web 服务偶尔会遇到 iowait 峰值,CPU 使用率过高,并且服务器会给出请求不可用超时错误。iowait 过高是由 nginx 引起的。

针对类似问题给出的解决方案建议打开 sendfile 并关闭 directio. 我也关闭缓冲区和 request_buffers因为我读到过这也可能是问题的根源。虽然这似乎可以减少问题的发生,但它仍然偶尔发生,我不知道为什么。

我已将配置文件复制到下面。有人对还需要更改什么有什么建议吗?这个问题真的让我抓狂。

server {
     if ($http_user_agent ~ ^$){
        return 503;
    }

    if ($http_user_agent ~* "Mozilla/4.0\ \(compatible;\ MSIE\ 6.0;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") {
        return 503;
    }


    server_name [redacted: site];

    access_log /var/log/[redacted: logfile];
    error_log /var/log/[redacted: logfile];

    listen 0.0.0.0:443 ssl; 
    ssl_certificate [redacted: cert address]
    ssl_certificate_key [redacted: cert key]
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    error_page 502 /custom_502.html;
    location = /custom_502.html {
        root /usr/share/nginx/html;
        internal;
        }
    location = /error_502.png {
        root /usr/share/nginx/html;
    }
    client_max_body_size 300M;
    proxy_request_buffering off;


    location / {
                # forward application requests to the gunicorn server
                proxy_pass http://localhost:8001;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location /static {
                
                proxy_max_temp_file_size 0;
                directio        off;
                sendfile        on;
                alias [redacted: site location]/static;
                expires 5d;
        }

}


server {
      if ($http_user_agent ~ ^$){
        return 503;
    }

    if ($http_user_agent ~* "Mozilla/4.0\ \(compatible;\ MSIE\ 6.0;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") {
        return 503;
    }

  if ($host = [redacted: address]) {
        return 301 https://$host$request_uri;


    listen 0.0.0.0:80;
    server_name [redacted: site]; 
    return 404;     
    client_max_body_size 300M;

}

                                                       

相关内容