Nginx的c30k问题解决方法

 更新时间:2014年09月17日 11:08:45   投稿:junjie  
这篇文章主要介绍了Nginx的c30k问题解决方法,本文同时探讨了Nginx AIO的使用问题,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

最近我们的下载服务遭遇了c30k,导致nginx的下载服务近乎停滞。原因嘛,很简单,服务器部署在国外,众所周知的原因,SL机房的线路不稳,加上不同地区出口速率抖动很厉害,为了加速下载,我们放开了限制,允许用户使用多线程的下载工具。这样一来,自然产生了c10k问题。下载文件都不小,每个用户至少使用4线程,同时下载若干个素材。。。很自然并发链接数30k以上。

更受限于手头money,无法扩容(实际上要有钱也不会跑国外)。因此,必须提高单机并发能力和吞吐量。

我们的下载服务是使用Perl写的一个Plack应用,典型的PSGI,实现下载验证,实时防火墙,用户下载跟踪等等,无法直接使用静态文件分发(实际上Perl的性能还是很高效的,部署于Starman,对比PHP的实现,是后者(PHP-FPM)的10倍左右)。

Starman是一个很不错的PSGI Server,它使用传统的Prefork模式。即便高效,但Prefork确实无法有效应对c10k,我无法把Starman的worker增大到几百上千个。在以前的文章曾经提到Evented IO是能够应付c10k的一个方案。因此,我使用Twiggy换下了Starman。Twiggy是基于AE(AnyEvent)的一个PSGI Server,单进程。在低并发下,单进程的Twiggy的qps是弱于Starman,不过到了高并发,Twiggy的优势就显现出来了。在实际部署中,我启动了多个Twiggy进程,分别监听独立的端口,nginx则使用upstream进行负载均衡。 10个Twiggy的吞吐量已经远远超过了50个Starman worker。 Twiggy的开销也不大,因此可以很放心的增加Twiggy的进程。

感谢PSGI的接口规范,从Starman切换到Twiggy,应用程序无需做任何改动。(前提是程序内不能有阻塞io的操作)。

另一个问题是服务器的IO-Wait比较高,毕竟下载这个是IO-Bound的任务。

Nginx支持Linux Native AIO,因此我考虑是否使用AIO能够大大降低IO-Wait? 性能应该有比较明显的提升?

网上有一些资料,吹嘘的Nginx AIO性能提升,神奇云云。我有点将信将疑,因为都没有任何的测试数据比较,均是人云亦云。另外,多数配置都是或多或少有问题的。

我使用的CentOS, Nginx AIO要使用,必须是CentOS 5.5以上。因为只有5.5的kernel才有AIO的backport,nginx并没有使用libaio。

此外,Nginx的AIO本来是为FreeBSD开发,Linux固然可以使用,不过受到了Linux AIO的很多限制。

1. 必须使用Direct IO. 这样一来,导致无法使用vm的disk cache.
2. 文件只有大小和directio_alignment定义block size整数倍的数据才可以使用AIO,当文件整数据块之前和之后,那些不能取整的部分则是blocking方式读取的,这也是为什么需要output-buffer。directio_alignment大小取决于你使用的文件系统,默认是512,而对于XFS,注意,如果你没有修改XFS bsize, 需要调整为XFS默认的4k.

我使用的配置如下:

复制代码 代码如下:

location /archive {
internal;
aio on;
directio 4k;
directio_alignment 4k;
output_buffers 1 128k;
}

当启用AIO后,可以看到vmstat中,cache的内存消耗迅速降低,这是因为使用AIO必须使用directio,这就绕过了vm的diskcache。

实际性能如何,AIO一定很快么? 这点即便是Igor也不确定。

从我们自己的实际效果看,AIO并没有明显的性能提升,相反,偶尔会轻微增加了IO-Wait,这是因为无法利用diskcache,而如果文件多数又和directio_alignment有偏差(尤其是断点续传的时候,多数文件读取位置在directio_alignment数据边界外),这部分的数据必须使用blocking io读取,又没有disk cache,增加IO-Wait也可以理解。

最终,结论是,与其使用不那么靠谱的Nginx AIO, 不如多开一些Nginx的worker,重复利用vm disk cache, 当内存100%利用率的时候,nginx的静态文件分发效率是高于AIO模式的。

BTW,这个实际用例也重新印证了我的一个观点,不要轻信网上那些毫无测试数据的忽悠,多数都是copy & paste的传说, 各个说好,其实多数都没实际印证过。

相关文章

  • nginx代理多次302的解决方法(nginx Follow 302)

    nginx代理多次302的解决方法(nginx Follow 302)

    这篇文章主要介绍了nginx代理多次302的解决方法(nginx Follow 302),详细的介绍了解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 阿里云ssl证书如何通过Nginx部署到服务器

    阿里云ssl证书如何通过Nginx部署到服务器

    这篇文章主要介绍了阿里云ssl证书通过Nginx部署到服务器的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Nginx禁止访问php文件的方法总结

    Nginx禁止访问php文件的方法总结

    当涉及到禁止访问 PHP 文件时,有多种方法可以考虑,以下是十多种方法的详细说明,以及如何在 Nginx 中应用它们,需要的朋友可以参考下
    2023-09-09
  • Nginx的一些常用配置汇总

    Nginx的一些常用配置汇总

    nginx配置说简单也简单,说复杂也复杂,入门简单,精通难,下面这篇文章主要给大家介绍了关于Nginx的一些常用配置,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Nginx强制跳转Https(Http访问跳转Https)

    Nginx强制跳转Https(Http访问跳转Https)

    这篇文章主要为大家介绍了Http访问强制跳转到Https的几种方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 为nginx设置默认虚拟主机(空主机头,默认主机头)

    为nginx设置默认虚拟主机(空主机头,默认主机头)

    nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效
    2010-11-11
  • Nginx location 和 proxy_pass路径配置问题小结

    Nginx location 和 proxy_pass路径配置问题小结

    本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程,本文给大家介绍Nginx location 基本配置及相关配置文件,感兴趣的朋友跟随小编一起看看吧
    2021-09-09
  • nginx 基本入门教程

    nginx 基本入门教程

    本篇文章主要介绍了详解nginx 基本入门,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • nginx的zabbix 5.0安装部署的方法步骤

    nginx的zabbix 5.0安装部署的方法步骤

    之前大家可能经常会基于apache去部署zabbix,但是这样会偶尔遇到一些问题,今天小编就带大家操作一下基于nginx的zabbix5.0的部署。感兴趣的可以了解一下
    2021-07-07
  • 详解Nginx 502错误解决办法

    详解Nginx 502错误解决办法

    这篇文章主要介绍了详解Nginx 502错误解决办法的相关资料,这里说明几种可能出现的502错误的实例,并一一说明如何解决,需要的朋友可以参考下
    2017-08-08

最新评论


http://www.vxiaotou.com