我有一个PHP文件,它从Memcached获取HTML并将其提供给用户。当我这样测试时:
ab -n 1000 -c 100 http://website.com/test.php
每秒发出22个请求。
但是当我将相同的HTML放到HTML文件中并进行此测试时:
ab -n 1000 -c 100 http://website.com/test.html
我每秒得到4500个请求。
我需要坚持使用PHP,因为我第一次需要生成HTML,下次我只是从Memcached获取生成的HTML。此外,HTML I显示对于每个其他用户是不同的(基于$ _GET ['user_id']值识别)。有没有办法让RPS更高?更接近于提供纯HTML?
我使用lighttpd作为网络服务器。
答案 0 :(得分:3)
思想链(待续......):
首先,我将测试问题是由并发性引发还是由于并发性显着恶化。通过-n 1000 -c 100
测试,您的比率为22/4500。那么-n 1000 -c 10
或-n 1000 -c 1
呢?
然后我会再次尝试相同+跟踪内存消耗,磁盘I / O和CPU使用情况。这中的任何一个明确是限制因素吗?
然后我会测试简单的PHP脚本:
test.html
的内容已复制到test.php
echo $mc->get(string $key)
这些与test.html相比如何?
编辑:
让我们以Web Server Performance Comparison: LiteSpeed 2.0 VS作为比较点。基准测试是针对另一个“竞争对手”的网络服务器产品进行的,但暂时让我们假设他们不是(太)偏见; - )
他们有一个
lighthttpd每秒提供15475个文件,每秒100个字节,脚本helloworld.php
每秒1593次,phpinfo.php每秒399次(两个FastCGI)。这是~1:10(你好世界)或1:40(phpinfo)的比例。 “你的”比例为22:4500~1:200。甚至更奇怪的是,当剧本改变时它不会改变。你的“真实”脚本或空的PHP脚本,无论如何始终是1:22。这引起了“陌生因素”(即使测试不相同)。
首先,我会仔细检查PHP是否使用FastCGI支持进行编译,请参阅http://www.fastcgi.com/docs/faq.html#PHP。
然后我用测试中提到的简单的C / C ++ FastCGI程序测试“my”lighthttpd,这是一个真正简单的“hello world”。 http://www.fastcgi.com/devkit/doc/fastcgi-prog-guide/ch2c.htm#4263有一个例子。如果它“很好”,即明显优于PHP FastCGI,我会尝试使用“勉强运行”的PHP版本,即使用--disable-all
进行编译,只有那些模块(重新)激活并内置于是必要的启动PHP并让它打印“你好世界”。也使用默认的php.ini
。这会改变任何吗?
答案 1 :(得分:3)
比脚本更快?
尝试编写纯HTML文件并提供服务。并创建一个“更新程序”脚本,不时更新您的HTML文件,或者如果您确实需要这样的速度,请创建某个事件。
尝试在某些地方使用SSI,看看效果如何(http://httpd.apache.org/docs/1.3/howto/ssi.html)。
尝试使用Eaccelerator(http://eaccelerator.net/)或APC(http://www.php.net/apc/)来加速脚本解析器,但它不会对PHP5产生奇迹......
确保物理服务器有足够的可用资源(FAST硬盘,大量RAM,多处理器)。
您的脚本比HTML页面慢,这是很正常的:)提供HTML页面意味着简单的文件副本。 PHP脚本意味着初始化脚本引擎,缓存,解析类,函数,内存分配,会话锁定/解锁并保存,从Memcached服务器读取,读取配置文件。对于每个请求。
答案 2 :(得分:2)
您可能还想考虑在PHP服务器前放置一个HTTP缓存。这将减少Web服务器的负载,并将为您重新发送以前呈现的页面。
显然,如果您使用共享主机,这些不是选项 - 在这种情况下,渲染到.html文件是一个很好的解决方案。
答案 3 :(得分:1)
您可以尝试(伪代码):
if file myfilecache/$user_$request_$today.html does not exist
then do
format page
write page to myfilecache/$user_$request_$today.html
done
redirect to myfilecache/$user_$request_$today.html
文件系统make是一个非常好的缓存,而lightpd将完成提供页面的实际工作。