国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

laravel框架使用gateway-client時(shí),偶爾出現(xiàn)卡頓情況

mrwu

bug描述

laravel框架使用gateway-client時(shí),調(diào)用isUidOnline等諸多方法時(shí),偶爾會(huì)出現(xiàn)卡頓5秒的情況。
經(jīng)過(guò)排查源碼,發(fā)現(xiàn)是gatewayclient/Gateway.php這個(gè)文件的如下圖方法中,陷入死循環(huán),到了超時(shí)時(shí)間5秒后退出循環(huán)。不知道是什么原因?qū)е滤姥h(huán)

程序代碼或配置

//摘自源碼
 protected static function getBufferFromGateway($gateway_buffer_array)
    {
        $client_array = $status_data = $client_address_map = $receive_buffer_array = $recv_length_array = array();
        // 批量向所有g(shù)ateway進(jìn)程發(fā)送請(qǐng)求數(shù)據(jù)
        foreach ($gateway_buffer_array as $address => $gateway_buffer) {
            $client = stream_socket_client("tcp://$address", $errno, $errmsg, static::$connectTimeout);
            if ($client && strlen($gateway_buffer) === stream_socket_sendto($client, $gateway_buffer)) {
                $socket_id                        = (int)$client;
                $client_array[$socket_id]         = $client;
                $client_address_map[$socket_id]   = explode(':', $address);
                $receive_buffer_array[$socket_id] = '';
            }
        }
        // 超時(shí)5秒
        $timeout    = 5;
        $time_start = microtime(true);
        // 批量接收請(qǐng)求
        while (count($client_array) > 0) {
            $write = $except = array();
            $read  = $client_array;
            if (@stream_select($read, $write, $except, $timeout)) {
                foreach ($read as $client) {
                    $socket_id = (int)$client;
                    $buffer    = stream_socket_recvfrom($client, 65535);
                    if ($buffer !== '' && $buffer !== false) {
                        $receive_buffer_array[$socket_id] .= $buffer;
                        $receive_length = strlen($receive_buffer_array[$socket_id]);
                        if (empty($recv_length_array[$socket_id]) && $receive_length >= 4) {
                            $recv_length_array[$socket_id] = current(unpack('N', $receive_buffer_array[$socket_id]));
                        }
                        if (!empty($recv_length_array[$socket_id]) && $receive_length >= $recv_length_array[$socket_id] + 4) {
                            unset($client_array[$socket_id]);
                        }
                    } elseif (feof($client)) {
                        unset($client_array[$socket_id]);
                    }
                }
            }
            if (microtime(true) - $time_start > $timeout) {
                break;
            }
        }
        $format_buffer_array = array();
        foreach ($receive_buffer_array as $socket_id => $buffer) {
            $local_ip                                    = ip2long($client_address_map[$socket_id][0]);
            $local_port                                  = $client_address_map[$socket_id][1];
            $format_buffer_array[$local_ip][$local_port] = unserialize(substr($buffer, 4));
        }
        return $format_buffer_array;
    }

期待的結(jié)果及實(shí)際結(jié)果

希望各位大佬幫忙看看,是什么原因?qū)е逻M(jìn)入死循環(huán),有什么優(yōu)化解決的方法。

重現(xiàn)bug的步驟

啟動(dòng)web服務(wù)后,不確定的時(shí)間之后,無(wú)論調(diào)用調(diào)用isUidOnline還是getAllClientIdCount 等方法,都會(huì)走到那個(gè)死循環(huán)5秒后超時(shí)退出。于此同時(shí),另一個(gè)項(xiàng)目卻可以正常的調(diào)用,調(diào)用的都是這同一個(gè)gateway-worker

系統(tǒng)環(huán)境及workerman/webman等具體版本

centos7
lumen5.8+laravelS加速
gatewayclient3.0.12
gatewayworker3.0.19

1464 3 0
3個(gè)回答

mrwu

lumen通過(guò)laravelS加速后,視為常駐內(nèi)存框架,不知道是不是這個(gè)原因?

  • 暫無(wú)評(píng)論
mrwu

個(gè)人還有個(gè)懷疑的地方,就是代碼片段中
$buffer = stream_socket_recvfrom($client, 65535);
這一行中65535這個(gè)值,我調(diào)整過(guò)服務(wù)器的ulimit值,不知道是不是因?yàn)檫@個(gè)原因

  • 暫無(wú)評(píng)論
walkor 打賞

卡5秒是因?yàn)橛術(shù)ateway進(jìn)程一直沒(méi)返回?cái)?shù)據(jù)

可能的原因有
1、gateway所在服務(wù)器沒(méi)有安裝event擴(kuò)展(php start.php status 結(jié)果里需要有event字樣),單個(gè)進(jìn)程連接數(shù)超過(guò)1024時(shí)超出的連接無(wú)法響應(yīng),包括內(nèi)部接口調(diào)用的連接。安裝擴(kuò)展后需要restart重啟才能生效,reload不生效。
2、進(jìn)程可打開文件數(shù)設(shè)置過(guò)低,當(dāng)連接數(shù)超過(guò)進(jìn)程可打開文件數(shù)后,一些連接可能無(wú)法響應(yīng)數(shù)據(jù)。更改內(nèi)核配置需要restart重啟才能生效,reload不生效。
3、跨服務(wù)器的話也可能是網(wǎng)絡(luò)抖動(dòng)導(dǎo)致

  • 暫無(wú)評(píng)論
年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??