纠结及其他
07年初进入现在的公司,不久后用twisted写了一个http开发框架,提供内部系统之间的http接口服务。说是框架,其实很底层,基本相当于http服务器+URL分发。所以,开发的目的也很明确,就是性能。
在一年多的应用以来,发现很多问题,依次解决,改进了许多。现在提供一些性能参数吧,给需要对python开发系统,进行性能估算的朋友一点数据。
服务器就是四核志强 E5420,2.50GHz,内存4G。除了日志基本没有硬盘IO。
跑hello world的时候,50并发可以达到1800req/s。关闭accesslog日志以后,可以达到2600req/s。当然,这个服务器只能用一个CPU核心。
在应用中,是4个twistd实例在load balance后面一起干活,如上述配置的一台服务器。刚才统计出来的,过去24小时中处理完成约2000万次的http接口调用。调用的后面是有数据库查询的,一般来说都不只一次查询。实际看到的速度接近峰值的一小时内最高可以做约140万次http接口调用,折合389req/s。
总的来说,数据库依旧是几乎所有系统的瓶颈。
再就是高速运行情况下的问题。
默认的twisted使用的是select(),并发性能不要太指望。甚至并发数稍微高一点的时候就会报什么file descriptor out of range of select()的错误。总之默认的twisted能承受的并发数很有限。
twisted是有epoll支持的,你可以在启动twistd时选择epollreactor。不过貌似并不稳定。使用epoll()方式以后,我的印象大约是每几千个请求就会报出一个文件描述符的什么错误。另外,就是在关闭程序时有个语法错误,这个绝对是twisted的bug。从2.5.0升级到8.1.0之后,关闭服务器那个报出的bug依然存在。而twisted-8.1.0在启动时还要很傻的在安装位置写一个什么缓存文件。普通用户根本没有权限,所以每次启动服务器时都会报错,但是服务器可以照常启动。
我对twisted的容忍基本限于如此了。这段时间感觉libevent很优雅,假如我的雅兴还没过去,我会尝试给libevent附带的http服务器加上python binding,也许性能会更高。