4. FastCGI 有多快?
看完安装 FastCGI 的阿帕契模块,以及无聊的程序设计注意事项后,我们来看看一些可以让人振奋精神的数据,效能比较 (bench mark) 总是计算机玩家的最爱 :-)
4.1 评比工具 - ApacheBench
在阿帕契服务器的套件中,有一个叫做 ab (ApacheBench) 的工具。ApacheBench 主要是用来测试阿帕契服务器执行效率用的,我们就以 ApacheBench 做为 CGI vs. FastCGI 的评比工具。
ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求,同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据做为调整服务器设定或程序的依据。 ApacheBench 的用法如下:
Usage: /usr/local/apache/bin/ab [options] [http://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-p postfile File containg data to POST
-T content-type Content-type header for POSTing
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-V Print version number and exit
-k Use HTTP KeepAlive feature
-h Display usage information (this message)
假设我们要对 echo.fcg 做测试,仿真 1000 次的联机请求,而且同一时间有 20 个并行的 (concurrent) 联机请求的情况,只要在命令列模式下执行
$ ab -n 1000 -c 20 http://localhost/fcgi-bin/echo.fcg
稍等一会,ApacheBench 会把结果秀出来,
This is ApacheBench, Version 1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-1999 The Apache Group, http://www.apache.org/
Benchmarking localhost (be patient)... Server Software: Apache/1.3.6
Server Hostname: localhost
Server Port: 80
Document Path: /fcgi-bin/echo.fcg
Document Length: 995 bytes
Concurrency Level: 20
Time taken for tests: 6.859 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 1142000 bytes
HTML transferred: 995000 bytes
Requests per second: 145.79
Transfer rate: 166.50 kb/s received
Connnection Times (ms)
min avg max
Connect: 0 4 61
Processing: 62 128 771
Total: 62 132 832
以上结果指出,在同时间 20 个联机请求 (Concurrency Level) 的情况下,完成 1000 次的联机请求,共花了 6.859 秒 (Time taken for tests),因此这个程序每秒平均可以处理 (Requests per second) 145.79 个联机请求。
在接下来的评比测试中,我们就以每秒可以处理的联机请求数目来做为效能评比的依据。
4.2 CGI vs. FastCGI
前面提过利用 fcgi_stdio.h 函式库编译出来的 FastCGI 程序也兼容于 CGI 模式,因此我们只要把 fcgi-devkit-2.1 套件附的范例程序 echo.fcg 复制到 /cgi-bin 目录下,并且把文件名改成 echo.cgi,这支范例程序就可分别以 CGI 模式和 FastCGI 模式来执行,并且做比较。
首先分别对 CGI模式执行的 http://localhost/cgi-bin/echo.cgi 以及 FastCGI 模式的 http://localhost/fcgi-bin/echo.fcg 连续送出 10, 100, 1000, 10000 次的联机请求,得到的平均每秒可处理的请求 (Requests per second) 结果为:
联机数目 10 100 1000 10000
CGI 52.63 53.08 52.24 51.49
FastCGI (static mode) 204.08 224.22 146.78 207.14
接下来再分别以 Concurrency Level 为 10, 50, 100 的情况下做测试,得到 Requests per second 结果为:
Concurrency 联机数目 10 100 1000 10000
10 CGI 38.31 46.55 53.61 55.09
10 FastCGI 185.19 208.33 162.63 177.14
50 CGI 27.25 33.16 50.72 53.99
50 FastCGI 92.59 176.37 196.58 196.88
100 CGI 17.92 24.84 48.14 52.84
100 FastCGI 86.21 187.27 195.54 193.17
由上述数据看来,对同一支程序 (echo.c) 而言,使用 FastCGI 模式来执行,速度提升了 3-4 倍。可见得 FastCGI 对网站程序的效能提升上具有相当大的助益,尤其当使用量很大时,其效益更加明显。
以上的测试条件并不是十分严谨,主要在让你了解使用 FastCGI 之后对于效能及速度上一个概括的比较,也提供一个可供网站开发者可以评量的依据。
实际上,对一个初始化动作复杂,例如要先和数据库建立联机,或是配置内存,做变量初始化的程序来说,使用 FastCGI 可以比原先 CGI 在效能上增加更多,速度更快。而对一个有数据库可联机数目限制的系统来说,使用 FastCGI 就好象一个 Application Server 一样,不用担心 CGI 一次 fork 太多,超过联机数目上限 (FastCGI 可以设定一次跑几支)。
4.3 找出 Memory Leak
善用 ApacheBench 这个工具,还可以帮助网站程序发展人员找出在 FastCGI 程序中隐藏的 Memory Leak 臭虫。
每一支 FastCGI 程序在处理完一个联机请求后的状况都应该相同,我们利用 ApacheBench 对欲测试的程序送出上百次或上千次的联机请求以仿真实际上线的状况,如果发现程序占用的内存愈来愈多而且不会减少的话,表示程序有 Memory Leak 的问题。
虽然对 FastCGI 程序而言,当它一直不断吃掉系统资源到资料耗尽后会自动退出 (core dump 或是 exit) ,释放所占用的资源然后再重新激活,但这将会影响系统其它功能的正常运作,所以撰写 FastCGI 程序一定特别小心。进入讨论组讨论。
5. 参考
如果你想更进一步了解 FastCGI ,在 FastCGI 的首页上可以找到相关的所有资料,包含 FastCGI 的发展规格,软件下载,说明文件等。FastCGI 首页的网址是 http://www.fastcgi.com/
FastCGI 也有一个邮件讨论区 (mailing list),你可以寄 email 至
在邮件的主旨 (Subject) 处填上 subscribe 即可。但是在发问之前,请先把说明文件或安装文件看清楚,或是到邮件讨论区的档案 (mail archive) 中先找找问题是否已经有人问过而且有人回答过了,以免浪费重复的网络资源。如果你发现了 mod_fastcgi 模块或 fcgi-devkit 发展套件的错误或严重的问题,FastCGI 的发展小组会很热心的帮你想办法解决。
FastCGI 还有许多不同的用法,以及特别的应用,就有待您亲自去探索了。希望本文能帮助有心使用 FastCGI 的朋友可以顺利地安装 FastCGI 相关模块和程序,让你的网站都能全速前进。进入讨论组讨论。