由 nginx 工作进程引起的无法解释的高磁盘 IO

Vel*_*elo 5 performance nginx ubuntu-12.04

我刚刚设置了一个 ubuntu 12.04.2 LTS 服务器,它提供大量相当大的静态文件。配置与另一台运行良好的机器上的配置相同。另一台机器使用 Ubuntu 11.10 和 nginx 1.0.5 。有问题的机器使用nginx 1.1.19,它几乎不能推动大约20MB / s(但在1Gbit专线上),iotop显示nginx的高磁盘IO。这是来自iotop:

  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 4569 be/4 www-data  754.61 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process
 4571 be/4 www-data 1257.69 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process
 4574 be/4 www-data    2.46 M/s    0.00 B/s  0.00 % 99.99 % nginx: worker process
 3951 be/4 www-data 1760.77 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process is     shutting down
 3950 be/4 www-data  503.08 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process is shutting down
 4573 be/4 www-data 2012.31 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process
 3952 be/4 www-data 1006.15 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process is shutting down
 3954 be/4 www-data 1760.77 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process is shutting down
 4572 be/4 www-data    4.05 M/s    0.00 B/s  0.00 % 99.99 % nginx: worker process
 3956 be/4 www-data    2.70 M/s    0.00 B/s  0.00 % 99.99 % nginx: worker process is shutting down
 3953 be/4 www-data  251.54 K/s    0.00 B/s  0.00 % 99.99 % nginx: worker process is shutting down
 4567 be/4 www-data    2.21 M/s    0.00 B/s  0.00 % 98.30 % nginx: worker process
 4570 be/4 www-data  754.61 K/s    0.00 B/s  0.00 % 97.91 % nginx: worker process
 3949 be/4 www-data 1006.15 K/s    0.00 B/s  0.00 % 88.21 % nginx: worker process is shutting down
 3955 be/4 www-data 1509.23 K/s    0.00 B/s  0.00 % 84.60 % nginx: worker process is shutting down
Run Code Online (Sandbox Code Playgroud)

所以出于某种原因,那些试图关闭的进程会导致 IO 和服务器进入几乎无响应的状态,负载增长高达 5-6(这是一台双核机器)。同时 CPU 利用率约为 0.5%

重新启动 nginx 后一切正常,然后再次发生这种情况。

这是来自nginx错误日志的最新消息:

013/03/18 13:09:28 [alert] 3676#0: open socket #297 left in connection 145
Run Code Online (Sandbox Code Playgroud)

然后发生这种情况:

2013/03/18 13:10:11 [alert] 3749#0: 100 worker_connections are not enough
Run Code Online (Sandbox Code Playgroud)

这是 nginx.conf:

user www-data;
worker_processes 8;
worker_rlimit_nofile 20480;
pid /var/run/nginx.pid;

events {
    worker_connections 100;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile off;
        output_buffers 1 512k;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 5;
    types_hash_max_size 2048;
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

编辑:

Sendfile 开和关没有区别。

worker_rlimit_nofile == worker_connections 没什么区别。

worker_processes 也没什么变化。

smartctl 显示磁盘没有问题,但是我在这台机器上尝试了第二个磁盘,但仍然没有区别。

Rai*_*ow- 0

我会打开sendfile

 sendfile on
Run Code Online (Sandbox Code Playgroud)

我认为它避免了不必要的复制并节省了系统调用。另外,只有当 sendfile 打开时,tcp_nopush 才会打开。看这里。

另外,删除 types_hash_max_size。