通過(guò)什么來(lái)衡量C# Socket服務(wù)的效能
在寫(xiě)任何一個(gè)東西的時(shí)候都想知道實(shí)現(xiàn)后的性能到底怎樣,一般情況下可以通過(guò)一個(gè)簡(jiǎn)單的計(jì)時(shí)來(lái)確定性能是好是壞。但對(duì)于編寫(xiě)網(wǎng)絡(luò)應(yīng)用來(lái)說(shuō)確定這東西性能怎樣相對(duì)比較復(fù)雜一些,有的人會(huì)用是否能達(dá)到某個(gè)帶寬值或是否支持多少連接來(lái)確定這性能好不好。在和很多朋友交流的過(guò)程發(fā)現(xiàn)他們對(duì)這方面的了解存在一些誤區(qū),誤認(rèn)為只要把千兆帶寬跑滿(mǎn)或都支持多少個(gè)連接接入就行;其實(shí)通這兩值來(lái)確定一個(gè)服務(wù)的性能好不好是否可靠呢?下面通過(guò)一些測(cè)試來(lái)看這兩個(gè)指標(biāo)值來(lái)衡量性能的可靠性。
帶寬
對(duì)于.NET程序來(lái)說(shuō)跑滿(mǎn)千兆帶寬可以說(shuō)是一件容易的事情,也可以說(shuō)是一件非常困難的事情。
以下是100個(gè)連接從服務(wù)端獲取不同數(shù)據(jù)塊的測(cè)試結(jié)果。
分別測(cè)試了獲取不同大小的數(shù)據(jù)塊,可以看到只要把發(fā)送的數(shù)據(jù)塊加大把千兆帶寬跑滿(mǎn)相信是一件非常簡(jiǎn)單的事情。但如果每次請(qǐng)求獲取的數(shù)據(jù)大小在幾個(gè)byte或幾十個(gè)byte,通過(guò).NET程序想把千兆帶寬跑滿(mǎn)基本是不太可能的事情,不過(guò)服務(wù)器配置好的話(huà)也許是可以的....有興趣的朋友可以試下。
連接數(shù)
連接數(shù)這個(gè)指標(biāo)在和一些朋友交談過(guò)程似乎也被神化了,其實(shí)在.net的機(jī)制中連接數(shù)量的多少似乎對(duì)整體性能沒(méi)有多大的影響.通過(guò)以下這個(gè)測(cè)試結(jié)果可以看到:
從以上測(cè)試情況來(lái)看,1000連接和20000連接在處理相同接收和發(fā)送量的情況其CPU資源似乎看不到損耗上有多大的差異,這也許是IOCP的強(qiáng)大之處。
總結(jié)
從以上兩個(gè)測(cè)試結(jié)果來(lái)看可以得到的答案是,評(píng)測(cè).net編寫(xiě)網(wǎng)絡(luò)通訊應(yīng)用效能的一個(gè)非常重要的指標(biāo)是IO處理能力,即對(duì)應(yīng)Socket對(duì)象的讀和寫(xiě)操作。在測(cè)試的過(guò)程這兩個(gè)操作會(huì)引起操作系統(tǒng)中斷處理,如果這些操作的量很大的情況那中斷的損耗也會(huì)增長(zhǎng),所以應(yīng)用允許的情況下裁剪這兩個(gè)IO操作的次數(shù)會(huì)對(duì)程序效能有著極大的提高(當(dāng)一段時(shí)間內(nèi)發(fā)向某一連接的消息合成一個(gè)發(fā)送)。
那.NET的IO量處理能力大概多少呢?對(duì)于一臺(tái)裝有WIN2008的E3 1230V2的機(jī)器,單核大概可以處理量是(10W發(fā)送+10W接收)/秒。當(dāng)然不能通過(guò)這個(gè)基數(shù)來(lái)乘上核數(shù),隨著并發(fā)的提升存在正常的損耗外,對(duì)應(yīng)線(xiàn)程的增加和系統(tǒng)中斷也會(huì)增加,這些開(kāi)銷(xiāo)增長(zhǎng)都是非線(xiàn)性的。
原文鏈接:http://www.cnblogs.com/smark/archive/2013/04/07/3003468.html