OpenResty完全开发指南:构建百万级别并发的Web应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.11 性能对比

虽然OpenResty基于高性能的Nginx,目前也已经有了诸多的成功应用案例,但仍然有很多人对它抱有疑虑、持观望态度。一个可能的原因是它使用了较为“小众”的脚本语言Lua,与其他常见的开发语言相比社区很小,而且也没有大公司为之“背书”,知名度低导致不了解和偏见。但实际上,OpenResty在开发效率和运行效率上都超过了它的竞争对手。

我们可以用实际的例子来对比验证一下OpenResty的运行效率,比较的对象是与OpenResty类似、目前较为流行的Web开发语言/环境:Node.js、Go、PHP和Python。

测试方式是各自实现一个最简单的HTTP服务,不做任何额外的优化调整,直接返回“Hello World”字符串(具体的程序可以在GitHub上找到,位于benchmark目录)。

各语言/环境的详细信息如下:

    ■  OpenResty      :版本号1.13.6.1,源码编译。
    ■  Node.js        :版本号4.2.6, apt-get安装。
    ■  Go             :版本号1.6.2, apt-get安装。
    ■  PHP            :版本号7.0.22(运行在Apache2.4.18上), apt-get安装。
    ■  Python         :版本号2.7.12, apt-get安装。

注:本书作者并不很擅长Python,所以测试程序只使用了内置的、最简单的HTTPServer,并未使用twisted、tornado、gevent等框架,可能有些不公平,望见谅。

测试环境是一个单核Linux虚拟机,下面的表格是使用“ab -c 100-n 10000”(并发100个连接,共10000个请求)测试得到的结果:在这次测试中Python发生了“Broken Pipe”错误,未能完成测试,故没有数据。

ab测试结果如图1-2所示:

图1-2 ab测试结果

由表中的数据可见OpenResty的运行效率是最高的,在RPS指标上是Node.js的3.1倍,Go的1.6倍,PHP的2.5倍,远远胜出。

单使用ab测试可能还不足以说明问题,我们还可以使用http_load再运行另一个测试,参数是“-p 50-s 5”(并发50个连接,持续5秒),测试结果如下:

http_load测试结果如图1-3所示:

图1-3 http_load测试结果

毫无意外,在这次测试中OpenResty仍然是遥遥领先,在重要的fetches/sec指标上是Node.js的3.2倍,Go的1.8倍,PHP的2.9倍,Python的6.2倍。

对于高负荷的网站来说,即使是5%~10%的性能提升都是非常有价值的,更何况是50%~200%。注意这还是未经优化的结果,实际上OpenResty还可以轻松开启多个进程服务,成倍地扩充服务能力。

相信经过这两轮测试,读者心中应该可以得到明显的结论了。