WCF性能計(jì)數(shù)器內(nèi)存優(yōu)化方式解析
WCF中有一種叫做性能計(jì)數(shù)器的集合,可以幫助我們實(shí)現(xiàn)一些特定功能。如果要想得到一個(gè)好的結(jié)果,我們需要對(duì)WCF性能計(jì)數(shù)器內(nèi)存急性?xún)?yōu)化。#t#
WCF 為其性能計(jì)數(shù)器類(lèi)別使用單獨(dú)的共享內(nèi)存。
默認(rèn)情況下,單獨(dú)的共享內(nèi)存被設(shè)置為全局性能計(jì)數(shù)器內(nèi)存大小的四分之一。默認(rèn)的全局性能計(jì)數(shù)器內(nèi)存大小為 524,288 字節(jié)。因此,三個(gè) WCF 性能計(jì)數(shù)器類(lèi)別默認(rèn)分別具有約 128KB 的內(nèi)存大小。根據(jù)計(jì)算機(jī)上 WCF 應(yīng)用程序的運(yùn)行時(shí)特性,性能計(jì)數(shù)器內(nèi)存可能會(huì)用盡。發(fā)生這種情況時(shí),WCF 會(huì)向應(yīng)用程序事件日志中寫(xiě)入一個(gè)錯(cuò)誤。
該錯(cuò)誤的內(nèi)容聲明未加載性能計(jì)數(shù)器,并聲明一個(gè)包含異常“System.InvalidOperationException:可用于自定義計(jì)數(shù)器文件視圖的內(nèi)存不足。”的項(xiàng)。如果在錯(cuò)誤級(jí)別啟用了跟蹤,此故障也將被跟蹤。如果性能計(jì)數(shù)器內(nèi)存已用盡,在啟用性能計(jì)數(shù)器的情況下繼續(xù)運(yùn)行您的 WCF 應(yīng)用程序可能會(huì)導(dǎo)致性能明顯下降。
如果您是計(jì)算機(jī)管理員,則應(yīng)對(duì)計(jì)算機(jī)進(jìn)行配置,以便分配足夠的WCF性能計(jì)數(shù)器內(nèi)存來(lái)支持隨時(shí)可能存在的最大數(shù)量的性能計(jì)數(shù)器。有關(guān)更多信息,請(qǐng)參見(jiàn) performanceCounters(可能為英文網(wǎng)頁(yè))。
可以在注冊(cè)表中更改 WCF 類(lèi)別的性能計(jì)數(shù)器的內(nèi)存量。為此,需要向以下三個(gè)位置添加名為 FileMappingSize 的新 DWORD 值,并將它設(shè)為所需的值(以字節(jié)為單位)。重新啟動(dòng)您的計(jì)算機(jī)以使這些更改生效。
HKLM\System\CurrentControlSet\Services\ServiceModelEndpoint 3.0.0.0\Performance
HKLM\System\CurrentControlSet\Services\ServiceModelOperation 3.0.0.0\Performance
HKLM\System\CurrentControlSet\Services\ServiceModelService 3.0.0.0\Performance
當(dāng)釋放的大量對(duì)象(例如 ServiceHost)等待進(jìn)行垃圾回收時(shí),PrivateBytes 性能計(jì)數(shù)器將記錄一個(gè)非常大的數(shù)字。若要解決WCF性能計(jì)數(shù)器內(nèi)存問(wèn)題,可以添加特定于自己的應(yīng)用程序的計(jì)數(shù)器,或使用 performanceCounters 屬性?xún)H啟用服務(wù)級(jí)別計(jì)數(shù)器。