我用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
}
}
}
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):almalinux 9.4
nginx: 1.20 , nginx 單進(jìn)程的連接數(shù)已經(jīng)配置夠高了
worker_connections 65535;
Event-Loop: Select
http://wtbis.cn/doc/workerman/appendices/kernel-optimization.html