可以通過修改許多服務(wù)器設(shè)置讓它更好地處理工作負(fù)載,。根據(jù)服務(wù)器負(fù)載性質(zhì)的不同,,文件服務(wù)器的調(diào)優(yōu)不同于數(shù)據(jù)庫服務(wù)器,兩個應(yīng)用服務(wù)器也可能采用不同的方式調(diào)優(yōu)。調(diào)優(yōu)涉及把有限的服務(wù)器資源分配給操作系統(tǒng)和應(yīng)用程序的不同部分,,從而讓應(yīng)用程序盡快做出響應(yīng),。下面是調(diào)優(yōu)要考慮的領(lǐng)域:
這些方面經(jīng)常會相互影響。例如,,可以為緩存分配內(nèi)存,,這可以減少磁盤訪問或通過網(wǎng)絡(luò)的資源訪問。本文的重點之一是與 Java 虛擬機 (JVM) 相關(guān)的內(nèi)存調(diào)優(yōu),。JVM 有自己的內(nèi)存管理系統(tǒng),,必須監(jiān)視和配置這個系統(tǒng)。 服務(wù)器的 CPU 會在等待某些事件方面花費很多時間,。最常見的情況是等待磁盤返回數(shù)據(jù),。多任務(wù)機制允許 CPU 在等待時做其他事情。因此,,如果主機在 CPU 方面花費大量時間,,那么購買更快的 CPU 會提高性能。
轉(zhuǎn)移負(fù)載可能意味著在另一臺服務(wù)器上運行批作業(yè),或者把應(yīng)用程序負(fù)載分配給多臺服務(wù)器,。后一種方法是最理想的,,這稱為水平擴(kuò)展。如果必須提高 CPU 能力,,那么可以進(jìn)行物理升級,,比如添加更多的 CPU;如果處于虛擬化環(huán)境,,還可以重新分配更多資源,。 一些負(fù)載本身不適合并行處理,所以跨多個服務(wù)器分配負(fù)載或添加更多 CPU 不會有幫助,。在這種情況下,,要使用更快的 CPU 并花時間優(yōu)化底層代碼,減少運行它所需的 CPU 周期,。 內(nèi)存調(diào)優(yōu)涉及許多方面,。最簡單的調(diào)優(yōu)措施是確保 RAM 足以容納應(yīng)用程序,,而不需要使用交換空間。操作系統(tǒng)的虛擬內(nèi)存子系統(tǒng)允許應(yīng)用程序分配的內(nèi)存超過系統(tǒng)上實際存在的內(nèi)存量,,不足的部分由磁盤上的臨時存儲組成,。與直接訪問 RAM 中的內(nèi)存塊相比,把內(nèi)存塊交換到磁盤并交換回來要慢得多,,所以一般情況下應(yīng)該避免這種做法,。 虛擬內(nèi)存子系統(tǒng)需要調(diào)優(yōu),因為在系統(tǒng)用完內(nèi)存之前和發(fā)生某些事件時,,可能會把內(nèi)存塊寫到磁盤,,這時不得不使用交換空間。要檢查的主要是什么時候使用虛擬內(nèi)存,。隨著 UNIX® 系統(tǒng)上的空閑內(nèi)存被逐漸分配掉,內(nèi)核最終會發(fā)現(xiàn)它必須要尋找可以交換出去的內(nèi)存頁面,。在此之后,,如果內(nèi)核預(yù)計必須為請求內(nèi)存的進(jìn)程分配內(nèi)存,它就會開始把一些頁面交換到磁盤,。如果您知道內(nèi)存足以處理工作負(fù)載,,最好推遲這兩種交換活動。 在 Solaris™ 上,,通過 /etc/system 中的可調(diào)項來調(diào)整內(nèi)存,。在 IBM® AIX® 操作系統(tǒng)上,使用 最后,安裝更多內(nèi)存讓文件系統(tǒng)可以把文件和元數(shù)據(jù)緩存在內(nèi)存中,。大多數(shù) UNIX 系統(tǒng)會嘗試用空閑內(nèi)存執(zhí)行緩存,,這就是系統(tǒng)常常看起來沒有空閑內(nèi)存的原因,。緩存可以減少磁盤活動,,這對于 Web 服務(wù)器等工作負(fù)載非常重要。 磁盤比內(nèi)存慢得多,,所以過多的磁盤活動是許多應(yīng)用程序性能低下的原因,。磁盤活動可能源于交換,也可能源于應(yīng)用程序或操作系統(tǒng)的請求,。過多的日志記錄活動也會爭用磁盤,。 發(fā)現(xiàn)磁盤瓶頸的最佳工具是
與磁盤密切相關(guān)的是可以打開的文件描述符數(shù)量,。如果用光了文件描述符,,那么打開文件的操作就會失敗。通常,, 網(wǎng)絡(luò)對于大多數(shù)應(yīng)用程序都很重要,,因為網(wǎng)絡(luò)在服務(wù)器和客戶機之間來回傳輸數(shù)據(jù),。網(wǎng)絡(luò)慢常常導(dǎo)致應(yīng)用程序看起來響應(yīng)緩慢。應(yīng)該做的第一件事是,,確保所有服務(wù)器使用全雙工和最高的網(wǎng)絡(luò)速度,,并相應(yīng)地匹配交換機端口。交換機和服務(wù)器之間的速度和雙工不匹配是網(wǎng)絡(luò)問題的常見原因,。 操作系統(tǒng)會為網(wǎng)絡(luò)資源分配各種緩沖區(qū),。例如,操作系統(tǒng)為每個 TCP 連接維護(hù) TCP 發(fā)送隊列,。這個隊列保存應(yīng)用程序已經(jīng)發(fā)送,,但是還沒有得到遠(yuǎn)程端確認(rèn)的數(shù)據(jù)(根據(jù)未確認(rèn)數(shù)據(jù)包的數(shù)量,一些數(shù)據(jù)可能還未發(fā)送到網(wǎng)絡(luò)),。如果這個隊列滿了,,就不允許應(yīng)用程序發(fā)送更多數(shù)據(jù),直到清理完積壓的隊列為止,。 可以用 如果 前面幾節(jié)討論了需要調(diào)優(yōu)的四個系統(tǒng)領(lǐng)域,。其中之一是內(nèi)存。在 Java 應(yīng)用程序環(huán)境中,,服務(wù)器把內(nèi)存分配給 Java 進(jìn)程,,Java 進(jìn)程負(fù)責(zé)運行應(yīng)用程序代碼。這個 Java 進(jìn)程就是 JVM,,它負(fù)責(zé)把內(nèi)存分配給底層應(yīng)用程序,。 在操作系統(tǒng)級上,可能看到 1GB 內(nèi)存被分配給一個 Java 進(jìn)程,。在這個進(jìn)程內(nèi)部,,JVM 管理堆,堆為新對象提供內(nèi)存,。在創(chuàng)建對象時,對象被放在堆上,。在銷毀對象時,,它們?nèi)匀涣粼诙焉稀VM 會運行一個稱為垃圾收集 的過程,,垃圾收集標(biāo)出所有創(chuàng)建的對象,,然后清理堆的其余部分供以后的分配使用。在此時,,堆可以擴(kuò)展(如果垃圾收集沒有回收新分配所需的足夠內(nèi)存)或收縮(如果滿足特定條件,,使 JVM 認(rèn)為堆太大了)。 根據(jù)這個簡化的垃圾收集定義可以推斷出,,在執(zhí)行垃圾收集時系統(tǒng)不會執(zhí)行任何應(yīng)用程序工作,。在運行垃圾收集期間,JVM 實際上會暫停,。因此,,許多 Java 調(diào)優(yōu)措施都涉及決定堆的最佳內(nèi)存大小以及調(diào)整垃圾收集過程。 垃圾收集過程調(diào)優(yōu)的基本思路是,,了解運行垃圾收集的頻率以及觸發(fā)它的條件,,然后通過修改 JVM 設(shè)置盡可能降低垃圾收集的影響。 為了了解垃圾收集對應(yīng)用程序的影響,,首先要收集關(guān)于何時及如何執(zhí)行垃圾收集的信息,。在 JVM 中啟用詳細(xì)垃圾收集日志記錄,,這會開始記錄垃圾收集活動。在 IBM WebSphere™ Application Server 中,,可以在管理控制臺中找到這個設(shè)置:在 Integrated Solutions Console 中導(dǎo)航到 Application servers > server name > Process Definition > Java Virtual Machine,,選擇 Verbose Garbage Collection。 還可以用 對于啟用詳細(xì)垃圾收集日志記錄,,糟糕的方面是不同廠商采用的文件格式不一致,,甚至在同一廠商提供的不同版本之間也可能不一致。例如,,IBM 的 Java Runtime Environment (JRE) 6.0 采用詳細(xì)的 Extensible Markup Language (XML) 文件格式,。而 Sun Microsystems 的 HotSpot JVM 使用簡明的單行格式,有時候需要啟用更多命令行參數(shù),,才能得到所需的信息,。 啟用垃圾收集器的日志記錄之后,在正常負(fù)載下運行應(yīng)用程序,。然后,,研究垃圾收集日志??梢钥吹蕉训拇笮淖畛醯姆峙溟_始增長,,最終穩(wěn)定在某一范圍內(nèi)。然后,,可以使用這個范圍內(nèi)的某個值作為堆的初始大小,,這會消除堆增長到穩(wěn)定狀態(tài)導(dǎo)致的初始延遲。 垃圾收集日志還會指出發(fā)生垃圾收集的時間以及垃圾收集花費的時間,。如果發(fā)現(xiàn)垃圾收集的運行時間太長,,可以考慮讓 JVM 使用另一種垃圾收集算法(具體細(xì)節(jié)取決于 JVM 的版本和廠商)。根據(jù)這些時間戳,,還可以計算出系統(tǒng)在垃圾收集方面花費的時間百分比,,可以用這個指標(biāo)比較各種 JVM 設(shè)置。 如果發(fā)現(xiàn)堆不斷增長和收縮,,可以修改 隨著 JVM 的發(fā)展,,與垃圾收集相關(guān)的性能也會變化,。一定要通過您的 JVM 手冊了解當(dāng)前的調(diào)優(yōu)參數(shù)。 對于在為 WebSphere Application Server 調(diào)整 UNIX 服務(wù)器時應(yīng)該檢查哪些方面,,IBM 給出了一些建議,。 首先,,確保服務(wù)器具有所需的資源:CPU、磁盤,、內(nèi)存和網(wǎng)絡(luò),。這些是最基本的。 接下來,,了解應(yīng)用程序的垃圾收集需求并相應(yīng)地調(diào)整 JVM,。這可能需要回到前一步,確保具有按所需方式運行應(yīng)用程序的足夠內(nèi)存,。 確保適當(dāng)?shù)卦O(shè)置應(yīng)用服務(wù)器隊列,,讓應(yīng)用服務(wù)器只處理它能夠處理的請求。當(dāng) Web 服務(wù)器把請求交給應(yīng)用服務(wù)器時,,它會進(jìn)入一個隊列,。如果允許太多的連接連接到應(yīng)用程序,每個用戶都會體驗到糟糕的性能,。因此,,過剩的連接應(yīng)該在 Web 服務(wù)器上排隊,而不要在 WebSphere Application Server 上排隊,。 最后,,可以使用多種緩存技術(shù),比如數(shù)據(jù)庫中的預(yù)備語句,、Enterprise JavaBean (EJB) 技術(shù)和線程緩存,。如果不斷清理緩存,從而為新內(nèi)容讓出空間,,就應(yīng)該考慮增加緩存大小。 計算機的資源分為 CPU,、磁盤,、內(nèi)存和網(wǎng)絡(luò)。調(diào)優(yōu)工作應(yīng)該度量這些資源,,然后在應(yīng)用程序,、應(yīng)用服務(wù)器和服務(wù)器中做相應(yīng)的調(diào)整,確保不出現(xiàn)資源爭用,。 JVM 管理自己的堆并通過垃圾收集過程清理堆,。這方面的調(diào)優(yōu)包括確保堆可以增長到應(yīng)用程序需要的大小,以及通過調(diào)整垃圾收集參數(shù)避免垃圾收集的影響過大,。 進(jìn)行垃圾收集調(diào)優(yōu)的主要工具是詳細(xì)垃圾收集日志記錄,,這會記錄每個垃圾收集活動??梢酝ㄟ^日志了解垃圾收集花費的時間以及執(zhí)行收集的原因,。 學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
|
|