-
2009年10月18日
项目性能优化 - [linux]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://butoo.blogbus.com/logs/48681852.html
最近一段时间一直在做项目性能优化的工作,其中一项就是想把项目中的网络通信模块进行改进。当前的网络模块工作在同步阻塞模式,再配上多线程进行事务处理。在这种模式下一个连接(或者套接字)对应一个线程,虽然采用了线程池机制,但程序执行效率一直都是个问题,特别是在高并发连接的情况下。还有就是主程序工作在单进程模式下,在各种事务处理线程中涉及到很多调用数据库api的操作,但数据库api时不时给你报一个segment fault,然后整个进程都崩溃了(人也一起崩溃)。因数据库api导致程序崩溃是时有的事情(没办法,国产数据库稳定性还不够),我们只好做好充分的测试,帮数据库提供方发现bug,但这不是好的解决办法。我觉得让我们的项目服务器工作在多进程模式下是很有必要的,再配上多路I/O复用模型和多线程事务处理。于是,有了采用多进程多路I/O复用及多线程模型来搭建我们的服务器框架的想法。
十一在家抽空看了几天资料,发现lighttpd就是一款性能很高的web服务程序,采用的就是多进程多路I/O复用。网上说lighttpd有取代apache的趋势,且代码量比较小,编程风格也不错。由于lighttpd是开源软件,于是决定下载源码来研究一下。令人惊喜的是,chinaunix论坛上已经有网友对lighttpd的部分源码进行了分析,其中就有讲到多进程工作模型和多路I/O复用的网络I/O处理模型,在看源码的时候结合网友的分析,难度小了不少,也基本知道该怎样来实现自己的项目框架了。
这个周末在家闲者没事,就一直在弄这个,晚上终于实现了框架的原型。由于采用了多进程,程序的稳定性大大增强了,当一个子进程崩溃了,主程序会再次创建一个子进程;在网络I/O模型方面支持多路复用的几个系统函数调用,如select、poll及epoll。我想该原型还有待改进的地方,比如在多进程方面也可以采用进程池,限制因同一个事务处理而多次导致进程崩溃的次数等等;在网络I/O模型方面,由于以上几个多路复用系统调用支持的是异步事件阻塞I/O,当要处理的I/O时间很长的话(如我们的服务器有时候会处理很大的文件,还有会读取大的blob字段),肯定会影响事务线程的执行效率。在这个时候,可以引入异步时间非阻塞I/O机制(aio),应该可以提高系统吞吐量。。这些待以后再考虑。
收藏到:Del.icio.us







