情況:從 ASP.NET 頁(yè)面調(diào)用 Web 服務(wù)時(shí)的性能破壞
我們?cè)诒緦谥杏懻?nbsp; Web 服務(wù)時(shí),期望在各種情況下都可以享用 Web 服務(wù)。一個(gè)主要的情況是從中間層環(huán)境(如 ASP.NET Web 頁(yè)面)訪問(wèn) Web 服務(wù)。為 MapPoint .NET Web 服務(wù)的用戶提供支持的人員經(jīng)常收到這樣的問(wèn)題,即用戶在使用其 Web 服務(wù)時(shí),對(duì) MapPoint .NET 的調(diào)用可能需要相當(dāng)長(zhǎng)的時(shí)間。這本身并不是什么問(wèn)題,但某些其他因素可以使之成為比表面上要嚴(yán)重得多的大問(wèn)題。
HTTP 雙連接限制
HTTP 規(guī)范表明,一個(gè) HTTP 客戶端與任一服務(wù)器最多可以同時(shí)建立兩個(gè) TCP 連接。這可以防止單個(gè)瀏覽器在瀏覽某個(gè)頁(yè)面(例如,具有 120 個(gè)嵌入的縮略圖)時(shí),由于連接請(qǐng)求過(guò)多而使服務(wù)器負(fù)載過(guò)重。此時(shí),瀏覽器將僅創(chuàng)建 2 個(gè)連接,然后通過(guò)這兩個(gè)管道開始發(fā)送 120 個(gè) HTTP 請(qǐng)求,而不是創(chuàng)建 120 個(gè) TCP 連接并通過(guò)每個(gè)連接來(lái)發(fā)送 HTTP 請(qǐng)求。對(duì)于中間層,此方法的問(wèn)題在于,中間層可能會(huì)有 50 個(gè)同時(shí)請(qǐng)求連接的用戶。如果不得不為每個(gè)用戶進(jìn)行一次 MapPoint .NET Web 服務(wù)調(diào)用,將會(huì)有 48 個(gè)用戶等待兩個(gè)管道中的一個(gè)空閑下來(lái)。
線程池限制
ASP.NET 處理傳入的請(qǐng)求的方式是通過(guò)一個(gè)稱為進(jìn)程線程池的一組線程為其提供服務(wù)。正常情況下,請(qǐng)求傳入后,池中某個(gè)空閑的線程將為其提供服務(wù)。這里的問(wèn)題在于,進(jìn)程線程池不會(huì)創(chuàng)建無(wú)數(shù)個(gè)線程來(lái)處理大量的請(qǐng)求。具有最大線程數(shù)限制是一件好事,因?yàn)槿绻覀儫o(wú)限地創(chuàng)建線程,計(jì)算機(jī)上的全部資源將只能用來(lái)管理這些線程了。通過(guò)限制所能創(chuàng)建的線程數(shù),我們可以把線程管理的系統(tǒng)開銷保持在一個(gè)可控的水平。如果某個(gè)請(qǐng)求傳入時(shí)線程池中的所有線程都被占用,則該請(qǐng)求將排隊(duì)等候,在忙線程完成任務(wù)后,空閑出來(lái)的線程才能處理新請(qǐng)求。此方法實(shí)際上比切換到某個(gè)新線程更有效,因?yàn)椴恍枰谡?qǐng)求之間進(jìn)行線程切換。但存在的問(wèn)題是,如果線程的使用效率不高(尤其是在非常忙的 Web 服務(wù)器上),則等候的請(qǐng)求隊(duì)列會(huì)變得很大。
考慮一下從 ASP.NET 頁(yè)面進(jìn)行 Web 服務(wù)調(diào)用的情況。如果進(jìn)行同步調(diào)用,則正在運(yùn)行的線程將被阻塞,直到 Web 服務(wù)調(diào)用完成為止。在調(diào)用期間,線程無(wú)法進(jìn)行任何其他活動(dòng)。它無(wú)法處理其他請(qǐng)求,只能等待。如果某個(gè)單處理器計(jì)算機(jī)上具有默認(rèn)的工作線程數(shù) 20,則只需 20 個(gè)同時(shí)進(jìn)行的請(qǐng)求即可用完全部線程,以后的請(qǐng)求必須排隊(duì)等候。
該問(wèn)題不僅限于 Web 服務(wù)
不僅調(diào)用 Web 服務(wù)的用戶會(huì)遇到從 Web 頁(yè)面進(jìn)行調(diào)用時(shí)的擁堵且耗時(shí)較長(zhǎng)的問(wèn)題。進(jìn)行任意數(shù)量的較長(zhǎng)的調(diào)用都會(huì)遇到同樣的問(wèn)題,例如:SQL Server™ 請(qǐng)求、長(zhǎng)文件的讀取或?qū)懭搿⒏鞣N Web 請(qǐng)求或訪問(wèn)某個(gè)并發(fā)資源(其中鎖定會(huì)造成嚴(yán)重的延遲)。實(shí)際上,有許多使用 Web 服務(wù)的情況,其服務(wù)調(diào)用比較迅速,并不是什么問(wèn)題。但您或許會(huì)理解,如果您想通過(guò)代理服務(wù)器調(diào)用 MapPoint .NET Web 服務(wù),所使用的連接具有一定的延遲,同時(shí)相應(yīng)的服務(wù)可能又要花費(fèi)一些時(shí)間來(lái)處理請(qǐng)求,則您可能在各處位置都看到延遲的情況,并且如果站點(diǎn)很忙,便可能出現(xiàn)問(wèn)題。
改善問(wèn)題
該問(wèn)題的某些方面可以通過(guò)對(duì)環(huán)境進(jìn)行某些配置設(shè)置來(lái)改善。我們看一下可用于改善該問(wèn)題的某些配置設(shè)置。
maxconnections
連接到 Web 資源的默認(rèn)雙連接限制可以通過(guò)一個(gè)名為 connectionManagement 的配置元素來(lái)控制。connectionManagement 設(shè)置允許您添加要讓其采用非默認(rèn)連接限制的站點(diǎn)的名稱??梢詫⒁韵聝?nèi)容添加到典型的 Web.config 文件中,將您連接的所有服務(wù)器的連接限制默認(rèn)值增加到 40。
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="40" />
</connectionManagement>
</system.net>
<system.web>
...
應(yīng)當(dāng)注意的是,對(duì)本地計(jì)算機(jī)的連接數(shù)量從來(lái)都沒(méi)有限制,因此,如果是連接到本地主機(jī),則此設(shè)置無(wú)效。
maxWorkerThreads 和 minFreeThreads
如果收到 HTTP 503 錯(cuò)誤(“服務(wù)暫時(shí)過(guò)載”),則表明線程池中的線程已全部占用,并且請(qǐng)求隊(duì)列也已超出最大值(appRequestQueueLimit 的默認(rèn)設(shè)置為 100)。對(duì)于 IIS 5.0 安裝,可以簡(jiǎn)單地增加線程池的大小。而對(duì)于 IIS 6.0 安裝(與 IIS 5.0 不兼容),這些設(shè)置將無(wú)效。
maxWorkerThreads 和 maxIoThreads 分別控制工作線程數(shù)以及處理新提交的 ASP.NET 請(qǐng)求的線程數(shù)。這些設(shè)置需要在您的 Machine.config 中進(jìn)行配置,它們將影響您計(jì)算機(jī)上運(yùn)行的所有 Web 應(yīng)用程序。maxWorkerThreads 是 Machine.config 中的 processModel 元素的一部分,并且您在查看后會(huì)發(fā)現(xiàn),該設(shè)置的默認(rèn)值為每個(gè)處理器 20 個(gè)線程。
minFreeThreads 設(shè)置可以在 Machine.config 中進(jìn)行配置,或者在您的應(yīng)用程序的 Web.config 文件中的 httpRuntime 元素下進(jìn)行配置。該設(shè)置的作用是,當(dāng)空閑的線程數(shù)低于所設(shè)置的限制時(shí),將禁止使用線程池中的線程來(lái)處理傳入的 HTTP 請(qǐng)求。如果您需要某個(gè)進(jìn)程線程池線程完成掛起的請(qǐng)求,這會(huì)很有用。如果所有的線程都被用來(lái)處理傳入的 HTTP 請(qǐng)求,并且這些請(qǐng)求在等待另一個(gè)線程完成其處理,那么就會(huì)進(jìn)入死鎖狀態(tài)。例如,如果您正在從 ASP.NET 應(yīng)用程序進(jìn)行對(duì)某個(gè) Web 服務(wù)的異步 Web 服務(wù)調(diào)用,并且在等待回調(diào)函數(shù)完成該請(qǐng)求,就會(huì)出現(xiàn)這種情況。因?yàn)榛卣{(diào)必須在進(jìn)程線程池中的空閑線程上進(jìn)行。如果查看一下您的 Machine.config,將會(huì)注意到 minFreeThreads 設(shè)置的默認(rèn)值為 8,如果工作線程池的限制為 20,則該默認(rèn)值還可以滿足需要,但是,如果線程池的大小增加到 100,該默認(rèn)值就太小了。
應(yīng)當(dāng)注意的是,如果您的 ASP.NET 應(yīng)用程序?qū)Ρ镜赜?jì)算機(jī)進(jìn)行 Web 服務(wù)調(diào)用,則線程池限制的問(wèn)題將被激化。例如,我為此專欄創(chuàng)建的測(cè)試應(yīng)用程序調(diào)用與 ASPX 頁(yè)面同處一臺(tái)計(jì)算機(jī)上的 Web 服務(wù)。因而,對(duì)于阻塞的調(diào)用,一個(gè)線程被同時(shí)用于 ASPX 頁(yè)面和 ASMX Web 服務(wù)請(qǐng)求。這有效地使 Web 服務(wù)器處理的同時(shí)請(qǐng)求數(shù)增加了一倍。在同時(shí)進(jìn)行兩個(gè) Web 服務(wù)請(qǐng)求(使用異步 Web 服務(wù)調(diào)用)的情況下,我們最終使同時(shí)進(jìn)行的請(qǐng)求數(shù)增加了兩倍。為避免在回調(diào)本地計(jì)算機(jī)時(shí)出現(xiàn)此類問(wèn)題,您應(yīng)當(dāng)考慮您的應(yīng)用程序的體系結(jié)構(gòu),使其簡(jiǎn)單地直接從 ASPX 代碼來(lái)執(zhí)行 Web&nbs
?石家莊網(wǎng)站建設(shè)的優(yōu)點(diǎn):我們是專屬定制,制作符合您公司業(yè)務(wù)、風(fēng)格的網(wǎng)站,這就做到給您制作的網(wǎng)站是網(wǎng)絡(luò)上獨(dú)一無(wú)二的網(wǎng)站,這樣更有利于搜索引擎的收錄。如果您喜歡網(wǎng)絡(luò)上某個(gè)風(fēng)格的網(wǎng)站或者網(wǎng)站模板,我們是只仿制而不直接套用,我們會(huì)對(duì)其中的結(jié)構(gòu)和樣式做增減優(yōu)化,做…
?競(jìng)價(jià)排名營(yíng)銷是一種通過(guò) 競(jìng)價(jià)購(gòu)買搜索引擎中關(guān)鍵詞或關(guān)鍵短語(yǔ)的廣告方式。競(jìng)價(jià)排名營(yíng)銷分為兩種類型。 第一種,直接為真正的搜索引擎結(jié)果的排名付費(fèi),也就是說(shuō)付的錢越多,網(wǎng)頁(yè)所獲得的排名名也就越高。 第二種則更類似于普通的廣告。這種競(jìng)價(jià)排名營(yíng)銷方式通過(guò)…
?網(wǎng)站優(yōu)化對(duì)網(wǎng)站來(lái)說(shuō)是非常重要的,直接決定和影響著網(wǎng)站所起到的作用,以及在各個(gè)地方當(dāng)中的排名。在進(jìn)行seo優(yōu)化的過(guò)程中,我們必須要堅(jiān)持一定的原則,真正的把這些事情做得更好,才可以確保最終的結(jié)果,這對(duì)于我們來(lái)說(shuō)是非常重要的事。 SEO優(yōu)化主要分為8小步: …