各种应用服务器、数据库和云主机对比性能测试 —
转贴请注明出处,永久链接:http://www.achillesxu.com/?p=8
最近在做后台选型,后台需要有数据库和 WEB 服务器,配合对前端提供 JSON API 接口。为此进行了不少测试,后来想不妨做全一点,还可以拿出来分享一下。
这次的测试分三个部分:
- 应用服务器测试,涉及各种性能和口碑较好的应用服务器,包括 PSGI 的各种实现、 php-fpm 、 node.js 、 nginx lua ,同时加入 nginx echo 、 nginx 静态页这两个做对比参考;
- 数据库服务器测试,对 mysql 、 mangoDB 、 Cassandra 分别进行读和写的测试;
- 云主机,对比 linode 、盛大云、蓝汛云主机。
所有的测试统一使用 http_load 工具,并发100,持续10秒,从服务器本机发起:
1 | http_load -p 100 -s 10 url.txt |
应用服务器测试
- 统一在 linode vps 上测试,该vps的配置是4核、512M 内存、主频2.3 GHz 。
- 测试应用都是 hello world 。
- 所有应用服务器都采用缺省配置。
- nginx lua 用的是 LuaJIT 。
结果排名(单位:请求每秒):
feersum: 8866
nginx echo: 8677
nginx lua: 8636
nginx html: 8233
node.js: 5439
starman: 5066
twiggy: 3866
php-fpm: 3789
- 首先可以看到第一方阵是 feersum 、 nginx echo 、 nginx lua 、nginx html 这些,都是八千多。这些可能是受到 linode vps 本身的性能影响,或者是 http_load 本身到了瓶颈,高下分出不是很明显。
- 不过还是可以看到 nginx html 相对其他几个要差得多点,可能是因为要到磁盘上读取文件导致的。
- feersum 是第一个测的,而 nginx 相关的几个是最后测的,当时有点怀疑是不是机器性能随着时间推移变差了,所以又测了几次 feersum, 居然有好几次突破九千大关。
- 接下来是 node.js ,一如它在业内的口碑,性能也很卓著。
- starman性能也不错,是简单编程(不需要把程序写成 IO 异步的)的第一选择。值得一提的是 starman 缺省配置只开启了5个进程。
- php-fpm 有点些令人失望,可能是他太早开始领先了,放松得太久了。另外 php-fpm 在长时间测试中曾经发生过性能急剧下降到几十请求每秒的情况,重启后正常,稳定性堪忧。
数据库服务器测试
- 统一在 linode vps 上进行测试。
- 统一使用 starman 做应用服务器。
- 测试读的时候,测试表里都只有一条记录。
- 测试表都没有索引和约束,单个字段,测试写的时候插入的内容是 hello world 。值得一提的是 cassandra 的数据模型里有行的 key ,会需要做冲突检查。
- mysql 用的是 myism 引擎。
- cassandra 用的 JVM 是 Oracle 官方的。
读测试结果排名(单位:请求每秒):
mysql: 4013
mongodb: 2966
cassandra: 1761
写测试结果排名(单位:请求每秒):
mysql: 4019
mongodb: 3225
cassandra: 1941
- 在这种简单测试里,出现写比读快的情况,也还是可以理解的。
- 这三个数据库刚好在 CAP 理论三角形的三条边上。不过 cassandra 却没有表现出它的高可用。 mysql 一如预料中的快,而 cassandra 辜负了我的期望。它是用 java 编写的,结果本该如此吧,我也不用再自欺欺人了。
- 可以看到 mysql 的成绩已经超过应用服务器中的 php-fpm 了。本来带宽充足的情况下后台的瓶颈应该在数据库的,瓶颈出现在应用服务器上实在是不应该。大家选型的时候要考虑了,虽然实际的数据库查询可能比较复杂,达不到这个成绩。
- mongodb 落后 mysql 并不多,考虑到文档数据库和原生分片的方便性,可以采用。
云主机对比测试
- 配置信息:
linode: 4 core, 512M mem, 2.3GHz cpu
盛大云: 1 core, 512M mem, 2.1 GHz cpu
蓝汛云主机: 16 core, 2G mem, 2.6Ghz cpu - 分别采用 feersum 和 starman 做应用服务器进行测试。
feersum 结果(单位:请求每秒):
蓝汛云主机: 21155
linode: 8890
盛大云: 5582
starman 结果(单位:请求每秒):
蓝汛云主机: 9114
linode: 5102
盛大云: 1429
- 各云主机的配置和价格都有较大的差异,直接对比不能说明任何问题。综合来看如果是挑选用于国际的云主机的话,linode 是不二选择。
- 从数据可以看出, starman 在只有一个核的主机(盛大云)上性能下降很大,说明这种多进程的模型比较需要多核或多CPU的支持。
总结
- 静态文件服务器、代理缓存服务器和负载均衡服务器肯定还是用 nginx 来做。有特殊需求就用他的模块前后组装,四两拨千斤来实现,复杂点的逻辑会用 nginx lua 。基本是坚决不再自己写模块了。
- 应用服务器需要操作数据库,而且团队的成员都会参与开发,所以再三考虑还是决定弃用要求异步编程的模型。这样可以减少程序员开发出错的机会,也不用老做代码 review 了。而且到时候如果要访问个什么新出来的非 http 接口的东西,也不用自己去实现异步驱动。目前 AnyEvent::MongoDB 还不是很稳定, Coro 更是没有相关模块。如果跑不满带宽的话,再换用异步模型。
- 考虑到团队熟悉 perl 的要多过熟悉 javascript 的,所以基本敲定 starman 。
- 由于是封装 API ,就不采用 Dancer 什么的这些网站框架了,自己在 PSGI 的基础上封装一个薄薄的层就可以了。
- 数据库 mysql 还是 mongodb 是一个两难的选择,更倾向于 mongodb 一些。这两者都无法解决未来可能出现的从世界各地就近写的需要,不过还是不要过早优化了。
欢迎评论参与探讨。