phpsocket.io双实例在业务逻辑相同、连接量相同的情况下memory差别太大

tomlibao

实例一(监听443端口):

[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] 

实例二(监听8002端口):

[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 的时候就正常连接,无阻塞。

期望得到的回答:

能够解决掉 实例一 偶尔 阻塞的情况。

1178 1 0
1个回答

walkor 打赏

服务器配置是?
另外系统负载太高了,都20了。系统负载高可能会出现业务卡顿。

实例一的请求量是实例二的3倍多,实例一内存占用高可能和某些请求占用资源有关,这个不好确定。但是内存高不一定是卡顿的原因,除非是系统内存不够开始使用swap。

如果你是服务器是4核心或以上,可以多开点实例比如开4个或者更多,不超过cpu核数就行。

  • tomlibao 2022-02-18

    服务器配置:
    [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

  • tomlibao 2022-02-18

    老大,load 快达到了20,负载这么高,和实例或者实例中的业务逻辑关系大不大?

  • walkor 2022-02-18

    如果这个服务器只跑了phpsocket.io项目,那就是有关系。用 top 命令能大概看出来哪个导致负载高

  • tomlibao 2022-02-21

    老大,有个情况我百思不得其解,今天我把这个双服务分流了一下,现在一个服务连接量达到6k左右,也不阻塞。但是另一个服务,连接量都没到1k,七八百就阻塞了。您能大概的帮我定位一下原因吗。

  • walkor 2022-02-21

    看看是不是没装event扩展

  • tomlibao 2022-02-21

    [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]
    这是阻塞的那个服务的状态。

  • tomlibao 2022-02-21

    event扩展最早碰到连接量的瓶颈的时候就装了

  • walkor 2022-02-21

    你是怎么做分流的?你说的阻塞是什么现象?

  • tomlibao 2022-02-21

    关于分流:
    现在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

  • walkor 2022-02-21

    连接不成功的时候php start.php status 看下有没有状态为busy的进程,如果有用strace看下阻塞在哪里。
    https://www.workerman.net/doc/workerman/debug/busy-process.html

  • tomlibao 2022-02-21

    好的老大,我去查下。

    另外,我开双服务只是在目录里新增一个start文件,不需要再单独拿出来重新弄一套(完整的compser目录)吧?
    这个姿势对吗,我怕这一步都没对。。。再去查别的也没用。

  • walkor 2022-02-21

    不需要再单独拿出来重新弄一套

  • tomlibao 2022-02-21

    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 阻塞也是会影响纯连接的阻塞吗

  • walkor 2022-02-21

    数据库阻塞会影响连接。如果10.10.10.150是数据库ip,看strace连接数据库的端口貌似错了,连到了80端口了

年代过于久远,无法发表回答
×
🔝