-
workerman高并发异步mysql_workerman怎么实现高并发
2021-01-26 22:15:08workerman怎么实现高并发,线程,吞吐量,内存,服务器,利用率workerman怎么实现高并发易采站长站,站长之家为您整理了workerman怎么实现高并发的相关内容。并发概念太模糊,这里以两种可以量化的指标并发连接数和并发...workerman怎么实现高并发,线程,吞吐量,内存,服务器,利用率
workerman怎么实现高并发
易采站长站,站长之家为您整理了workerman怎么实现高并发的相关内容。
并发概念太模糊,这里以两种可以量化的指标并发连接数和并发请求数来说明。
并发连接数是指服务器当前时刻一共维持了多少TCP连接,而这些连接上是否有数据通讯并不关注。 (推荐学习: workerman教程)
例如一台消息推送服务器上可能维持了百万的设备连接,由于连接上很少有数据通讯,所以这台服务器上负载可能几乎为0,只要内存足够,还可以继续接受连接。
并发请求数一般用QPS(服务器每秒处理多少请求)来衡量,而当前时刻服务器上有多少个tcp连接并不十分关注。例如一台服务器只有10个客户端连接,每个客户端连接上每秒有1W个请求,那么要求服务端需要至少能支撑10*1W=10W每秒的吞吐量(QPS)。
假设10W吞吐量每秒是这台服务器的极限,如果每个客户端每秒发送1个请求给服务端,那么这台服务器能够支撑10W个客户端。
并发连接数受限于服务器内存,一般24G内存workerman服务器可以支持大概120W并发连接。
并发请求数受限于服务器cpu处理能力,一台24核workerman服务器可以达到45W每秒的吞吐量(QPS),实际值根据业务复杂度以及代码质量有所变化。
注意
高并发场景必须安装event或者libevent扩展。另外需要优化linux内核,尤其是进程打开文件数限制。
压测数据
这里仅提供workerman压测的QPS数据参考。
###测试环境:
系统:debian 6.0 64位
内存:64G
cpu:Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz (2颗物理cpu,6核心,2线程)
Workerman:开启200个Benchark进程
压测脚本:benchmark
业务:发送并返回hello字符串
###普通PHP(版本5.3.10)压测
短连接(每次请求完成后关闭连接,下次请求建立新的连接):
条件: 压测脚本开500个并发线程模拟500个并发用户,每个线程连接Workerman 10W次,每次连接发送1个请求
结果: 吞吐量:2.3W/S , cpu利用率:36%
长连接(每次请求后不关闭连接,下次请求继续复用这个连接):
条件: 压测脚本开2000个并发线程模拟2000个并发用户,每个线程连接Workerman 1次,每个连接发送10W请求
结果: 吞吐量:36.7W/S , cpu利用率:69%
内存:每个进程内存稳定在6444K,无内存泄漏
以上是php5.3版本压测数据,如果用php7,性能会再次提升40%左右。
###HHVM环境压测
短连接(每次请求完成后关闭连接,下次请求建立新的连接):
条件: 压测脚本开1000个并发线程模拟1000个并发用户,每个线程连接Workerman 10W次,每次连接发送1个请求
结果: 吞吐量:3.5W/S , cpu利用率:35%
长连接(每次请求后不关闭连接,下次请求继续复用这个连接):
条件: 压测脚本开6000个并发线程模拟6000个并发用户,每个线程连接Workerman 1次,每个连接发送10W请求
结果: 吞吐量:45W/S , cpu利用率:67%
内存:HHVM环境每个进程内存稳定在46M,无内存泄漏以上就是关于对workerman怎么实现高并发的详细介绍。欢迎大家对workerman怎么实现高并发内容提出宝贵意见
-
workerman
2019-12-02 20:55:311.Workerman是什么? Workerman是一款纯PHP开发的开源高性能的...Workerman每个进程能维持上万并发连接。由于本身常住内存,不依赖Apache、nginx、php-fpm这些容器,拥有超高的性能。同时支持TCP、UDP、UNIXSOCK...1.Workerman是什么?
Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架。
实际上Workerman类似一个PHP版本的nginx,核心也是多进程+Epoll+非阻塞IO。Workerman每个进程能维持上万并发连接。由于本身常住内存,不依赖Apache、nginx、php-fpm这些容器,拥有超高的性能。同时支持TCP、UDP、UNIXSOCKET,支持长连接,支持Websocket、HTTP、WSS、HTTPS等通讯协以及各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。
2.Workerman的一些应用方向
1、即时通讯类:例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等;
2、物联网类:例如Workerman与打印机通讯、与单片机通讯、智能手环、智能家居、共享单车等等;
3、游戏服务器类:例如棋牌游戏、MMORPG游戏等等;
4、SOA服务化:利用Workerman将现有业务不同功能单元封装起来,以服务的形式对外提供统一的接口,达到系统松耦合、易维护、高可用、易伸缩。
5、其它服务器软件:例如 GatewayWorker,PHPSocket.IO,http代理,sock5代理,分布式通讯组件,分布式变量共享组件,消息队列、DNS服务器、WebServer、CDN服务器、FTP服务器等等;
6、中间件:例如异步MySQL组件,异步redis组件,异步http组件,异步消息队列组件,异步dns组件,文件监控组件,还有很多第三方开发的组件框架等等。
3.Workerman的理念
极简、稳定、高性能、分布式。
-
workerman Day02 定制通讯协议、Channel分布式通讯组件、心跳检测、高并发Linux内核优化
2020-09-10 22:02:12目录 0x00 定制通讯协议 0x02 Channel 分布式通讯组件 原理 #demo 0x03 心跳检测 ...0x03 workerman 命令行 ...0x04 workerman 开发注意事项 ...例如:我们自己要定义一个协议Json ,数据格式采用...namespace Workerman\目录
0x00 定制通讯协议
数据边界的标识:例如http协议头中的\r\n\r\n 就是数据边界的标识
例如:我们自己要定义一个协议Json ,数据格式采用json,数据边界的标识采用\n
<?php namespace Workerman\Protocols; class Json{ public static function input($buffer){ $pos = strpos($buffer,"\n"); if(!$pos){ return 0; } return $pos+1; } public static function encode($buffer){ return json_encode($buffer)."\n"; } public static function decode($buffer){ return json_decode(trim($buffer),true); } }
<?php require_once 'Workerman/Autoloader.php'; use Workerman\Worker; $worker = new Worker('json://0.0.0.0:3333'); $worker->onConnect = function($connection){ $connection->send(['status'=>'success']); }; $worker->onMessage = function($connection,$data){ var_dump($data); }; Worker::runAll();
0x02 Channel 分布式通讯组件
下载channel:https://github.com/walkor/channel
原理
Channel包含Channel/Server服务端和Channel/Client客户端
Channel/Client通过connect接口连接Channel/Server并保持长连接
Channel/Client通过调用on接口告诉Channel/Server自己关注哪些事件,并注册事件回调函数(回调发生在Channel/Client所在进程中)
Channel/Client通过publish接口向Channel/Server发布某个事件及事件相关的数据
Channel/Server接收事件及数据后会分发给关注这个事件的Channel/Client
Channel/Client收到事件及数据后触发on接口设置的回调
Channel/Client只会收到自己关注事件并触发回调
#demo
channel_server.php
<?php /* * @Author: your name * @Date: 2020-09-10 19:53:34 * @LastEditTime: 2020-09-10 19:59:28 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: /websocket_demo/channel.php */ require_once 'Workerman/Autoloader.php'; require_once 'Channel/src/Server.php'; use Workerman\Worker; use Channel\Server; $server = new Server('0.0.0.0',8880); Worker::runAll();
channel_client.php
<?php /* * @Author: your name * @Date: 2020-09-10 19:53:34 * @LastEditTime: 2020-09-10 20:11:26 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: /websocket_demo/channel.php */ require_once 'Workerman/Autoloader.php'; require_once 'Channel/src/Client.php'; use Workerman\Worker; use Channel\Client; $worker = new Worker('text://0.0.0.0:7777'); $worker->onWorkerStart = function ($worker){ Client::connect('127.0.0.1',8880); Client::on('broadcast',function($data)use($worker){ foreach($worker->connections as $connection){ $connection->send($data); } }); }; $worker->onMessage = function($connection,$data){ Client::publish('broadcast',$data); }; Worker::runAll();
0x03 心跳检测
实现原理:
当服务器端的一个链接收到客户端发来的数据时,记录下该链接最后一次收到数据的时间
然后设置一个定时器,每隔1秒就检查下所有链接最后一次 和 当前时间 之间的间隔是否超过 10秒,超过则断开。
<?php /* * @Author: your name * @Date: 2020-09-10 21:01:33 * @LastEditTime: 2020-09-10 21:19:20 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: /websocket_demo/check_alive.php */ require_once 'Workerman/Autoloader.php'; require_once 'Workerman/Lib/Timer.php'; use Workerman\Worker; use Workerman\Lib\Timer; $worker = new Worker('text://0.0.0.0:8880'); $worker->onMessage = function($connection,$data){ $connection->lastMessageTime = time(); }; $worker->onWorkerStart = function($worker){ Timer::add(1,function()use($worker){ $now_time = time(); foreach($worker->connections as $connection){ if(empty($connection->lastMessageTime)){ $connection->lastMessageTime = $now_time; } if($now_time - $connection->lastMessageTime > 10){ $connection->close("长时间未通讯,连接已断开"); } } }); }; Worker::runAll();
0x03 workerman 命令行
0x04 workerman 开发注意事项
linux内核优化:
为了让系统能够支持更大的并发,除了必须安装event扩展(或libevent扩展)之外,优化linux内核也是重中之重,以下优化每一项都非常非常重要,请务必按逐一完成。
打开文件 /etc/sysctl.conf,增加以下设置
#该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除 net.ipv4.tcp_max_tw_buckets = 20000 #定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数 net.core.somaxconn = 65535 #对于还未获得对方确认的连接请求,可保存在队列中的最大数目 net.ipv4.tcp_max_syn_backlog = 262144 #在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 net.core.netdev_max_backlog = 30000 #能够更快地回收TIME-WAIT套接字。此选项会导致处于NAT网络的客户端超时,建议为0 net.ipv4.tcp_tw_recycle = 0 #系统所有进程一共可以打开的文件数量 fs.file-max = 6815744 #防火墙跟踪表的大小。注意:如果防火墙没开则会提示error: "net.netfilter.nf_conntrack_max" is an unknown key,忽略即可 #net.netfilter.nf_conntrack_max = 2621440
运行
sysctl -p
即可生效。说明:
/etc/sysctl.conf 可设置的选项很多,其它选项可以根据自己的环境需要进行设置
打开文件数
设置系统打开文件数设置,解决高并发下
too many open files
问题。此选项直接影响单个进程容纳的客户端连接数。Soft open files 是Linux系统参数,影响系统单个进程能够打开最大的文件句柄数量,这个值会影响到长连接应用如聊天中单个进程能够维持的用户连接数, 运行
ulimit -n
能看到这个参数值,如果是1024,就是代表单个进程只能同时最多只能维持1024甚至更少(因为有其它文件的句柄被打开)。如果开启4个进程维持用户连接,那么整个应用能够同时维持的连接数不会超过4*1024个,也就是说最多只能支持4x1024个用户在线可以增大这个设置以便服务能够维持更多的TCP连接。Soft open files 修改方法:
(1)ulimit -HSn 102400
这只是在当前终端有效,退出之后,open files 又变为默认值。
(2)在/etc/profile文件末尾添加一行ulimit -HSn 102400,这样每次登录终端时,都会自动执行/etc/profile。
(3)令修改open files的数值永久生效,则必须修改配置文件:/etc/security/limits.conf. 在这个文件后加上:
* soft nofile 1024000 * hard nofile 1024000 root soft nofile 1024000 root hard nofile 1024000
这种方法需要重启机器才能生效。
-
Workerman的使用和遇到的问题点(swoole4,或许是更好的处理异步高并发的技术)
2020-04-06 16:18:05需要使用到Workerman的知识。于是连夜学习和敲代码。终于在一周之内搞定了这个项目。 项目的大体结构如图所示: 前端建立WebSocket的服务,这里我们是在vue的项目中使用js创建这个服务: 和后端Workerman的...去年在公司做了一个可视化的项目。需要使用到Workerman的知识。
项目的大体结构如图所示:
前端建立WebSocket的服务,这里我们是在vue的项目中使用js创建这个服务:
和后端Workerman的使用。因为我们需要携带后端的数据,向其他地方发出请求,从另外的一方获取数据,所以在tcp的服务又创建了一个AsyncTcpConnection用于异步创建一个TcpConnection连接
在创建的websocket服务中,对tcp和它建立的服务之间,赋予uid的身份。如果有这个身份就向tcp发起前端数据的传递,如果没有这个身份,就是后台数据向前端传递,代码如下:
其实我们在这个项目中还是使用到了Workerman对于数据库的操作,其实官方文档写的很详细了。基本上数据库常用到的操作都有相应的代码。如下图的插入举例:
在项目中遇到的问题,前端主要是vue的渲染问题。因为速度要达到20秒2000条数据的处理。之前遇到太卡和进度条不显示的问题点,全部都是因为set视图造成的。自己的写法不是很好,导致消耗太大。
其实前端主要就是根据返回的数据进行状态的更新,这正是vue的一大特点。实时更新。
后端遇到的问题主要是黏包和断包的问题:
我们对代码的处理如下:
当代码改为上述的时候依然还是会出现问题:部署上线出现断包的情况。
到这个时候代码才是完整的解析了数据。
部署上线的大致思考如下:其实很多时候,我们对项目的流程用图表梳理一下,思路就会清除很多。
后续项目遇到了,在tcp的文件中,当跟单系统的c语言哪里给我们数据过来,我们需要对数据的状态进行更新和插入数据库的操作,导致很耗时。 这里后续本想做成异步来处理。一直没有时间来处理。后来想了想如果是swoole的协程,或者task来处理,或许会更加的提升效率。所以我们也看出swoole4后对异步处理的性能提升大大好于workerman。希望这个项目的分享能给做高并发的人一些启发。共勉.......
-
workerman json mysql_workerman-json-rpc
2021-01-30 15:04:18软件简介一款使用PHP开发的高性能...特性:使用PHP开发,与PHP紧密结合PHP 多进程 ,充分利用服务器多cpu资源支持 libevent 事件轮询库,支持高并发支持服务 平滑重启 ,热升级程序,不影响用户支持PHP 文件更新检测... -
Workerman,GetwayWorke实现聊天通讯
2019-04-15 21:25:45Workerman 什么是Workerman Workerman是一款开源高性能异步PHP socket即时通讯框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件... -
workerman json mysql_GitHub - stamhe/workerman-JsonRpc: workerman作为进程管理器,json作为协议的远程...
2021-01-30 15:04:23workerman 具有以下特性多进程支持TCP/UDP支持各种应用层协议使用libevent事件轮询库,支持高并发支持文件更新检测及自动加载支持服务平滑重启支持telnet远程控制及监控支持异常监控及告警支持长连接支持以指定用户... -
workerman json mysql_GitHub - wanghailin/workerman-JsonRpc: workerman作为进程管理器,json作为协议的...
2021-01-30 15:04:21workerman 具有以下特性多进程支持TCP/UDP支持各种应用层协议使用libevent事件轮询库,支持高并发支持文件更新检测及自动加载支持服务平滑重启支持telnet远程控制及监控支持异常监控及告警支持长连接支持以指定用户... -
workerman json mysql_GitHub - archoncap/workerman-JsonRpc: workerman作为进程管理器,json作为协议的...
2021-01-30 15:04:19workerman 具有以下特性多进程支持TCP/UDP支持各种应用层协议使用libevent事件轮询库,支持高并发支持文件更新检测及自动加载支持服务平滑重启支持telnet远程控制及监控支持异常监控及告警支持长连接支持以指定用户... -
Swoole 和 Workerman
2019-12-22 19:33:47使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 ... -
workerman介绍以及worker类使用
2019-04-25 14:49:36支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持... -
关于高并发
2016-09-10 18:12:49三、php+swoole或workerman nginx+lua,淘宝、天猫在使用,并有淘宝的开源项目Tengine,另有春哥和晓哲开发的开源项目OpenResty。参考:http://huoding.com/2012/08/31/156 node.js,由google的v8做引擎,它通过... -
workerman-thrift:基于workermanPHP Thrift RPC-源码
2021-02-20 01:28:11使用libevent事件事件库,支持高并发 支持文件更新检测及自动加载 支持服务平滑重启 支持长连接 支持以指定用户运行worker进程 所需环境 workerman需要PHP版本不低于5.3,只需要安装PHP的Cli即可以,无需安装PHP-FPM... -
Workerman-master.zip
2020-04-15 14:12:06支持libevent事件轮询库,支持高并发 默认使用Websocket协议,更小带宽,更好性能 支持分布式部署,可横向扩容 客户端跨浏览器支持(需要浏览器支持html5或者flash) 多房间支持 支持私聊 支持心跳检测 同样非常适合... -
laravel结合workerman开发在线聊天应用
2020-01-04 13:40:59支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持... -
workerman结合laravel开发在线聊天应用
2018-10-26 10:07:06项目背景:最近由于公司的业务需求,需要用到聊天功能。而且有比较多的个性化需求需要定制。之前使用别人的聊天组件是...支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游... -
基于workerman的聊天室
2016-09-29 13:44:46Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。用它可以开发出许多高性能的socket应用。 这里我用它简单的做了个实时聊天室,支持私聊,非轮询,并发性也不错。先上demo ... -
workerman结合laravel开发在线聊天应用的示例代码
2021-01-20 00:27:08支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持... -
试着用workerman开发一个在线聊天应用
2020-07-06 16:28:45支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。支持TCP长连接,支持Websocket、HTTP等协议,支持自定义... -
关于PHP workerman的教程,学习思路解决方案
2019-08-21 10:42:01这个框架对我来说不算是很陌生,在大学的时候就拿来做过物联的项目,具有高性能,高可用,开发简单的优良...支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天... -
workerman运行分析--主进程流程
2016-09-22 20:17:41基本上,workerman使用多进程的方式、使用libevent事件监听网络连接,达到高并发。它与nginx的进程模型相似,连接的处理,是由子进程完成的,主进程主要的工作是: 监听端口,生成子进程要共享的server_socket ... -
TP5 集成 WorkerMan 以及 GatewayWorker 做实时聊天
2018-11-03 12:27:00workerman是国人开发的良心高性能的PHP socket 服务器框架,在全球最大同性交友平台gayHub的star都4K多,可以想象是多么的牛X。 可以单独部署,也可以整合进MVC的框架(TP,laravel等),可以说非常实用,并发效果... -
Swoole和Workerman到底选谁?
2019-05-28 15:38:00使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 ... -
php 5w的并发需要多少台服务器_简述php异步编程
2020-12-06 15:20:49更糟糕的是每次请求都需要重新编译...这两个框架原理都是通过事件循环,让程序一直停留在内存,等待外部请求,达到高并发。点此加入我的企鹅群为什么需要异步先来看一个例子在工作目录下新建文件 slowServer.php&... -
php 5w的并发需要多少台服务器_php使用异步编程是怎样的?
2020-12-05 01:18:29更糟糕的是每次请求都需要重新编译执行,导致...这两个框架原理都是通过事件循环,让程序一直停留在内存,等待外部请求,达到高并发。为什么需要异步先来看一个例子在工作目录下新建文件 slowServer.php<?php s... -
wolive客服系统源码搭建
2019-09-19 05:22:47wolive是一款为数不多的可自行搭建的...想到基于workerman开发,并发性能应该不错。 找遍其它客服系统,发现都没有给源码,程序及聊天数据也全部存储在别人服务器上,由于业务涉及到一些账号、订单、买家信息等隐...