wincap问题之一(丢包)
? ? ?最近開發一個項目,發現wincap會有丟包現象,與wincap的具體應用是這樣的,一個接收線程,采用pcap_loop接收網絡中的數據包,一個發送線程,采用pcap_sendqueue_transmit的方式發送數據包,pcap_loop接收包速率大約為34k/s(包數大約150包每秒), pcap_sendqueue_transmit發送包的速率大約為每秒100包,在網上查了下wincap性能分析的文章,大多說收包率200M/s才有可能會引起丟包,而我的收包頻率才34k,與200M相差甚遠,怎么還會丟包呢?
? ? ? 下面是我對為什么丟包的分析步驟:
? ? ? 1.首先想到的是不是我的代碼出了問題,我把幾個影響系統性能的地方執行時間都打印了出來,發現執行時間都很合理,沒有什么異常。?
? ? ? 2.會不會是wincap的緩沖區的問題,wincap有兩種緩沖區,用戶緩沖區默認為256k,內核緩沖區為1M,按理來說,在我的這個應用環境,采用默認緩沖區是不會有任何問題的,但是還是抱著懷疑一切的想法,我還是重新設置了wincap的緩沖區,將用戶緩沖區和內核緩沖區都設為10M,如果這個緩沖配置還會丟包的話,那就沒天理了,但運行結果依然還是丟包,悲情了。
? ? ?3.最后一道檻是我最不想懷疑的地方,那就是與我通信的設備了,首先還是來說說我的程序是怎么與設備通信的接口吧,pc通過網口連接到交換機,交換機之間通過級聯的方式相連,總共4臺二層交換機(都是100M的交換速率),每個交換機24個端口,這四臺交換機上共連有77臺設備,我的程序負責接收這77臺設備的數據(通過上面講的pcap_loop),以及對設備進行控制(pcap_sendqueue_transmit),難道是交換機處理不過來,導致數據在交換機上就丟失了,為了驗證是否是該情況,我只與一臺交換機通信,該臺交換機上只連有14臺設備,測式結果還是會有丟包。 一切都懷疑了,但問題依舊沒有發現,嗚嗚。
? ? ? 最后又理了理自己的思路,難道是1中我測是性能出了問題,哦,在測試是的時候忘了測pcap_sendqueue_transmit?的時間,因為我把這個設為異步發送的方式,本以為這樣做應該這個部分會立即返回,不會占太多的cpu時間,但事與愿違,經測發現該函數還是很占cpu時間的,隊列數長1的時候,我測了12個小時,發現最長的包發送時間為104ms,由于我的隊列長度一般是8,但一旦出現發送包超過100ms時,因為數據擠壓沒有來得及發送,可能會使發送隊列的長度會有一個迅速增加,最大可以達到38,這時pcap_sendqueue_transmit的發送時間可能會很長,超過5S,因為這從而導致pcap_loop不能及時收到數據,從而導致數據丟失。
? ? ? 為了解決上面的問題,我將pcap_sendqueue_transmit改為pcap_send的發送方式,雖然內核切換犧牲了一些性能,但丟包問題得到解決,采用pcap_send發送,測試發現發送包也會有超過100ms,但由于是單包發送,100ms還不至于引起丟包。
? ? ? 問題總算找到了,我不得其解的是,為什么發送會影響接收?這是wincap驅動的原因嗎?
? ? ? 在寫此篇博文之前,我在看wincap驅動,希望能找出為什么wincap發送會如此占cpu時間,為什么發送會影響接收,難道wincap不支持全雙工模式嗎?有對這方面了解的朋友,希望能給我一些指點,我將感激不盡。
總結
以上是生活随笔為你收集整理的wincap问题之一(丢包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件上传功能怎么测试
- 下一篇: 2021年CKA考试真题(二)