标签归档:Apache

一组PHP7在Nginx与Apache下的测试数据

概述

PHP7作为迄今为止性能最强的PHP版本,希望通过一些测试来了解它在Nginx与Apache下的表现。数据仅供参考。

由于个人水平有限,对测试的理解可能有所偏差,如有错误麻烦指出。

运行环境

测试环境一共分为两台机器,机器A用作PHP运行环境,机器B作为压测机。A与B的CPU均为12 x Xeon E5 + 16GB RAM

两台机器位于同一网段。

测试工具使用ab

为了便于测试,调整了内核参数:

测试使用的软件版本为:

  • Apache 2.2
  • Nginx 1.2.7
  • PHP 7.0.4

Apache在httpd-mpm.conf中的配置为:

由于Apache+modphp7Nginx+PHP-FPM二者的工作模式差别较大,想要均衡的配置出一个均衡的测试比较环境很困难,从简单出发,考虑到Apache在上述配置下最大会fork出512个进程处理请求,将PHP-FPM最大进程数也设成512个,即:

测试方法

测试主要针对三种操作进行:输出Hello WorldRedis KV读取操作输出phpinfo()

选择Redis KV读取操作的目的主要想测试下这一常用扩展的在Apache与Nginx作为WebServer环境下的表现。

测试分为2组,分别在25并发以及512并发下进行,测试时长为1min,同时记录服务器的load情况。

关注的数据为:

  • 最小响应时间
  • 平均响应时间
  • 平均每秒请求数
  • load
  • 相关进程数

测试结果

测试从性能指标以及系统负载两个方面进行观察。

性能指标

最小响应时间

min_response_time.png

针对最小响应时间,并发数高低对最小响应时间没有显著的影响。在测试初期系统负载较低,测试数据应该表现最佳的阶段,推断二者在此阶段差距不大。

平均每秒请求数

requests_per_sec.png

针对平均每秒请求数,Nginx+PHP-FPM的组合处理能力稍低于Apache+modphp7的组合,考虑到Nginx与PHP-FPM之间有网络通信(测试中采用了tcp socket)的开销,这个结果是可以接受的。高并发下考虑系统开销较大,请求处理能力会稍有下降。

平均响应时间

mean_response_time.png

针对平均响应时间,高并发下同样由于系统开销较大的缘故,平均的请求处理响应时间升高也是符合预期的。

系统负载

从性能指标上看,Nginx+PHP-FPM的组合与Apache+modphp7的组合在表现上没有巨大的差距,但是在系统负载上,Nginx+PHP-FPM的配置在高并发的情况下远优于Apache+modphp7的组合。 在512并发时,在测试Hello world时,系统load的表现就有巨大的差距:

load_hello_world.png

同样的情况还出现在512并发之下对Redis KV操作的测试case之下:

load_redis_kv.png

即便是在低并发(25并发)下,Redis KV此类需要操作网络资源的操作,Apache+modphp7在系统负载上的表现也差于Nginx+PHP-FPM

load_redis_kv_c25.png

对于这类需要操作I/O的操作来说,Apache+modphp7的组合表现差于使用了异步I/O的Nginx与PHP-FPM的组合是符合预期的。

在测试phpinfo()输出时,虽然二者在load上的区别不大,但是Nginx+PHP-FPM的组合在进程数这一指标上完全占优

processes_count_phpinfo.png

考虑到Nginx+PHP-FPM的组合无需fork出新的子进程处理新到的客户端请求,以及phpinfo()的执行时间较长这两个因素,同时fork子进程等操作属于消耗系统资源较大的操作,这个现象是符合预期的。

总结

使用php7时,在性能上Apache+modphp7的组合与Nginx+PHP-FPM的组合相差无几,但对于系统负载上来说,Nginx+PHP-FPM组合综合表现优于Apache+modephp7的组合,可以推断Nginx+PHP-FPM的组合对于构建高并发的服务更有优势。

综合考虑,Nginx+PHP-FPM表现较优。

TODO

  • 尝试阅读ab源码,了解其测试原理
  • 比对fpm在动静模式之间的区别

Vhost中目录不存在引起Apache不能启动

Vhost中目录不存在引起Apache不能启动

环境配置始终是工作过程中一个最为折腾人的环节,为了解决这个问题,最后写了个简单地装机脚本给大家使用。

环境配置包括软件的安装和设置的更改,一套LAMP每个组成部分设置都以百计,功能的强大的同时如果对每个部分的了解程度不足尤其容易出现一些看似很难以解决的问题,往往这些问题解决之后都会让人觉得沮丧不已。

今天配置环境出现了一个问题,就是只要在httpd.conf中添加了包含vhost设置的语句之后,Apache使用

apachectl -k gracecful

等方式启动时总会提示

httpd not running, trying to start

让人沮丧的是这种错误并没有打印error_log,同时使用语法检查也不能发现有任何错误,在逐句注释掉vhost中的设置语句之后,发现当注释掉所有提及的主机路径之后,居然可以重新启动了,于是检查发现这些目录都在主机上不存在,添加目录之后Apache能正常启动了。

尝试出来的结果,后面打算去找找更为具体的原因。