[wangch@im 20210908183557]$ sudo php start_new.php status
Workerman[start_new.php] status
----------------------------------------------GLOBAL STATUS----------------------------------------------------
Workerman version:4.0.19 PHP version:7.3.6
start time:2022-02-17 18:11:55 run 0 days 16 hours
load average: 21.5, 17, 16 event-loop:\Workerman\Events\Event
1 workers 1 processes
worker_name exit_status exit_count
PHPSocketIO 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
42850 342M socketIO://0.0.0.0:443 PHPSocketIO 3037 228 1207 2697377 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 342M - - 3037 228 1207 2697377 0 [Summary]
[wangch@im 20210908183557]$ sudo php start_208.php status
Workerman[start_208.php] status
----------------------------------------------GLOBAL STATUS----------------------------------------------------
Workerman version:4.0.19 PHP version:7.3.6
start time:2022-02-17 18:04:50 run 0 days 16 hours
load average: 19.49, 16, 16 event-loop:\Workerman\Events\Event
1 workers 1 processes
worker_name exit_status exit_count
PHPSocketIO 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
42584 122M socketIO://0.0.0.0:8002 PHPSocketIO 3527 2 2702 838519 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 122M - - 3527 2 2702 838519 0 [Summary]
之前phpsocket.io 单实例 顶不住人流峰值,现通过进程间通信新增一个实例,已经大大减少单实例的压力了。
现在两个实例,但是在连接量相同、业务逻辑相同的情况下,实例一 memory 明显较高,会导致 实例一 有 偶尔 的连接阻塞现象。
[wangch@im ~]$ sudo netstat -anp | grep ESTABLISHED | grep -i "443" | wc -l
3005
[wangch@im ~]$ sudo netstat -anp | grep ESTABLISHED | grep -i "8002" | wc -l
3573
[wangch@im ~]$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 27
CLOSE_WAIT 56
FIN_WAIT1 12
ESTABLISHED 6661
SYN_RECV 29
LAST_ACK 350
我在shell中观察,发现 当 CLOSE_WAIT 数量一超过个位数,实例一就卡顿。当没有 CLOSE_WAIT 或者 为 1或者为0 的时候就正常连接,无阻塞。
能够解决掉 实例一 偶尔 阻塞的情况。
服务器配置是?
另外系统负载太高了,都20了。系统负载高可能会出现业务卡顿。
实例一的请求量是实例二的3倍多,实例一内存占用高可能和某些请求占用资源有关,这个不好确定。但是内存高不一定是卡顿的原因,除非是系统内存不够开始使用swap。
如果你是服务器是4核心或以上,可以多开点实例比如开4个或者更多,不超过cpu核数就行。
服务器配置:
[wangch@im ~]$ sudo ethtool eth0
Settings for eth0:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Speed: 10000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
MDI-X: Unknown
Link detected: yes
[wangch@im ~]$ cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
40
[wangch@im ~]$ cat /proc/cpuinfo | grep "cpu cores" | uniq
cpu cores : 10
[wangch@im ~]$ cat /proc/meminfo | grep MemTotal
MemTotal: 66058388 kB
老大,load 快达到了20,负载这么高,和实例或者实例中的业务逻辑关系大不大?
如果这个服务器只跑了phpsocket.io项目,那就是有关系。用
top
命令能大概看出来哪个导致负载高老大,有个情况我百思不得其解,今天我把这个双服务分流了一下,现在一个服务连接量达到6k左右,也不阻塞。但是另一个服务,连接量都没到1k,七八百就阻塞了。您能大概的帮我定位一下原因吗。
看看是不是没装event扩展
[wangch@im 20210908183557]$ sudo php start_new.php status
Workerman[start_new.php] status
----------------------------------------------GLOBAL STATUS----------------------------------------------------
Workerman version:4.0.19 PHP version:7.3.6
start time:2022-02-18 18:22:15 run 2 days 21 hours
load average: 4.24, 6, 6 event-loop:\Workerman\Events\Event
1 workers 1 processes
worker_name exit_status exit_count
PHPSocketIO 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
14412 388.5M socketIO://0.0.0.0:443 PHPSocketIO 463 753 162 3592875 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 1940M - - 2359 3765 466 17963935 0 [Summary]
这是阻塞的那个服务的状态。
event扩展最早碰到连接量的瓶颈的时候就装了
你是怎么做分流的?你说的阻塞是什么现象?
关于分流:
现在APP用户量小,我把APP聊天单用一个服务,PC网页用户量较大,PC网页单用一个服务,也就是按PC和APP来连接不同的服务。
阻塞现象:
1、每个服务都有一个不同的连接域名,当一个请求进行连接,并没有马上连接成功,而是等待了十多秒才能够连接成功。
2、浏览器上直接访问这个连接域名也可以看出,如果连接成功会秒出现{
"code": 0,
"message": "Transport unknown"
},相反则会一直转圈。
3、查看该服务(端口443)的CLOSE_WAIT 数量也可看出
[wangch@im 20210908183557]$ sudo netstat -anp | grep CLOSE_WAIT | grep -i "443" | wc -l
68
连接不成功的时候
php start.php status
看下有没有状态为busy的进程,如果有用strace看下阻塞在哪里。https://www.workerman.net/doc/workerman/debug/busy-process.html
好的老大,我去查下。
另外,我开双服务只是在目录里新增一个start文件,不需要再单独拿出来重新弄一套(完整的compser目录)吧?
这个姿势对吗,我怕这一步都没对。。。再去查别的也没用。
不需要再单独拿出来重新弄一套
16:48:18.879367 poll([{fd=69, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 15000) = 1 ([{fd=69, revents=POLLOUT}])
16:48:18.880647 getsockopt(69, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
16:48:18.880696 fcntl(69, F_SETFL, O_RDWR) = 0
16:48:18.880747 sendto(69, "POST /internaldov2.php HTTP/1.0\r"..., 330, MSG_DONTWAIT, NULL, 0) = 330
16:48:18.880818 poll([{fd=69, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
16:48:18.880869 poll([{fd=69, events=POLLIN|POLLERR|POLLHUP}], 1, 15000) = 1 ([{fd=69, revents=POLLIN}])
16:48:18.901827 recvfrom(69, "HTTP/1.1 200 OK\r\nServer: nginx\r\n"..., 8192, MSG_DONTWAIT, NULL, NULL) = 2142
16:48:18.901893 poll([{fd=69, events=POLLIN|POLLERR|POLLHUP}], 1, 15000) = 1 ([{fd=69, revents=POLLIN}])
16:48:18.901948 recvfrom(69, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0
16:48:18.901992 poll([{fd=69, events=POLLIN|POLLERR|POLLHUP}], 1, 15000) = 1 ([{fd=69, revents=POLLIN}])
16:48:18.902051 recvfrom(69, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0
16:48:18.902106 close(69) = 0
16:48:18.902326 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 69
16:48:18.902390 fcntl(69, F_GETFL) = 0x2 (flags O_RDWR)
16:48:18.902433 fcntl(69, F_SETFL, O_RDWR|O_NONBLOCK) = 0
16:48:18.902464 connect(69, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.10.10.150")}, 16) = -1 EINPROGRESS (Operation now in progress)
strace循环执行这些东西。
其中10.10.10.150是数据库的ip,但是io操作都是在phpsocketio的自定义方法中,io 阻塞也是会影响纯连接的阻塞吗
数据库阻塞会影响连接。如果10.10.10.150是数据库ip,看strace连接数据库的端口貌似错了,连到了80端口了