王啟亮
(中國鐵路太原局集團(tuán)有限公司大同電務(wù)段,山西 大同 037005)
路由器是一種重要的網(wǎng)絡(luò)互聯(lián)設(shè)備,具備判斷網(wǎng)絡(luò)地址和路徑選擇的功能。從本質(zhì)上講路由器是一種專用計(jì)算機(jī),由CPU、內(nèi)存、FLASH(閃存,相當(dāng)于計(jì)算機(jī)的硬盤)、NVRAM(用于保存路由器的配置)、接口等硬件和操作系統(tǒng)(IOS)組成,其主要任務(wù)是接收來自網(wǎng)絡(luò)接口的數(shù)據(jù)包,根據(jù)其中所包含的目的地址,從某個(gè)合適的接口轉(zhuǎn)發(fā)給下一跳路由器,下一跳路由器也按照這種方法處理數(shù)據(jù)包,直到該數(shù)據(jù)包到達(dá)目的地為止[1-2]。
電務(wù)段TDCS/CTC 網(wǎng)絡(luò)和微機(jī)監(jiān)測(cè)網(wǎng)絡(luò)在2020年10 月份新使用了一批思科2901 路由器,2021 年9月17 日現(xiàn)場(chǎng)兩車站TDCS 路由器先后發(fā)生內(nèi)存不足告警,同時(shí)網(wǎng)絡(luò)質(zhì)量變差,登錄路由器變得異常緩慢,嚴(yán)重影響TDCS 網(wǎng)絡(luò)通道穩(wěn)定。經(jīng)過對(duì)報(bào)警信息分析研究,認(rèn)定這是一起典型的內(nèi)存泄漏引起的路由器宕機(jī),并找到了發(fā)生故障的根本原因,最后采取了針對(duì)性措施,制止了相同故障在其他站路由器上的再次發(fā)生,杜絕了安全隱患。
發(fā)生故障的路由器為思科2901 系列,配置如下[3]。
內(nèi)存(DRAM):512 MB
閃存(FLASH):256 MB
操作系統(tǒng)(IOS):c2900-universalk9-mz.SPA.155-1.T2.bin
內(nèi)存(DRAM)是一種動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器,它存儲(chǔ)數(shù)據(jù)的原理是電容器的電荷效應(yīng),當(dāng)系統(tǒng)掉電時(shí)內(nèi)存中的數(shù)據(jù)不能得到保存[4]。路由器在啟動(dòng)時(shí)將操作系統(tǒng)(IOS)從閃存(FLASH)中加載到內(nèi)存中并建立它的數(shù)據(jù)結(jié)構(gòu)之后,剩下的內(nèi)存被分成兩部分:處理器內(nèi)存(Processor Memory)和數(shù)據(jù)包內(nèi)存(I/O Memory)。處理器內(nèi)存用來存儲(chǔ)路由表、ARP 緩存、運(yùn)行配置和進(jìn)程數(shù)據(jù)。數(shù)據(jù)包內(nèi)存用作緩存,用于在處理數(shù)據(jù)包之前的臨時(shí)存儲(chǔ)[5-6]。
路由器告警信息見表1。
表1 路由器主要告警信息
17321:-Process="[Process]",ipl=0,pid=336
17320:Alternate Pool:None Free:0 Cause:No Alternate pool
17319:Pool:[Processor] Free:124304 Cause:Memory fragmentation
17318:%SYS-2-MALLOCFAIL:Memory allocation of [X] bytes failed from 0x3002A7C0,alignment 0
[Process]:指受內(nèi)存不足影響的進(jìn)程;
Alternate:可替換的,備用的;
[Processor]:指示處理器內(nèi)存("Pool Processor")還是數(shù)據(jù)包內(nèi)存("Pool I/O")受到影響,這里指示處理器內(nèi)存("Pool Processor")受到影響;
Memory fragmentation:內(nèi)存碎片;
[X]:路由器嘗試分配的字節(jié)數(shù),但找不到足夠的可用內(nèi)存執(zhí)行該操作[7-8]。
從告警分析得知:由于內(nèi)存碎片化,雖然剩余內(nèi)存總量足夠,但不足以分配出整塊空間給進(jìn)程“qos_mon_periodic”,這是一種處理器內(nèi)存不足引起的宕機(jī)。
我們選擇和故障路由器同一批次思科2901 路由器進(jìn)行處理器內(nèi)存占用跟蹤,結(jié)果如圖1 和表2 所示。
圖1 同一批次思科2901 路由器內(nèi)存占用
表2 同一批次思科2901 路由器內(nèi)存占用跟蹤
跟蹤結(jié)果表明,同批次思科2901 路由器內(nèi)存正在泄漏,進(jìn)程“qos_mon_periodic”占用了大量處理器內(nèi)存得不到釋放,并且還在進(jìn)一步占用新的內(nèi)存,處理器內(nèi)存余量在逐漸減少。當(dāng)處理器內(nèi)存余量不足以滿足進(jìn)程“qos_mon_periodic”繼續(xù)增加的內(nèi)存需要時(shí)就發(fā)生內(nèi)存告警,進(jìn)而引發(fā)路由器宕機(jī)。
我們選擇和故障路由器相同型號(hào)不同批次思科2901 路由器進(jìn)行處理器內(nèi)存占用跟蹤,如圖2 所示,發(fā)現(xiàn)不同批次的思科2901 路由器處理器內(nèi)存余量基本保持不變,未發(fā)生內(nèi)存泄漏,并且進(jìn)程中未發(fā)現(xiàn)有“qos_mon_periodic”進(jìn)程。
圖2 不同批次思科2901 路由器內(nèi)存占用
“qos_mon_periodic”是與QoS(服務(wù)質(zhì)量,用來解決網(wǎng)絡(luò)延遲和阻塞等問題的一種技術(shù))相關(guān)的進(jìn)程,電務(wù)段路由器中并沒有配置QoS 服務(wù),也沒有開啟此進(jìn)程。經(jīng)檢查,故障路由器及同批次路由器與不同批次思科2901 路由器硬件配置完全一樣,唯有操作系統(tǒng)不同。故障路由器及同批次其他思科2901 路由器所使用操作系統(tǒng)為c2900-universalk9-mz.SPA.155-1.T2.bin,而其他不同批次思科2901 路由器沒有一個(gè)與故障路由器操作系統(tǒng)相同??梢酝茢?,進(jìn)程“qos_mon_periodic”自動(dòng)運(yùn)行并不斷侵占系統(tǒng)內(nèi)存,是思科2901 系列路由器c2900-universalk9-mz.SPA.155-1.T2.bin 操作系統(tǒng)的一大漏洞。
(1)重啟路由器。根據(jù)內(nèi)存(DRAM)掉電時(shí)不保存數(shù)據(jù)的原理,當(dāng)思科2901 系列路由器發(fā)生“qos_mon_periodic”進(jìn)程占用內(nèi)存,導(dǎo)致內(nèi)存不足告警的時(shí)候,作為應(yīng)急故障處置的方法可以及時(shí)重啟路由器,使內(nèi)存得到及時(shí)釋放。如圖3、圖4 所示,重啟路由器之后,處理器內(nèi)存空間得以恢復(fù),路由器運(yùn)行流暢、穩(wěn)定。但重啟路由器之后進(jìn)程“qos_mon_periodic”仍然存在,又重新開始不斷吞噬內(nèi)存空間。
圖3 重啟路由器前內(nèi)存占用
圖4 重啟路由器5 小時(shí)后內(nèi)存占用
(2)升級(jí)操作系統(tǒng)。思科2901 系列路由器發(fā)生“qos_mon_periodic”進(jìn)程吞噬內(nèi)存的根本原因?yàn)門2 版本的操作系統(tǒng)存在漏洞,我們從思科技術(shù)支持網(wǎng)站下載了穩(wěn)定的M7 版本操作系統(tǒng)c2900-universalk9-mz.SPA.151-4.M7.bin。經(jīng)過篩查,對(duì)本單位26 臺(tái)T2 版本操作系統(tǒng)的思科2901 系列路由器進(jìn)行了系統(tǒng)升級(jí)。如圖5、圖6 所示,升級(jí)操作系統(tǒng)之后,處理器內(nèi)存空間得以恢復(fù),進(jìn)程“qos_mon_periodic”消失,內(nèi)存空間余量保持恒定,路由器運(yùn)行穩(wěn)定。
圖5 升級(jí)操作系統(tǒng)前路由器內(nèi)存占用
圖6 升級(jí)操作系統(tǒng)后路由器內(nèi)存占用
采取上述措施后,思科2901 系列路由器運(yùn)行流暢、穩(wěn)定,內(nèi)存空間余量保持恒定,無內(nèi)存泄漏告警發(fā)生,隱患得到有效根除。TDCS/CTC 和微機(jī)監(jiān)測(cè)系統(tǒng)的穩(wěn)定運(yùn)行為鐵路高效安全運(yùn)輸提供了有力的支撐。