用的是workerman。而且是centos7系统。而且也按照说明优化了服务器啊。在onmessage之后send。
(另外顺便问个问题,在PHP端,客户端的PHP端,接收数据,只能是先socket_write之后才能socket_read吗?无法接收workerman的onConnect就返回的send数据吗?也就是必须要php客户端向服务器workerman发数据后,收到onmessage的回复?而无法在php客户端收到onconnect的回复?大家有什么办法吗?)$worker->count = 31;
我的服务器有32核心。我设置为count=31后,速度为5秒执行完毕。而我设置为count=1之后,是2秒。然后设置count=2或4,是1.8秒。超过cont=5以上,就越来越慢。比如说10,15,20等等。特别是对CPU的压力也随之而来。甚至CPU飙升到30%了。而count=2左右的数字,就没事,CPU也仅仅不到10%就执行完毕,2秒或不到2秒
也就是说,核心多,设置count越高,速度反倒越慢 了。
是我测试有问题吗?
模拟5万次连接:
$stime=microtime(true);
for($i=0;$i<50000;$i++){
$socket = socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
socket_connect($socket,'127.0.0.1',8282);
socket_write($socket,1,1);
$callback = socket_read($socket,50,PHP_BINARY_READ);
echo $callback;
socket_close ($socket);
}
$etime=microtime(true);//获取程序执行结束的时间
$total=$etime-$stime; //计算差值
echo "<br />当前页面执行时间为:{$total} 秒";
如果在onConnect send数据给客户端,客户端可以不必socket_write就可以直接socket_read。
进程数开多后出现执行时间增长主要是以下几个原因导致,
1、多cpu linux 系统下多个进程监听同一个端口,当有客户端连接上来是就发生惊群效应,造成一定的cpu消耗和性能消耗
可以参考 https://wenda.workerman.net/question/179 。 workerman里可以开启 http://doc.workerman.net/worker/reuse-port.html 来避免惊群,要求php>=7.0。
2、多个进程在进程切换的时候有一定开销
3、多个进程近乎同时处理业务会利用多个cpu,任意时刻多个cpu消耗总和会大于单个cpu(单个进程只会利用一个cpu)
解决办法是升级php>=7.0,开启reusePort。
但是基于2、3点即使开启reusePort,我猜测你这个压测方案设置成多进程和单进程比没有优势。
原因是你的压测脚本是单进程的,而且同一时刻只能发起1个请求,请求响应后才才发起下一个,并发请求数是1,这样的话服务端只需要一个进程即可,设置成多进程反而增加进程切换等开销,性能有所下降。就像本来一个人能干的活儿非要多个人轮流上,消耗明显增大变慢。
如果是并发超过1,设置成多进程更合理。当并发数超过1的时候你会发现多个进程处理一般会比单个进程处理快。
reuseport确实有效果,31进程,虽然没有达到单线程1.8秒,但是基本在2.3秒左右了,比5秒少了一半。
我这个基本就是做了一个接口,然后全部都是短连接请求。
另外,您说的【在onConnect send数据给客户端,客户端可以不必socket_write就可以直接socket_read】这个我也是这么想的,可是实际测试的时候,用PHP做客户端请求,没有收到任何信息。也就是不write发送onmessage就不行。要不,您试试?
把echo $callback; 去掉,php打印到终端比较耗时,也会影响并发
你这个模拟不算是并发呢。这就是五万次请求而以。每一个请求还要等待前一个完成。