免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

HTTP服务器实现技术细节剖析--深入学习Apache和Nginx(获奖名单已公布-2012-11-15) [复制链接]

论坛徽章:
0
81 [报告]
发表于 2012-11-04 14:04 |只看该作者
Apache 安装:一开始没有指定MPM类型即以默认的prefork(预派生子线程)方式,发现启动后,业务运行不流畅,访问比较慢。后重新编译指定MPM类型为worker(支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。)并去掉了一些没用的模块(./configure --prefix=/usr/local/system/apache --with-mpm=worker --enable-so --disable-cgid --disable-cgi --disable-imap),对httpd.conf进行优化配置:
1. worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
  MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大。
2. ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。
3. Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是 20000)。
4. 需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且 MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。
我的配置如下:
StartServers         3
MaxClients          1500
ServerLimit         25
MinSpareThreads     50
MaxSpareThreads     200
ThreadLimit         200
ThreadsPerChild     60
MaxRequestsPerChild  0
目前运行比较稳定。速度也不错。
Resin3.0.17 的配置(resin.conf):在 host中加入
  <servlet-mapping url-pattern="*.gif" servlet-name="plugin_ignore"/>
  <servlet-mapping url-pattern="*.png" servlet-name="plugin_ignore"/>
  <servlet-mapping url-pattern="*.ico" servlet-name="plugin_ignore"/>
  <servlet-mapping url-pattern="*.jpg" servlet-name="plugin_ignore"/>
表示这些文件resin不处理。这样apache会去处理。这是与resin3.0.3不同的地方。

论坛徽章:
0
82 [报告]
发表于 2012-11-04 14:07 |只看该作者
Nginx比较Apache:事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务
Nginx比Apache好、比Apache快之类。Nginx更主要是作为反向代理,而非Web服务器使用。我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对Nginx和Apache的工作原理都略有了解,粗谈一下看法。

不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。

所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。我随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价值。

再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。这个时候多进程或线程就体现出优势,每个进程各干各的事,互不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与事件机制相辅相成,长期存在。

总结之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。

论坛徽章:
0
83 [报告]
发表于 2012-11-04 14:17 |只看该作者
实战应用中更加关注优化
1.利用TCMalloc优化Nginx的性能
TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。
要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。
2.内核参数的优化,主要是在Linux系统中针对Nginx应用而进行的系统内核参数优化,常见的优化参数值如下。
下面给出一个优化实例以供参考:

net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000  
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30

论坛徽章:
0
84 [报告]
发表于 2012-11-04 19:29 |只看该作者
benney1981 发表于 2012-11-02 12:13
实际应用例证:我们用2台nginx替换掉了5台apache,而且速度明显比以前快,占用的资源也比以前小,具体数据没 ...


期待这种实战报告

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
85 [报告]
发表于 2012-11-05 09:20 |只看该作者
benney1981 发表于 2012-11-02 12:13
实际应用例证:我们用2台nginx替换掉了5台apache,而且速度明显比以前快,占用的资源也比以前小,具体数据没 ...


快是肯定的,看62楼的截图就知道了!不过只局限于静态文件。

你这里2台替换5台?有截图或者具体方案没有? 难道实际服务上的应用全是静态文件?没有后台语言的应用?

论坛徽章:
0
86 [报告]
发表于 2012-11-05 19:27 |只看该作者
Nginx 用在国内的很多企业,如淘宝,淘宝甚至将其名字改为t开头回复 1# send_linux


   

论坛徽章:
0
87 [报告]
发表于 2012-11-07 11:12 |只看该作者
用自已开发的kangle飘过。
kangle采用的技术构架是,多线程单进程,每个线程使用epoll事件。
好处是,能像nginx的多进程那样,利用多核cpu。
cache又能共享,避免nginx那样多进程之间cache无法共享的问题。

论坛徽章:
3
季节之章:冬
日期:2015-01-15 10:36:57IT运维版块每日发帖之星
日期:2015-09-24 06:20:00IT运维版块每日发帖之星
日期:2015-10-24 06:20:00
88 [报告]
发表于 2012-11-07 16:37 |只看该作者
无法精确描述两者区别。
感觉apache有的ngnix也有,两者从功能上来看差不多。可以最主要的区别是两个不同的团队在做同样功能的产品。就像小米手机与华为智能手机一样的区别。

论坛徽章:
0
89 [报告]
发表于 2012-11-08 14:25 |只看该作者
很明显,明白人只有一个:aha45678。其他的人就不解释了,只能盲从。

论坛徽章:
0
90 [报告]
发表于 2012-11-08 14:31 |只看该作者
回复 89# oyesoyear


    兄弟过奖了,我也是菜鸟一个,平时问白痴问题的时候你没看到罢了,哪位有环境的大牛请测试一下Nginx和apache的压力测试,倒是真的,请大家引玉吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP