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

gatewayworker高并發(fā)的問(wèn)題

tqjs

問(wèn)題描述

我用go協(xié)程并發(fā)2000進(jìn)等壓力測(cè)試的時(shí)候,可以正常連接上,但是,2500的時(shí)候就會(huì)失敗,看服務(wù)狀態(tài),又是正常的。但是用其他工具再去進(jìn)行連接請(qǐng)求就會(huì)失敗。
同時(shí) Gateway::getAllClientIdList() 在超過(guò)1000并發(fā)的時(shí)候,可以正常獲取,2000并發(fā)的時(shí)候,獲取不到列表。但是 Gateway::getAllClientIdCount() 在2000并發(fā)的時(shí)候可以獲取數(shù)字,2500的失敗的時(shí)候獲取的數(shù)字是0.

以下是成功的時(shí)候,查看到的狀態(tài)信息:
截圖

以下是失敗的時(shí)候,查看到的狀態(tài)信息:
截圖

我看gateway 進(jìn)程連接數(shù)是1000左右,兩個(gè)進(jìn)程就2000出頭,是不是跟這個(gè)限制有關(guān)?我看文檔里面有提到:每個(gè)Gateway進(jìn)程可以輕松處理5000-10000連接的請(qǐng)求轉(zhuǎn)發(fā)。 似乎我這個(gè)進(jìn)程是縮水到每到個(gè)進(jìn)程 1000 個(gè)連接數(shù)上線
我看對(duì)應(yīng)進(jìn)程的限制: cat /proc/322938/limits 里面的 Max open files 是65535。應(yīng)該不是這里的配置問(wèn)題。

PS: 我目前把進(jìn)程數(shù)開到16個(gè),連接數(shù)10000是相對(duì)正常的,15000,就也很容易出問(wèn)題,同時(shí)命令行會(huì)打印錯(cuò)誤信息:

foreach() argument must be of type array|object, bool given in /home/www/gatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php on line 504

程序代碼

這是go腳本的代碼,每個(gè)協(xié)程的代碼,外層就是簡(jiǎn)單的循環(huán)X次


func newThread(uid string) {
    defer wg.Done()
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    u := url.URL{Scheme: "ws", Host: "api-test.ai.cc", Path: "/ws"}
    log.Printf("connecting to %s", u.String())

    // 連接 websocket
    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    // 綁定用戶

    done := make(chan struct{})

    // 讀取服務(wù)器消息
    go func() {
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            log.Printf("recv: %s", message)
        }
    }()

    // 定時(shí)器,隔50秒向服務(wù)器發(fā)送 ping 消息
    ticker := time.NewTicker(time.Second * 50)
    defer ticker.Stop()

    for {
        select {
        case <-done:
            return
        case <-ticker.C: // 定時(shí)器到時(shí)間 發(fā)送消息
            err := c.WriteMessage(websocket.TextMessage, []byte(`{"action":"ping"}`))
            if err != nil {
                log.Println("write:", err)
                return
            }
        case <-interrupt:
            log.Println("interrupt")
            return
        }
    }
}

報(bào)錯(cuò)信息

go 腳本并發(fā)太高時(shí),會(huì)報(bào)錯(cuò)并退出

dial:read tcp 192.168.1.119:61404->192.168.1.231:80: i/o timeout

操作系統(tǒng)及workerman/webman等框架組件具體版本

操作系統(tǒng):almalinux 9.4
nginx: 1.20 , nginx 單進(jìn)程的連接數(shù)已經(jīng)配置夠高了
worker_connections 65535;
截圖

922 1 0
1個(gè)回答

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