nginx 工作进程导致磁盘 IO 异常高

nginx 工作进程导致磁盘 IO 异常高

我刚刚设置了一个 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

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

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

这是来自 nginx 错误日志的最新内容:

013/03/18 13:09:28 [alert] 3676#0: open socket #297 left in connection 145

然后发生了这样的事情:

2013/03/18 13:10:11 [alert] 3749#0: 100 worker_connections are not enough

这是 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;

任何帮助都将不胜感激!

编辑:

Sendfile开启与关闭没有区别。

worker_rlimit_nofile == worker_connections没什么区别。

worker_processes也没有改变什么。

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

答案1

相对较新的 HDD 可以实现 150MB/s(1.2Gbps)的连续读取(和写入),但如果有多个并行读取/写入(即使每个读取本身仍然是连续的),那么吞吐速度将很容易下降 10 倍。

所以,20MB/s(160Mbps)听起来像是你的硬盘的限制

也许另一台服务器有 SSD,或者有更多内存,并且缓存了这些文件,但这台服务器的缓存方面出现了问题(可能是内存很少,但可能是内核设置优化错误)。

无论如何,这听起来像是超出 nginx 控制范围的事情。

您可以尝试将 nginx 内存缓冲区增加几倍,以使读取更加连续,但如果您只有一个基于盘片的 HDD(例如,单次连续读取最多 150MB/s,多次读取时下降几倍),并且由于内存不足而没有使用缓存,那么您将无法推动接近 1Gbps(128MB/s)的速度。

如果您确实需要 1Gbps 吞吐量:如果大多数常见文件可以缓存在内存中,请获取更多内存;否则,获取快速的 SSD。

答案2

我会打开sendfile

 sendfile on

我认为它可以避免不必要的复制并节省系统调用。此外,只有当 sendfile 处于开启状态时,tcp_nopush 才会处于开启状态。看这里。

还,删除 types_hash_max_size。

相关内容