論改進(jìn)Web服務(wù)器性能的有關(guān)技術(shù)
【摘要】
基于Web技術(shù)的數(shù)據(jù)庫應(yīng)用是當(dāng)前應(yīng)用的一個(gè)熱點(diǎn),在用戶數(shù)目與通信負(fù)荷很大的場合,提高Web服務(wù)器性能是一個(gè)迫切的課題。本文從筆者參與某個(gè)銀行系統(tǒng)項(xiàng)目開發(fā)的經(jīng)歷出發(fā),闡述了提高Web服務(wù)器的性能應(yīng)滲入到項(xiàng)目論證、選型、開發(fā)、運(yùn)行和管理的各個(gè)環(huán)節(jié),只有各個(gè)環(huán)節(jié)都能充分考慮到性能與質(zhì)重的需要,系統(tǒng)的性能才是真正可保證的和可擴(kuò)充的。
文章從系統(tǒng)的實(shí)際運(yùn)行與相應(yīng)的經(jīng)驗(yàn)出發(fā),闡述了性能改進(jìn)方面的一些具體措施。比如:在本文中討論了 Web服務(wù)器平臺的選型考慮;Web服務(wù)器的配置管理;應(yīng)用系統(tǒng)本身的優(yōu)化與預(yù)先設(shè)計(jì)系統(tǒng)時(shí)可擴(kuò)性的性能保障等具體內(nèi)容。
通過技術(shù)上的分析與改進(jìn),綜合性地運(yùn)用多類措施與手段,在實(shí)際系統(tǒng)中,Web服務(wù)器運(yùn)行的性能得到了一定程序的保證。
【正文】
我所在的單位是把目標(biāo)定位于金融領(lǐng)域開發(fā)IT應(yīng)用的一家信息技術(shù)公司。隨著金融電子化建設(shè)的發(fā)展和商業(yè)銀行之間市場競爭的加劇,各主要商業(yè)銀行不斷通過信息技術(shù)提供新的金融產(chǎn)品,并且希望整合市場渠道。比如主要的商業(yè)銀行不斷推出形形色色的網(wǎng)上銀行服務(wù)。在這種背景下,本人參與了開發(fā)新一代風(fēng)上銀行產(chǎn)品,涉及提供網(wǎng)上個(gè)人理財(cái)服務(wù)、網(wǎng)上外匯買賣服務(wù)、網(wǎng)上企業(yè)服務(wù)等具有市場競爭力的產(chǎn)品。作為項(xiàng)目開發(fā)的組織者之一和主要的技術(shù)骨干,在整個(gè)項(xiàng)目開發(fā)過程中始終要處于第一線,從而在改進(jìn)Web服務(wù)器性能、提高整個(gè)網(wǎng)上平臺系統(tǒng)性能方面收獲良多,在本文中簡要討論如下,希望與讀者們共享經(jīng)驗(yàn)。在Wet服務(wù)器配置與優(yōu)化方面,我有如下幾方面主要的體會:
第一方面是Web服務(wù)器選型考慮。
在Web服務(wù)器選型及網(wǎng)上平臺搭建這初,我們就已充分考慮整個(gè)網(wǎng)上平臺的性能及可擴(kuò)展性問題,這一考慮為該系統(tǒng)的穩(wěn)定性及擴(kuò)展性能力方面打下了堅(jiān)實(shí)的基礎(chǔ)。
某銀行原有的一些網(wǎng)上產(chǎn)品由于開發(fā)較早,故而采用的是老式的HTTP Server + CGI程序調(diào)用的方式。這時(shí),毎一客戶淸求需要對應(yīng)于后端系統(tǒng)的系統(tǒng)進(jìn)程來運(yùn)行CGI程序來處理,系統(tǒng)的開銷相當(dāng)大,系統(tǒng)的擴(kuò)展能力也很差,性能已不能滿足業(yè)務(wù)處理的需要,故而在為此銀行系統(tǒng)具體選型的時(shí)候,我們一開始就否決了這種方案。
通過市場上同類產(chǎn)品的比較選擇,我們選擇了國際商業(yè)機(jī)器有限公司IBM的Web Sphere產(chǎn)品系列作為該行網(wǎng)上銀行系統(tǒng)的建立平臺。作出這樣選擇是因?yàn)閃eb Sphere基于使HTTPServer和應(yīng)用服務(wù)器相分離的整體架構(gòu),同時(shí)支持JSP、Servlet和企業(yè)級Java Bean等輕重級線程規(guī)范,所有的淸求對應(yīng)于應(yīng)用服務(wù)器上的處理線程,系統(tǒng)的開銷低,效率非常高,同時(shí)Web Sphere整個(gè)體系結(jié)構(gòu)相當(dāng)?shù)撵`活,為適應(yīng)擴(kuò)展需要可以作不同的橫向和縱向擴(kuò)展,從而可以滿足各銀行未來的擴(kuò)展需要。
正是因?yàn)樵谝婚_始選型的時(shí)候我們就已考慮到未來的擴(kuò)展需要,整個(gè)系統(tǒng)在接下來的幾次性能改進(jìn)方面,我們大體上都能相對順利地達(dá)到了預(yù)期目標(biāo)。
第二方面是Web服務(wù)器的性能配置。
在一開始系統(tǒng)上線的時(shí)候,由于系統(tǒng)的負(fù)荷不是很大,為了節(jié)省系統(tǒng)總擁有成本TCO投資,我們在一臺較低配置的IBM RS6000上投產(chǎn)了該系統(tǒng)。整個(gè)系統(tǒng)的HTTP服務(wù)器、應(yīng)用服務(wù)器、通信服務(wù)器等均位于該臺機(jī)器上,由于初始投產(chǎn)時(shí)用戶不多,所以系統(tǒng)的性能基本上能令人接受。
但隨著業(yè)務(wù)的發(fā)展和用戶訪問童的増大,我們發(fā)現(xiàn)該服務(wù)器的響應(yīng)變慢,系統(tǒng)的CPU利用率和內(nèi)外存交換顯著増大。經(jīng)過跟蹤,我們發(fā)現(xiàn)關(guān)鍵原因之一是系統(tǒng)的內(nèi)存不足的緣故。由于網(wǎng)上服務(wù)器把大重用戶的會話信息保存在內(nèi)存中供給應(yīng)用系統(tǒng)使用,當(dāng)內(nèi)存不足時(shí),大M Session信息被迫交換至硬盤,大;量CPU時(shí)間消耗在等候內(nèi)外存的交換上,系統(tǒng)效率迅速下降。
鑒于這種情況,我們把該服務(wù)器的內(nèi)存由2GB擴(kuò)充為4GB,同時(shí)相應(yīng)調(diào)整用戶會話信息的保存時(shí)間,這樣整個(gè)系統(tǒng)的效率又回到較為理想的狀況。
由于新應(yīng)用的不斷投產(chǎn)及數(shù)據(jù)庫操作的日益増加,我們后來逐漸監(jiān)控到系統(tǒng)的數(shù)據(jù)庫處于繁忙狀態(tài),系統(tǒng)的錯(cuò)誤日志也記錄下了供應(yīng)用服務(wù)器使用的數(shù)據(jù)庫連接處出現(xiàn)資源不足的情況。在這種背景下,我們認(rèn)為整個(gè)系統(tǒng)由于硬件配買所限,應(yīng)該進(jìn)行橫向擴(kuò)展,因此我們把數(shù)據(jù)庫服務(wù)器分離出來,配置到另一較高性能的服務(wù)器上,相應(yīng)定義的數(shù)據(jù)庫資源也大幅増加,這樣整個(gè)系統(tǒng)的性髭又處于較為理想的狀況。
第三方面是對應(yīng)用系統(tǒng)進(jìn)行相應(yīng)的優(yōu)化以提高性能。
Web服務(wù)器配置及相應(yīng)的硬件擴(kuò)展不失為解決系統(tǒng)性能問題的一條捷徑,但應(yīng)用系統(tǒng)的優(yōu)化也是應(yīng)該重點(diǎn)加以考慮的,畢竟它能夠在投入較少的情況下提高系統(tǒng)的運(yùn)用效率。
在開發(fā)的初期,我們就已經(jīng)十分注意系統(tǒng)的利用效率,比如提醒程序員盡量不要利用用戶會話信息(Session)來傳送大的對象,對于內(nèi)存要注意回收等。同時(shí),通過內(nèi)部的交流會推廣與介紹一些小的,有用的編程技巧來提高開發(fā)人員的水平,通過代碼的抽查,希望能在早期就發(fā)現(xiàn)問題等。
在系統(tǒng)運(yùn)行期間,我們通過監(jiān)控發(fā)現(xiàn),應(yīng)用服務(wù)器所基于的Java虛擬機(jī),其內(nèi)存堆的空閑空間有不斷下降的趨勢,毎隔若干天導(dǎo)致空間消耗殆盡,無法分配新對象空間,從而導(dǎo)致系統(tǒng)重啟。在排除了系統(tǒng)本身問題的原因外,我們確定為應(yīng)用系統(tǒng)的開發(fā)有問題。通過從網(wǎng)上下載IBM公司檢測Java虛擬機(jī)的相關(guān)工具對JVM進(jìn)行監(jiān)控后終于發(fā)現(xiàn)系統(tǒng)內(nèi)部存在著不能回收內(nèi)存的對象,再通過查找相應(yīng)的程序發(fā)現(xiàn)在該程序中有“環(huán)狀”的對象引用,從而導(dǎo)致對象使用后不能被垃圾收集器所回收。這個(gè)問題的解決過程雖然十分艱苦,但由于該問題不能通過升級硬件或増加資源配買而得到根本解決,會給系統(tǒng)帯來很大的隱患。所以,整個(gè)過程的分析與解決是完全值得的,更何況通過查找故障原因的過程,給整個(gè)項(xiàng)目組上了生動的一堂軟件質(zhì)重保證課,對項(xiàng)目組的質(zhì)量意識起了很大的促進(jìn)作用。所以說改進(jìn)Web服務(wù)器的性能并不單純是系統(tǒng)管理方面的工作,它滲透到開發(fā)以及系統(tǒng)運(yùn)行第一系列環(huán)節(jié)中。
第四方面預(yù)先考慮未來的擴(kuò)展與性能需要。
隨著系統(tǒng)的發(fā)展及成熟,考慮到用戶訪問量的不斷上升,為了預(yù)留系統(tǒng)的發(fā)展空間,我們最近又對整個(gè)系統(tǒng)作了一個(gè)系統(tǒng)性的升級。通過引入多臺HTTP服務(wù)器及應(yīng)用服務(wù)器并行工作提高整個(gè)系統(tǒng)吞吐量及單點(diǎn)故障克服能力。由于在一開始選型的時(shí)候就已經(jīng)充分考慮到動態(tài)負(fù)載均衡及橫向擴(kuò)展方面的需要,這一項(xiàng)的升級無需對整個(gè)系統(tǒng)的體系結(jié)構(gòu)作根本的變革,対應(yīng)用程序來說,更是沒有造成任何影響。
整個(gè)項(xiàng)目歷時(shí)近兩年,從這兩年的系統(tǒng)情況來看,整個(gè)系統(tǒng)是成功的。根據(jù)我親身的經(jīng)歷,系統(tǒng)性能并不單純是系統(tǒng)運(yùn)行與管理階段的問題,而是滲透在項(xiàng)目論證、開發(fā)以及運(yùn)行的各個(gè)階段。只有各個(gè)階段都能充分考慮性能方面的需要,在實(shí)際運(yùn)行時(shí),整個(gè)系統(tǒng)的性能才可能真正有保障。
在技術(shù)方面來看,可以綜合利用選型評估、硬件擴(kuò)展、應(yīng)用優(yōu)化和系統(tǒng)配置優(yōu)化等一系列的手段;比如在硬件擴(kuò)展方面,又可以分為主要部件擴(kuò)容,縱向升級、橫向升級等方面。在我們的項(xiàng)目實(shí)踐中,曾綜合地利用了上述的各種手段。比如某銀行的整個(gè)系統(tǒng)日訪問量不足1萬至現(xiàn)在的毎日超過10萬次以上的點(diǎn)擊的發(fā)展情況來看,整個(gè)系統(tǒng)的性能保障及提高方案是比較成功的。
本文摘自 :https://blog.51cto.com/u