php7配合wokerman性能,workerman性能测试测试环境:
系统:debian 6.0 64位
内存:64G
cpu:ntel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz (2颗物理cpu,6核⼼,2线程)
Workerman:开启200个Benchark进程
压测脚本:benchmark
业务:发送并返回hello字符串
业务逻辑
// HTTP协议返回hello字符串,⾮HTTP协议客户端发来什么就返回什么
class Benchmark extends Man\Core\SocketWorker
{
/
/ 分包
public function dealInput($buffer)
{
return 0;
}
// HTTP协议返回hello字符串,⾮HTTP协议客户端发来什么就返回什么
public function dealProcess($buffer)
{
// 是HTTP协议
if('G' == $buffer[0] )
{
/
/ http 改成短链接
$this->isPersistentConnection = 0;
return $this->sendToClient("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nhello");
php8兼容php7吗
}
// 是benchmark脚本, 长链接
$this->isPersistentConnection = 1;
return $this->sendToClient($buffer);
}
}
压测⽅法
⽅法⼀ ab软件(只能以HTTP协议压测workerman短连接性能):
#例如下⾯的语句是模拟200个客户端向127.0.0.1:56789发送100000个HTTP请求
ab -n 100000 -c200 127.0.0.1:56789/
⽅法⼆:使⽤workerman⾃带的benchmark软件,只⽀持64位linux系统
1、#例如下⾯的命令含义是400并发线程模拟400个并发⽤户,每个⽤户连接127.0.0.1:56789端⼝发送⼀个hello服务端收到hello后返回⼀个hello后断开连接,这样每个线程并发运⾏10000次
./benchmark -n10000 -h1 -c400 -p56789 127.0.0.1
2、#例如下⾯的命令含义是1000并发线程模拟1000个并发⽤户,每个⽤户连接127.0.0.1:56789端⼝,然后每个线程并发连续发送10000个hello,服务端收到hello后返回⼀个hello
./benchmark -n1 -h10000 -c1000 -p56789 127.0.0.1
结果
普通PHP(版本5.3.10)压测
短链接(每次请求完成后关闭链接,下次请求建⽴新的链接):
脚本:./benchmark -n100000 -h1 -c500 -p56789 127.0.0.1
含义: 压测脚本开500个并发线程模拟500个并发⽤户,每个线程链接Workerman 10W次,每次链接发送1个请求
结果: 吞吐量:1.9W/S , cpu利⽤率:32%
长链接(每次请求后不关闭链接,下次请求继续复⽤这个链接):
脚本:./benchmark -n1 -h100000 -c2000 -p56789 127.0.0.1
含义: 压测脚本开2000个并发线程模拟2000个并发⽤户,每个线程链接Workerman 1次,每个链接发送10W请求
结果: 吞吐量:36.7W/S , cpu利⽤率:69%
内存:每个进程内存稳定在6444K,⽆内存泄漏
HHVM环境压测
短链接(每次请求完成后关闭链接,下次请求建⽴新的链接):
脚本:./benchmark -n100000 -h1 -c1000 -p56789 127.0.0.1
含义: 压测脚本开1000个并发线程模拟1000个并发⽤户,每个线程链接Workerman 10W次,每次链接发送1个请求
结果: 吞吐量:3.5W/S , cpu利⽤率:35%
长链接(每次请求后不关闭链接,下次请求继续复⽤这个链接):
脚本:./benchmark -n1 -h100000 -c6000 -p56789 127.0.0.1
脚本: 压测脚本开6000个并发线程模拟6000个并发⽤户,每个线程链接Workerman 1次,每个链接发送10W请求
结果: 吞吐量:45W/S , cpu利⽤率:67%
内存:HHVM环境每个进程内存稳定在46M,⽆内存泄漏
⽆流量抖动,⽆内存泄漏,性能⾮常强悍
压测代码及脚本下载:
压测脚本benchmark位置:workerman-bench/applications/Benchmark/benchmark
说明:由于各个系统配置不同,所以压测时可能需要根据系统配置调整压测参数才能达到最优
压测评价
压⼒测试脚本和workerman服务端运⾏在同⼀台服务器上,因为压测的地址均为为127.0.0.1,所以流量没有⾛⽹卡。压测使⽤的是版本较低的PHP5.3.10版本,使⽤⾼版本PHP如PHP5.6性能将会更⾼,压测成绩也将会更好。 另外也压测了facebook的HHVM虚拟机,在短连接⽅⾯相⽐PHP5.3.10吞吐量⾼出84%左右,在长连接⽅⾯⽐PHP5.3.10吞吐量⾼出25%左右,期待HHVM后续新版本会有更加出⾊的成绩。 压测均使⽤较⼩的数据包,并且业务逻辑简单,复杂的业务压⼒测试开发者可以根据⾃⼰的业务情况⾃⾏实施,肯定也会给开发者⼀个⼤⼤的惊喜。
为什么workerman拥有卓越的性能
避免读取磁盘和反复编译
workerman运⾏过程中,单个进程⽣命周期内只要PHP⽂件被载⼊编译过⼀次,便会常驻内存,不会再去从磁盘读取或者再去编译。workerman省去了重复的请求初始化、创建执⾏环境、词法解析、语法解析、编译⽣成opcode以及请求关闭等诸多耗时的步骤。 实际上workerman运⾏起来后便⼏乎没有
磁盘IO及PHP⽂件编译开销,剩下的只是简单的计算过程,这使得workerman运⾏飞快。
数据或者资源可以全局共享
workerman中多个请求是可以共享数据或者资源的,当前请求产⽣的全局变量或者类的静态成员在下⼀次请求中仍然有效。 这对于减少开销,提⾼运⾏效率⾮常有⽤。例如业务只要初始化⼀次数据库连接,那么全局都可以共享这个连接,这实现了真正意义上的数据库长连接。从⽽不必每次⽤户请求都去创建新的连接,避免了连接时三次握⼿、连接后权限验证以及断开连接时四次挥⼿等耗时的交互过程。不仅数据库,像redis、 memcache等同样有效。少了这些开销和⽹络交互,使得workerman运⾏更快。
没有多余的⽹络开销
传统PHP应⽤程序需要借助apache、nginx等容器才能对外提供⽹络服务,这就导致多了⼀层apache、nginx等容器到PHP进程的数据传输开销。 并且由于运⾏了apache或者nginx容器,这将进⼀步消耗服务器的资源。 workerman便没有这部分开销,这是由于workerman ⾃⾝便是⼀个服务器容器具有PHP进程管理以及⽹络通讯功能, 完全不依赖于apache、nginx、php-fpm等这些容器便可以独⽴运⾏,所以性能更⾼。
进程模型简单
workerman是多进程(也有多线程版本)的,可以充分利⽤服务器多核资源。并且workerman具有简单的进程模型,主进程只负责监控⼦进程,⽽每个⼦进程独⾃接受维护客户端的连接,独⾃读取连接上发来的数据,独⾃处理。 ⼦进程间默认没有任何数据通讯,主进程和⼦进程之间只有⼀次信号通讯。简单的进程通讯模型使得workerman相⽐其它复杂的进程模型的软件更⾼效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。