Server-side I/O Performance: Node vs. PHP vs. Java vs. Go 介绍了 webserver 的技术演进过程(多进程->多线程->单进程事件回调->协程),值得一读。文中有两项内容值得留意,第一个是 cpu 主频与时钟的换算关系,另一个是基准测试方法。
1GHz 主频每 1 纳秒(10^-9秒)发生一次时钟嘀嗒,3Ghz 主频每 1 纳秒发生三次时钟嘀嗒。嘀嗒(cycle) 是 cpu 的指令执行步长,一纳秒内发生几次 cycle ,简单等同于 cpu 执行了几条指令。
基准测试的关键是:测量什么情况下什么指标
。
Server-side I/O 中为了对比 php、java、node、go 的性能,测量了 300 并发、5000 并发下的请求响应时间,把平均响应时间或者处理速率(RPS,req/sec)认定为性能的表征。
Nginx 除了 RPS,还使用 CPS(连接新建速率)、Throughput(见 《nginx 的性能报告》)。
RPS、CPS、Throughput 三个指标足够了,有些场景只需要前两个指标。选定指标之后的问题是选择场景。
Web 框架执行的任务类型多样,综合性能不好评估,需要测量哪些场景的?
TechEmpower 发起的 Web Framework Benchmarks 收集了数百个框架,提出了 7 个测量场景:
其中「查询未预知数目的全表数据」 被命名为 Fortunes。fortune 是 linux 上可以安装的一个命令,就是显示随机句子,类似于每天一句名人名言:
$ yum install fortune-mod
$ fortune
...the increased productivity fostered by a friendly environment and quality
tools is essential to meet ever increasing demands for software.
-- M. D. McIlroy, E. N. Pinson and B. A. Tague
这个场景是在程序不知道总数据量有多少的情况下,查询全表数据。
Project Information Framework Tests Overview 对每种场景有详细说明。
Web Framework Benchmarks 是测试报告,如下: