一次Web服务器性能优化的经历

目前在做一个基于CDN的网站容灾备份项目,目的是在客户的源站发生故障以后,可以使用我们的备份系统作为临时源站,以保证服务不被中断。这两天客户做了一次测试,把他们的源站关闭之后,发现其网站无法访问,表现为浏览器一直在等待响应,为此客户很不满意,并表示如果下次测试还不理想,将考虑不跟我们进行合作。为了使客户下次测试达到满意的效果,我们需要在尽快找出问题的根源并加以解决,留给我们的时间也相当有限,只有周末两天的时间,这也意味着周末要加班了。
在客户测试时,我发现我们这边有台服务器宕机了,由此可以推断服务器估计是遇到了性能问题。为了找出问题的原因并加以解决,需要对系统做一次压力测试(之前没做过),选择的测试工具是http_load。关于http_load的使用请参考http://www.vpser.net/opt/webserver-test.html。测试后我发现当并发数为50的时候,系统的CPU负载就已经达到了80%以上,这样的承载能力是无法容忍的。
为了提高服务器的承载能力,我们对服务器的各项配置作了改进,包括Linux系统本身、Nginx以及MySQL的配置。经过不断地测试,最后我们发现当最大并发量达到1000的时候,服务器的CPU使用率会达到80%~90%,可以说已经满负载了,但是会有很多请求超时。因为我们使用的是Nginx+fastcgi的方式提供Web服务,所以进一步的优化应该是考虑优化fastcgi的配置。这时我在网上看到有些文章中提到了Nginx配置中关于fastcgi缓存的配置选项,而且使用fastcgi缓存对性能的提高效果显著,于是进行了尝试。果不其然,配置了fastcgi缓存后,测试结果相当出色:测试时间5分钟,最大并发量1000,共发起70万次请求,每秒平均处理2340个请求,下载数据37.5GB,平均下载带宽达到1Gbps,CPU使用率仅为10%左右。这样的结果也超出了我的预期。于是发邮件通知领导们我们目前已经完全可以应对客户再次测试了。当客户再次测试的时候,网站的打开速度很好,没有卡顿现象,客户表示很满意。为此,我也很欣慰,不枉我周六在家里加了一天班。
总结一下优化Web服务器性能需要考虑的几个方面:
1.优化Linux系统本身的配置,比如单进程打开文件的最大个数、最大用户进程数、进程的最多子进程数、TCP的配置等。
2.优化所采用的Web服务器的配置,比如Nginx或Apache httpd的配置等。
3.优化数据库的配置,比如MySQL等。
关于如何构建高性能的Web站点,有一本书:《构建高性能Web站点——改善性能和扩展规模的具体做法》。虽然已经买了,但是还没来得及看,由此不免感叹书到用时方恨少,看来得多看书了。

如何让Python多进程安全退出

最近在做访问日志处理方面的工作,需要对日志进行实时处理,由于需要处理的文件量比较大,所以考虑使用并行处理。在并行处理方面,Python有两个模块,threadingmultiprocessing,分别用于多线程和多进程。通过实际测试发现,多进程在并行处理方面(尤其是计算量大时)的表现明显优于多线程。具体原因可以参考Python文档里的描述:

In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.

关于使用Python的多进程时如何安全退出的问题,可以使用如下方式:

以上代码的工作原理是,程序接收外部信号(Ctrl-C或kill),然后将退出标志设置为True。对于子进程来说,它在处理完一次任务(即循环结束)后,通过判读这个退出标志来结束进程。而对于主进程则忽略这个信号,而是等所有子进程退出后才结束进程。

参考资料:
http://blog.csdn.net/linvo/article/details/7700257