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