路斯坦普

这一次,我们玩真的!

各种应用服务器、数据库和云主机对比性能测试 —

转贴请注明出处,永久链接:http://www.achillesxu.com/?p=8

最近在做后台选型,后台需要有数据库和 WEB 服务器,配合对前端提供 JSON API 接口。为此进行了不少测试,后来想不妨做全一点,还可以拿出来分享一下。

这次的测试分三个部分:

  1. 应用服务器测试,涉及各种性能和口碑较好的应用服务器,包括 PSGI 的各种实现、 php-fpm 、 node.js 、 nginx lua ,同时加入 nginx echo 、 nginx 静态页这两个做对比参考;
  2. 数据库服务器测试,对 mysql 、 mangoDB 、 Cassandra 分别进行读和写的测试;
  3. 云主机,对比 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 一些。这两者都无法解决未来可能出现的从世界各地就近写的需要,不过还是不要过早优化了。

欢迎评论参与探讨。


【转贴】发工资了,心情真不错 —

12月1号,晴,发工资了,心情真不错。
我,一名朴素的程序员,来了公司一年多了。
一年多以来没有哪次发工资有几天这么高兴,一来是上次听经理说由于我不怕吃苦,任劳任怨
公司还给我涨工资了,二来是学校的助学贷款上个月还完了,还剩了300寄回了家
我想,这个月终于可以宽裕一点了。
中午吃饭的点,第一个跑出来,飞似得直奔楼下的自助取款机,火急火燎的插卡看看涨了多少。
激动了密码都差点忘了,一看涨了800,心里暗暗欢喜。
你说这人啦,还是得踏踏实实的,心里暗暗告诉自己:小子,好好干。
今天的天气真不错。

一阵淋漓尽致的兴奋后,在草坪旁边的凳子上坐会,先让自己冷静冷静,别吃饭的时候
让我们经理看见了笑话:不就涨几个钱嘛,看把你兴奋的。那多尴尬啊是吧,冷静,冷静,
常舒一口气,呼……。吃饭。
来到楼下的店面,以前也是每天都在这儿吃,他家的盒饭还是不错的,特别好的是每顿饭赠送
小碗汤,这个不错。所以我每次都来他家吃。
他家的盒饭价格最少有6元,8元,10元。也有12元,20元的。
“以前都是吃的6元的,今天要不小资一下?”,心里偷偷对自己说。
“不行,4块钱差不多就能应付晚餐了,省省吧你还是”,我犹豫了起来。
看着旁边人10块的盒饭里那些红烧肉,大块大块的,有些忍不住了,“就一次,尝尝”。
“就一次啊”。

第一次点10块得盒饭,心里真是五味杂陈,正准备点时我们经理进来了,
我赶紧转过头,生怕他看见咱小张一涨工资就腐败了,影响多不好。
还好我机灵,他好像没有注意我,我急忙给老板指着菜单上的10块的盒饭,一边瞄着经理,小声的说:
“10块的”。
老板瞅了瞅我,并没有给我拿盒饭,一直盯着我,我以为他没有听见,又稍微大声的说:
“10块的盒饭”。
“呸,程序员也敢吃10元的盒饭,真不要脸”,老板唾了我一口,面目狰狞的吼了一句。
我当时一下就蒙了,不知道发生了什么,只是脑子嗡嗡作响,店里的声音有些乱了起来,
七嘴八舌的议论起来,“哎呀,程序员吃啥10块的盒饭嘛,真是的”,“… …”。
我当时觉得无地自容,我好想逃,离开这里,找一个人们不认识我的地方,好好做我的程序员。
但是想想我们经理这么看得起我,还给我涨工资,就这么走了也怪不好意思的。

我想想其实他们说的也对,程序员吃啥10块钱的盒饭,本本分分的,自己是哪根蒜自己衡量好,
找准自己在社会上的位置,别有事没事跟暴发户似地卖弄自己。
我被骂的怪不好意思的,然后笑嘻嘻的给大家道了歉,要了一个6块的盒饭,大家才安静下来。
我在靠窗的桌子坐下,老板笑嘻嘻的给我端来了汤,外面依旧阳光灿烂。
我吃完6块得盒饭,沫沫嘴走了出来,
真他妈踏实。