????? 客戶端開十個(gè)線程對(duì)http服務(wù)器進(jìn)行壓力測(cè)試,結(jié)果只獲取了幾次結(jié)果就一直超時(shí),recv函數(shù)返回10060建立鏈接失敗。于是我在懷疑是iocp的問題,仔細(xì)檢查代碼并沒發(fā)現(xiàn)可疑之處,打斷點(diǎn),卻收到了客戶端的數(shù)據(jù),但是沒發(fā)送數(shù)據(jù),懷疑iocp鏈接是否有問題。
???? 找到以前的iocp github例子,開十個(gè)客戶端并發(fā)測(cè)試,并沒有什么問題。因?yàn)槲覍?duì)該例子做了大量?jī)?yōu)化,于是測(cè)試我最基礎(chǔ)的iocp服務(wù),也沒發(fā)現(xiàn)問題。然后把http服務(wù)業(yè)務(wù)剝離,測(cè)試,也沒有問題。
???? 懷疑是否是業(yè)務(wù)太過復(fù)雜,但是不會(huì)造成以后的鏈接都超時(shí)的情況。分析業(yè)務(wù)發(fā)現(xiàn)數(shù)據(jù)庫(kù)的操作造成了問題。于是測(cè)試數(shù)據(jù)庫(kù)連接池,但數(shù)據(jù)庫(kù)連接池以前就測(cè)試過并發(fā)問題。但還是分析了連接池源代碼。有沒有鎖問題,發(fā)現(xiàn)并無(wú)問題。還去看了其他人的連接池實(shí)現(xiàn),發(fā)現(xiàn)還沒我的實(shí)現(xiàn)的完美。
???? 又轉(zhuǎn)到http服務(wù)這邊來(lái),發(fā)現(xiàn)條件變量一直wait,在wait處和釋放出加上斷點(diǎn)。發(fā)現(xiàn)一直沒有釋放。查看代碼,原來(lái)有一個(gè)條件下直接返回了,并沒釋放數(shù)據(jù)庫(kù)鏈接。
總結(jié):
???? 1? 類庫(kù)的開發(fā)要慎之又慎,必須得有一些功能性測(cè)試。不然造成排錯(cuò)問題。同時(shí)也要對(duì)類庫(kù)有一些信心。
???? 2? 排錯(cuò)時(shí)還是應(yīng)該由淺入深,先從最外層進(jìn)行判斷。