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