李 琪,劉相坤,李聚寶,武振華
(中國鐵道科學研究院電子計算技術研究所,北京100081)
鐵路客票系統(tǒng)自1996年啟動以來,經過5次大版本的升級改進,基本滿足了用戶的需求。系統(tǒng)為鐵道部、地區(qū)中心、車站三級分布式系統(tǒng),在5.0版本后采用應用服務器和負載均衡技術加強了對用戶請求的處理。目前一些小站采用取消車站服務器模式或大站帶小站模式,所以系統(tǒng)的業(yè)務和數(shù)據(jù)壓力集中體現(xiàn)在鐵道部、地區(qū)中心和大站的服務器上。為了滿足不斷膨脹的業(yè)務和數(shù)據(jù)要求,已對硬件資源做過幾次大的升級改造??推毕到y(tǒng)是鐵路運輸?shù)闹匾到y(tǒng),它的穩(wěn)定運行極為重要,每到節(jié)假日售票高峰時間系統(tǒng)的壓力非常大。在維護使用中,系統(tǒng)優(yōu)化一直在進行,不斷增加的需求和多年數(shù)據(jù)的累積對于優(yōu)化非常迫切,所以更加深入、有效、全面地對系統(tǒng)優(yōu)化尤為重要。
本文結合多年對客票系統(tǒng)的開發(fā)、實施和維護的工作經驗和體會,對系統(tǒng)性能的優(yōu)化進行了深入探討。
系統(tǒng)調優(yōu)應該是一個不斷提升的過程。由于應用需求和數(shù)據(jù)是動態(tài)變化的,所以系統(tǒng)調優(yōu)也是一個循環(huán)螺旋上升的過程。圖1是在實踐摸索中提出并采用的一種策略方法。
圖1 調優(yōu)策略示意圖
出現(xiàn)問題的時候一定要在較快的時間內通過工具或命令將各可能的現(xiàn)場環(huán)境記錄,這時的記錄數(shù)據(jù)最真實,也對解決問題最有用。真正要維護好一個系統(tǒng),就應在出現(xiàn)問題之前,通過日常監(jiān)控記錄現(xiàn)場,記錄積累發(fā)現(xiàn)潛在的問題。目前客票系統(tǒng)監(jiān)控軟件已經使用操作系統(tǒng)、數(shù)據(jù)庫等的命令每隔固定時間收集系統(tǒng)運行情況,并上傳到管理機,展現(xiàn)形式也很豐富和直觀。
操作系統(tǒng)、數(shù)據(jù)庫、網(wǎng)絡、應用服務器、應用程序等方面都可能是問題所在,但要最快確定問題環(huán)節(jié),不能漫無目的,應該制定檢查問題的正確順序。一般業(yè)務請求反饋流程是:應用前臺反映→應用系統(tǒng)→網(wǎng)絡線路和交換設備→主機系統(tǒng)→數(shù)據(jù)庫系統(tǒng),制定順序應該從暴露問題的環(huán)節(jié)開始向后逐步檢查。如果曾經發(fā)生過類似情況,根據(jù)經驗能夠直接定位問題,也是最迅速的途徑。如果應用上并未發(fā)現(xiàn)問題,而是系統(tǒng)日志或監(jiān)控結果等地方出現(xiàn)的警告或錯誤,就需要根據(jù)出錯地方提前解決潛在的問題,這也可能是一個綜合性質的問題。
有些問題容易準確定位,直接解決即可;但有的問題可能是多個環(huán)節(jié)錯綜復雜的綜合性難題,這樣在短時間內很難準確定位問題所在,就需要跟蹤問題重現(xiàn)的規(guī)律。
在現(xiàn)場生產環(huán)境中出現(xiàn)的問題,不是都能在生產環(huán)境中有規(guī)律的重現(xiàn),為了定位問題,往往需要在模擬環(huán)境中創(chuàng)造條件重現(xiàn)問題。通過在測試環(huán)境中調整系統(tǒng)的參數(shù)等方法,再經過反復模擬測試,為確定調優(yōu)方案做好準備。
在前面的環(huán)節(jié)中如果能夠重現(xiàn)問題,則針對所在環(huán)節(jié)調整原有調優(yōu)方案;如果不能重現(xiàn)問題,也不能等待這樣的問題在生產環(huán)境中再現(xiàn),那樣可能給生產帶來嚴重的影響,所以也需要根據(jù)現(xiàn)場跟蹤的結果和經驗制定調優(yōu)方案。
在前面已經做了大量、充分準備工作的基礎上,這時就可以對實際生產系統(tǒng)做優(yōu)化實施。
上面6個步驟是一個系統(tǒng)調優(yōu)的周期,但并不意味著在一個周期內所有問題都可以解決,往往復雜的問題需要經過幾個周期的觀察、測試和調整才能真正解決。
通過詢問客票系統(tǒng)的各級業(yè)務人員了解情況,是最為直接的監(jiān)控手法。這對于日常業(yè)務的處理速度和穩(wěn)定性有直觀的體現(xiàn),但是存在時間滯后的問題。
對操作系統(tǒng)、數(shù)據(jù)庫、網(wǎng)絡、應用服務器和應用程序等的日志監(jiān)控,可以查看系統(tǒng)的一些警告和錯誤信息,從中發(fā)現(xiàn)錯誤或潛在的問題。
使用一些系統(tǒng)命令可以抓取系統(tǒng)運行過程中使用資源的情況,與實際情況對比,也可與同時期類似情況對比,爭取提前發(fā)現(xiàn)問題。操作系統(tǒng)一級資源的監(jiān)控,HP中可以使用top,IBM中使用topas或nmon;數(shù)據(jù)庫中使用sp_sysmon監(jiān)控資源,使用dbcc檢查數(shù)據(jù)庫和表是否存在問題。
通過dbcc traceon(3604),dbcc sqltext(spid)可以查看正在工作的進程的內容。
使用sp_monitorconfig可以查看數(shù)據(jù)庫參數(shù)使用情況。
通過客票系統(tǒng)監(jiān)控軟件不僅能查看剛剛發(fā)生過的資源情況,還可以查看歷史使用情況,通過類似情況的對比分析也是有效的方法。
內存是系統(tǒng)性能的關鍵因素。對內存使用和管理是否合理既影響系統(tǒng)的安全,也影響系統(tǒng)的性能。在實際使用中也出現(xiàn)過因共享內存配置不當,導致系統(tǒng)越來越慢,直至死機無法正常使用的情況。
全路客票系統(tǒng)中出現(xiàn)過因為內存分配不當導致業(yè)務受到影響的實例。在實際配置資源時,經常出現(xiàn)按照一定的比例配置數(shù)據(jù)庫所用最大內存,其實這樣做在內存較大的情況下一般不會出現(xiàn)問題。但是在內存較小的情況下按照比例粗略計算來配置,就會出現(xiàn)數(shù)據(jù)庫所用內存過多,導致系統(tǒng)可用內存不夠,最后系統(tǒng)會將數(shù)據(jù)庫內存轉到虛擬內存(磁盤交換分區(qū))上,這樣系統(tǒng)就會變得越來越慢。所以合理的配置應該對資源精打細算。
客票系統(tǒng)對內存分配的調優(yōu)原則:
主機系統(tǒng)的物理內存總數(shù)用M表示,系統(tǒng)占用內存用S表示,文件系統(tǒng)占用內存用F表示,復制占用內存用R表示,備份服務器使用內存用B表示,后臺應用使用內存用H表示,臨時維護命令或操作使用內存用C表示,數(shù)據(jù)庫可用的最大內存用SM表示,由此得出:
由式(1)計算出的內存配置,不會因為現(xiàn)有的某一方面占用過多導致系統(tǒng)不夠用而變慢。當然,如果出現(xiàn)新增加業(yè)務可能改變內存的平衡,就應該重新計算并做出新的優(yōu)化配置。
與內存配置相關的磁盤交換分區(qū)的配置也很重要,雖然將內存里的東西轉到交換分區(qū)上會變慢,但是可以保證數(shù)據(jù)完整。一般配置大小為物理內存的1.5倍以上,根據(jù)實際需要可作出調整。
tempdb為臨時表和其他臨時工作空間提供一個存儲區(qū)域。當做order by、group by、distinct和創(chuàng)建臨時表等操作時將使用tempdb的空間。經常引起tempdb問題的可能原因是:tempdb被頻繁填滿、系統(tǒng)表被鎖定、數(shù)據(jù)頁被刷新出緩存等。
根據(jù)實際調優(yōu)經驗,可以通過以下方法解決相關問題:
(1)擴展tempdb的空間,這樣可以減緩被頻繁填滿和刷新出緩存。估計tempdb的大小主要靠經驗和監(jiān)測來調整。
(2)tempdb要盡可能擴展到獨立設備上,這樣就不會與關鍵應用發(fā)生爭用。但是缺省情況下,tempdb的一些段在master數(shù)據(jù)庫設備上,當擴展到新設備后,可以從master設備中刪除這些段,以后所有臨時表就會只在新的設備上創(chuàng)建,避免了跨多個設備的問題。
(3)把tempdb整個放在RAM 驅動器或固態(tài)存儲設備上,提高tempdb的i/o速度,這樣可以減輕封鎖競爭。
(4)設置多個tempdb。實際應用中常常會出現(xiàn)并發(fā)性處理事物過多導致爭用系統(tǒng)表,導致鎖表的情況,現(xiàn)在經常采用這一辦法來解決。
(5)把tempdb綁定到自己的命名緩存。在創(chuàng)建、使用和刪除臨時表時會頻繁地使用default data cache,為避免與其它對象的沖突,最好把tempdb捆綁到命名緩沖。
以上方法在使用中可根據(jù)實際情況,選擇其中幾個,達到性能調整需要即可。在維護中了解到,因為價格等原因使用固態(tài)存儲的并不多,所以可選擇上面D方法也基本可以減輕封鎖競爭。
鎖在系統(tǒng)運行中起著很重要的作用,鎖相關參數(shù)的配置以及應用在鎖機制下的開發(fā)和維護都可能影響系統(tǒng)的運行。不同類型的鎖都各有優(yōu)缺點,現(xiàn)在客票系統(tǒng)中很多重要的表改為行級鎖,起到很好的效果。
根據(jù)業(yè)務特點和鎖的作用綜合考慮,應該統(tǒng)籌考慮,做出優(yōu)化配置。Sybase數(shù)據(jù)庫缺省使用頁級鎖,通過對不同類型鎖的配置實現(xiàn)封鎖和并發(fā)的平衡,以下幾點作為參考:
(1)一般情況下Sybase數(shù)據(jù)庫能自動發(fā)現(xiàn)并解除死鎖,但是在實際使用中也出現(xiàn)死鎖保留較長時間而影響應用,所以應該盡可能避免死鎖。為盡可能降低封鎖競爭和避免死鎖出現(xiàn),事務應縮小且應盡快提交;工作流任務(自動后臺執(zhí)行的操作)應盡可能避開使用相同表的大事物同時操作;在業(yè)務處理高峰期間減少人工維護操作;加強監(jiān)控及時手工殺掉不重要的進程。
(2)在搜索變量上沒有索引就會引起表級鎖,在大表上造成表掃描會嚴重影響業(yè)務性能,所以要充分挖掘業(yè)務需求,盡可能定義正確的索引。
(3)對鎖升級的控制會直接影響使用。鎖升級閾值用于設置升級到對象上的表鎖之前,所允許的鎖的個數(shù)。鎖升級是針對單一搜索而言的,當一次搜索的鎖多于鎖升級閾值時,鎖就會升級??捎?個參數(shù)進行升級控制:page lock promotion HWM、page lock promotion LWM、page lock promotion PCT。
(4)鎖升級閥值的設定需要根據(jù)資源和應用來確定。鎖升級閥值低,易于產生表級鎖,降低了并發(fā)度,嚴重時會影響應用的連續(xù)性;鎖升級閥值高,可提高并發(fā)度,但需要足夠的鎖個數(shù),資源開銷大。綜合考慮,現(xiàn)在內存空間相對大一些,可以把鎖的個數(shù)設置大一些,鎖升級閥值設置高一些。
隨著服務器處理能力的增強,應該將內存等關鍵資源用在最需要用的地方。實踐中發(fā)現(xiàn)表資源爭用長期存在,往往成為性能的瓶頸。所以對于關鍵表配置命名緩存很重要,可以減少爭用。例如對syslogs、seat_area、left_base_center等表在一些鐵路局配置了命名緩存后效果很好。
當前的客票數(shù)據(jù)庫服務器的cpu配置有很多個,這可以解決并發(fā)請求在cpu方面的壓力,但是隨著可用資源的不斷擴大,需要在參數(shù)配置方面優(yōu)化,否則不僅起不到加速效果,還會造成新的瓶頸。一般主要需要注意以下兩個方面:
(1)如果cpu數(shù)量為n且大于2,數(shù)據(jù)庫引擎一般可以考慮配置在可用cpu數(shù)量的80%左右,但在初期可以多留幾個給系統(tǒng)用,也可在以后增加引擎數(shù)量。
(2)“global cache partition number”參數(shù)應該隨著引擎的個數(shù)調整,一般配置為大于引擎數(shù)且最接近引擎數(shù)的2的冪。例如引擎數(shù)位15,該參數(shù)配置為16。
現(xiàn)在的應用數(shù)據(jù)越來越龐大,多個業(yè)務同時訪問一張表很常見,在cpu并發(fā)處理能力得到很大改善的情況下,設備訪問IO情況的問題突現(xiàn)出來,通過分區(qū)可以得到部分緩解。
通過把最常用的表分區(qū),通過一定的規(guī)則放在多個設備上,從而改善多個并發(fā)訪問時的IO性能?,F(xiàn)在有的鐵路局將seat_area表做了分區(qū),效果比較好。
系統(tǒng)的優(yōu)化是需要長期不斷進行的,并根據(jù)需要逐步調整,一般經過幾個不同業(yè)務流量周期后,系統(tǒng)對于資源的使用范圍相對固定下來。如果業(yè)務量在某個時期突然增大,應適時作出相應調整。合理配置各項資源,達到相互協(xié)調,才能使整個客票系統(tǒng)性能最佳。
[1] 楊孝如,徐任,李立,彭立軍. Sybase數(shù)據(jù)庫系統(tǒng)管理指南[M] . 北京:中國水利水電出版社,1997.
[2] 客票系統(tǒng)5.0技術手冊[S] . 北京:中國鐵道出版社,2006.