背景:
1、 tcp client 終端為智能手表,目前同時(shí)在線大約有6000臺(tái),通過(guò)服務(wù)器記錄發(fā)現(xiàn)在白天的時(shí)候,一些手表的 tcp 斷開比較頻繁,到晚上的時(shí)候不怎么斷開(晚上是業(yè)務(wù)低谷,各個(gè)手表基本不怎么上傳數(shù)據(jù)到服務(wù)器)。
2、手表使用的是2G 網(wǎng)絡(luò),活動(dòng)范圍都在城市內(nèi)。
3、workerman 運(yùn)行截圖:
4、已經(jīng)按照“Linux內(nèi)核調(diào)優(yōu)”章節(jié)介紹 的方法調(diào)優(yōu)了系統(tǒng)配置
5、機(jī)器配置:騰訊云 4核8G 內(nèi)存,服務(wù)器負(fù)載穩(wěn)定在0.15
6、設(shè)備在線時(shí)會(huì)保持 TCP 上連接,頻繁傳輸數(shù)據(jù)(每分鐘內(nèi)都會(huì)上傳)
7、有業(yè)務(wù)自身實(shí)現(xiàn)的心跳機(jī)制
向作者和大家請(qǐng)教:是否有辦法判斷 TCP 斷開的原因?比如以下可能:
1.worker 進(jìn)程超時(shí)嚴(yán)重
手表終端網(wǎng)絡(luò)環(huán)境差
服務(wù)器配置有問(wèn)題
能否指點(diǎn)一下排查的方向,以及 workerman 和我的服務(wù)器能否支持這么多設(shè)備同時(shí)在線
之前排查發(fā)現(xiàn)有業(yè)務(wù) IO 阻塞,解決后情況好了很多,但還是有不少,請(qǐng)大家分享一點(diǎn)經(jīng)驗(yàn),非常感謝了。
我們產(chǎn)品目標(biāo)是8萬(wàn)手表終端同時(shí)在線,該如何調(diào)優(yōu) workerman ?
首先感謝你這么詳細(xì)的提問(wèn)!
如果業(yè)務(wù)每個(gè)請(qǐng)求處理時(shí)間都足夠快,支持8萬(wàn)設(shè)備在線是沒(méi)問(wèn)題的。
但是如果業(yè)務(wù)有一點(diǎn)慢,比如數(shù)據(jù)庫(kù)操作一次需要0.05秒,假設(shè)8萬(wàn)設(shè)備每秒產(chǎn)生5000個(gè)操作數(shù)據(jù)庫(kù)的請(qǐng)求,那么設(shè)備每秒產(chǎn)生的請(qǐng)求需要服務(wù)端耗時(shí)25秒才能處理完(多進(jìn)程的情況下可以緩解),這樣請(qǐng)求不斷累積會(huì)出現(xiàn)業(yè)務(wù)延遲越來(lái)越嚴(yán)重。如果客戶端設(shè)備有做超時(shí)斷開操作,那么可能會(huì)導(dǎo)致大面積連接斷開重連。往壞一點(diǎn)說(shuō),如果某些請(qǐng)求處理更慢些,例如慢sql 訪問(wèn)外部存儲(chǔ)或者curl超時(shí)阻塞了幾十秒,那個(gè)情況會(huì)變得更差。所以保證每個(gè)請(qǐng)求都能極快的處理是保持上萬(wàn)并發(fā)連接的關(guān)鍵。
目前總結(jié)的客戶端連接斷開的原因大概有以下幾個(gè)方面:
1、設(shè)備所處環(huán)境網(wǎng)絡(luò)不穩(wěn)定
2、設(shè)備與服務(wù)器間沒(méi)有用心跳來(lái)維持連接。心跳間隔最好小于60秒,大于60秒的心跳無(wú)法有效維持連接,有些可能需要的心跳間隔更小。
3、沒(méi)有安裝event擴(kuò)展,導(dǎo)致單個(gè)進(jìn)程無(wú)法維持超過(guò)1024個(gè)連接,多余的連接會(huì)有超時(shí)斷開的情況
4、沒(méi)有按照手冊(cè)優(yōu)化linux內(nèi)核
例如內(nèi)核進(jìn)程打開文件數(shù)限制了單個(gè)進(jìn)程只能維持1024個(gè)連接,多余連接超時(shí)斷開
例如內(nèi)核同時(shí)打開了net.ipv4.tcp_tw_recycle 和 net.ipv4.timestamp 導(dǎo)致處于nat網(wǎng)絡(luò)的客戶端連接超時(shí)
例如內(nèi)核防火墻跟蹤表 (net.netfilter.nf_conntrack_max)大小設(shè)置太低,無(wú)法應(yīng)對(duì)大量連接,導(dǎo)致客戶端連接超時(shí)或者斷開
5、業(yè)務(wù)bug導(dǎo)致一些連接被錯(cuò)誤的斷開
6、設(shè)備bug導(dǎo)致連接斷開
根據(jù)描述,白天設(shè)備連接斷開比較頻繁,夜晚比較穩(wěn)定,我有點(diǎn)懷疑是由于白天很多用戶活動(dòng)與不同的環(huán)境導(dǎo)致,例如在電梯 地鐵 地下室等環(huán)境網(wǎng)絡(luò)比較差,連接斷開。等到了信號(hào)好的地方又重新連接。
而夜里時(shí)大家都在睡覺(jué),不會(huì)出現(xiàn)網(wǎng)絡(luò)環(huán)境頻繁變更的情況,自然比較穩(wěn)定。
非常感謝提供的思路,看來(lái)問(wèn)題很有可能出在業(yè)務(wù)有點(diǎn)慢的問(wèn)題上。產(chǎn)品初期最關(guān)心的是實(shí)現(xiàn)業(yè)務(wù)邏輯,對(duì)于性能問(wèn)題并不是很重視。我先從這個(gè)方向理一下,有進(jìn)展再向您請(qǐng)教