我有一些运行 nginx 的文件托管服务器,提供平均大小为 500MB 到 6GB 的静态文件。这些服务器使用 Lustre1.8 作为集群文件系统。文件保存在某个 raid6 阵列上,条带大小 = 512KB。
正常情况下,nginx 工作正常。
_ 磁盘 i/o:设备:tps MB_read/s MB_wrtn/s MB_read MB_wrtn
南区 727.00 136.23 5.75 136 5
顺时针 627.00 124.36 0.01 124 0
_ 交通流出:
iface Rx Tx 总计
eth2:480.00 b/s 551.30 Mb/s 551.30 Mb/s
eth3:480.00 b/s 481.72 Mb/s 481.72 Mb/s
eth4:136.47 Mb/秒 525.45 Mb/秒 661.92 Mb/秒
eth5:480.00 b/s 497.82 Mb/s 497.82 Mb/s
键0:136.47 Mb/s 2.01 Gb/s 2.14 Gb/s
_ 正在服务的文件数:
lsof -u nginx -n | grep 存储文件 | wc -l
3982
但是,当出现热门情况时(当出现新的热门文件时,可能是最近上传的色情 DVD 或 JAV),会有很多客户端(超过 800 个)同时下载该文件,而 nginx 进程将进入 D 状态。最后,几乎所有进程都处于 D 状态!这会使下载速度非常慢 :(
root 25821 0.0 0.0 33032 584 ? Ss Dec20 0:00 nginx: 主进程 /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 25823 0.8 1.5 158384 126396 ? S Dec20 23:53 nginx:工作进程
nginx 25824 0.7 1.8 182276 150420 ? D Dec20 21:58 nginx:工作进程
nginx 25825 0.7 2.1 207584 175728 ? D Dec20 22:01 nginx:工作进程
nginx 25826 0.8 1.8 186052 154196 ? D Dec20 23:32 nginx:工作进程
nginx 25827 0.7 1.9 191448 159464 ? D Dec20 23:03 nginx:工作进程
nginx 25828 0.8 1.6 166044 134188 ? D Dec20 24:56 nginx:工作进程
nginx 25829 0.7 1.3 139308 107452 ? S Dec20 23:00 nginx:工作进程
nginx 25830 0.7 1.7 176652 144796 ? D Dec20 21:08 nginx:工作进程
nginx 25832 0.7 1.2 136648 104788 ? D Dec20 20:25 nginx:工作进程
nginx 25833 0.8 1.7 178948 146964 ? D Dec20 23:27 nginx:工作进程
nginx 25834 0.7 2.0 195828 163968 ? D Dec20 21:45 nginx:工作进程
nginx 25835 0.8 1.6 166200 134344 ? S Dec20 23:30 nginx:工作进程
nginx 25836 0.8 1.3 144624 112640 ? D Dec20 23:50 nginx:工作进程
nginx 25837 0.7 1.3 143644 111784 ? D Dec20 22:02 nginx:工作进程
nginx 25838 0.7 1.3 141912 110056 ? D Dec20 21:17 nginx:工作进程
nginx 25839 0.6 1.4 150580 118724 ? S Dec20 20:12 nginx:工作进程
nginx 25840 0.8 1.5 158916 126928 ? D Dec20 23:48 nginx:工作进程
...
我尝试过多次调整进程工作量,但都没有成功!我该如何解决这个问题?我认为当很多客户端访问同一个文件时,由于缓存的原因,情况应该会更好?!
以下是 nginx 的配置:
#worker_processes 48; worker_rlimit_nofile 800000; 事件 { worker_connections 51200; 使用 epoll; } http { sendfile off; directio 1m; output_buffers 1 512k;
tcp_nopush 关闭;tcp_nodelay 开启;
保持活动超时 5;...
nginx -V
nginx: nginx 版本: nginx/1.0.0 nginx:由 gcc 4.1.2 20080704(Red Hat 4.1.2-50)构建
uname -a
Linux OST 2.6.18-194.17.1.el5_lustre.1.8.5 #1 SMP 星期一 11月 15 日 15:48:43 MST 20
如果您需要更多信息,请告诉我。
答案1
您的磁盘子系统无法提供足够的速度,这就是为什么 nginx 被锁定在 IO 上,因为它默认是同步的。
您可以尝试使用aio:http://wiki.nginx.org/HttpCoreModule#aio- 它可以解决工作进程锁定问题,因此与代理或其他异步操作相关的所有其他请求都将运行得更快。但 aio 不会显著加快您的下载速度。
考虑添加更多内存:从 8 GB 增加到 24 GB 将改善 linux vfs 缓存,并且可能会产生令人难以置信的结果。
RAID6 不适合静态文件服务。它在单线程读取时速度很快,在数十甚至数百个并发读取时性能会下降。没有什么比将单独的磁盘配置为 JBOD 更好的了。您也可以尝试使用 SSD 来处理一些“热门”内容。