下面介紹一下應(yīng)用程序來不及處理而導(dǎo)致udp丟包的常見原因:
1、linux內(nèi)核socket緩沖區(qū)設(shè)的太小
# cat /proc/sys/net/core/rmem_default
# cat /proc/sys/net/core/rmem_max
可以查看socket緩沖區(qū)的缺省值和最大值。
rmem_default和rmem_max設(shè)置為多大合適呢?如果服務(wù)器的性能壓力不大,對處理時延也沒有很嚴(yán)格的要求,設(shè)置為1M左右即可。如果服務(wù)器的性能壓力較大,或者對處理時延有很嚴(yán)格的要求,則必須謹(jǐn)慎設(shè)置rmem_default 和rmem_max,如果設(shè)得過小,會導(dǎo)致丟包,如果設(shè)得過大,會出現(xiàn)滾雪球。
2、服務(wù)器負(fù)載過高,占用了大量cpu資源,無法及時處理linux內(nèi)核socket緩沖區(qū)中的udp數(shù)據(jù)包,導(dǎo)致丟包。
一般來說,服務(wù)器負(fù)載過高有兩個原因:收到的udp包過多;服務(wù)器進(jìn)程存在性能瓶頸。如果收到的udp包過多,就要考慮擴(kuò)容了。服務(wù)器進(jìn)程存在性能瓶頸屬于性能優(yōu)化的范疇,這里不作過多討論。
3、磁盤IO忙
服務(wù)器有大量IO操作,會導(dǎo)致進(jìn)程阻塞,cpu都在等待磁盤IO,不能及時處理內(nèi)核socket緩沖區(qū)中的udp數(shù)據(jù)包。如果業(yè)務(wù)本身就是IO密集型的,要考慮在架構(gòu)上進(jìn)行優(yōu)化,合理使用緩存降低磁盤IO。
這里有一個容易忽視的問題:很多服務(wù)器都有在本地磁盤記錄日志的功能,由于運維誤操作導(dǎo)致日志記錄的級別過高,或者某些錯誤突然大量出現(xiàn),使得往磁盤寫日志的IO請求量很大,磁盤IO忙,導(dǎo)致udp丟包。
對于運維誤操作,可以加強(qiáng)運營環(huán)境的管理,防止出錯。如果業(yè)務(wù)確實需要記錄大量的日志,可以使用內(nèi)存log或者遠(yuǎn)程log。
4、物理內(nèi)存不夠用,出現(xiàn)swap交換
swap交換本質(zhì)上也是一種磁盤IO忙,因為比較特殊,容易被忽視,所以單列出來。
只要規(guī)劃好物理內(nèi)存的使用,并且合理設(shè)置系統(tǒng)參數(shù),可以避免這個問題。
5)磁盤滿導(dǎo)致無法IO
沒有規(guī)劃好磁盤的使用,監(jiān)控不到位,導(dǎo)致磁盤被寫滿后服務(wù)器進(jìn)程無法IO,處于阻塞狀態(tài)。最根本的辦法是規(guī)劃好磁盤的使用,防止業(yè)務(wù)數(shù)據(jù)或日志文件把磁盤塞滿,同時加強(qiáng)監(jiān)控,例如開發(fā)一個通用的工具,當(dāng)磁盤使用率達(dá)到80%時就持續(xù)告警,留出充足的反應(yīng)時間。
處理器:Intel(R) Xeon(R) CPU X3440 @ 2.53GHz,4核,8超線程,千兆以太網(wǎng)卡,8G內(nèi)存
單機(jī),單線程異步UDP服務(wù),無業(yè)務(wù)邏輯,只有收包操作,除UDP包頭外,一個字節(jié)數(shù)據(jù)。
測試結(jié)果
進(jìn)程個數(shù) |
1 |
2 |
4 |
8 |
平均處理速度(包/秒) |
791676.1 |
1016197 |
1395040 |
1491744 |
網(wǎng)卡流量(Mb/s) |
514.361 |
713.786 |
714.375 |
714.036 |
CPU占用情況(%) |
100 |
200 |
325 |
370 |
現(xiàn)象:
1、單機(jī)UDP收包處理能力可以每秒達(dá)到150w左右。
2、處理能力隨著進(jìn)程個數(shù)的增加而增強(qiáng)。
3、在處理達(dá)到峰值時,CPU資源并未耗盡。
結(jié)論:
1、UDP的處理能力還是非?捎^的。
2、對于現(xiàn)象2和現(xiàn)象3,可以看出,性能的瓶頸在網(wǎng)卡,而不在CPU,CPU的增加,處理能力的上升,來源于丟包(UDP_ERROR)個數(shù)的減少。
2015職稱計算機(jī)考試書PowerPoint2007中 .. 定價:¥45 優(yōu)惠價:¥42 更多書籍 | |
2015年全國職稱計算機(jī)考試教材(2007模 .. 定價:¥225 優(yōu)惠價:¥213 更多書籍 |