王啟亮
(中國鐵路太原局集團有限公司大同電務段,山西 大同 037005)
路由器是一種重要的網絡互聯設備,具備判斷網絡地址和路徑選擇的功能。從本質上講路由器是一種專用計算機,由CPU、內存、FLASH(閃存,相當于計算機的硬盤)、NVRAM(用于保存路由器的配置)、接口等硬件和操作系統(IOS)組成,其主要任務是接收來自網絡接口的數據包,根據其中所包含的目的地址,從某個合適的接口轉發給下一跳路由器,下一跳路由器也按照這種方法處理數據包,直到該數據包到達目的地為止[1-2]。
電務段TDCS/CTC 網絡和微機監測網絡在2020年10 月份新使用了一批思科2901 路由器,2021 年9月17 日現場兩車站TDCS 路由器先后發生內存不足告警,同時網絡質量變差,登錄路由器變得異常緩慢,嚴重影響TDCS 網絡通道穩定。經過對報警信息分析研究,認定這是一起典型的內存泄漏引起的路由器宕機,并找到了發生故障的根本原因,最后采取了針對性措施,制止了相同故障在其他站路由器上的再次發生,杜絕了安全隱患。
發生故障的路由器為思科2901 系列,配置如下[3]。
內存(DRAM):512 MB
閃存(FLASH):256 MB
操作系統(IOS):c2900-universalk9-mz.SPA.155-1.T2.bin
內存(DRAM)是一種動態隨機存取存儲器,它存儲數據的原理是電容器的電荷效應,當系統掉電時內存中的數據不能得到保存[4]。路由器在啟動時將操作系統(IOS)從閃存(FLASH)中加載到內存中并建立它的數據結構之后,剩下的內存被分成兩部分:處理器內存(Processor Memory)和數據包內存(I/O Memory)。處理器內存用來存儲路由表、ARP 緩存、運行配置和進程數據。數據包內存用作緩存,用于在處理數據包之前的臨時存儲[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]:指受內存不足影響的進程;
Alternate:可替換的,備用的;
[Processor]:指示處理器內存("Pool Processor")還是數據包內存("Pool I/O")受到影響,這里指示處理器內存("Pool Processor")受到影響;
Memory fragmentation:內存碎片;
[X]:路由器嘗試分配的字節數,但找不到足夠的可用內存執行該操作[7-8]。
從告警分析得知:由于內存碎片化,雖然剩余內存總量足夠,但不足以分配出整塊空間給進程“qos_mon_periodic”,這是一種處理器內存不足引起的宕機。
我們選擇和故障路由器同一批次思科2901 路由器進行處理器內存占用跟蹤,結果如圖1 和表2 所示。

圖1 同一批次思科2901 路由器內存占用

表2 同一批次思科2901 路由器內存占用跟蹤
跟蹤結果表明,同批次思科2901 路由器內存正在泄漏,進程“qos_mon_periodic”占用了大量處理器內存得不到釋放,并且還在進一步占用新的內存,處理器內存余量在逐漸減少。當處理器內存余量不足以滿足進程“qos_mon_periodic”繼續增加的內存需要時就發生內存告警,進而引發路由器宕機。
我們選擇和故障路由器相同型號不同批次思科2901 路由器進行處理器內存占用跟蹤,如圖2 所示,發現不同批次的思科2901 路由器處理器內存余量基本保持不變,未發生內存泄漏,并且進程中未發現有“qos_mon_periodic”進程。

圖2 不同批次思科2901 路由器內存占用
“qos_mon_periodic”是與QoS(服務質量,用來解決網絡延遲和阻塞等問題的一種技術)相關的進程,電務段路由器中并沒有配置QoS 服務,也沒有開啟此進程。經檢查,故障路由器及同批次路由器與不同批次思科2901 路由器硬件配置完全一樣,唯有操作系統不同。故障路由器及同批次其他思科2901 路由器所使用操作系統為c2900-universalk9-mz.SPA.155-1.T2.bin,而其他不同批次思科2901 路由器沒有一個與故障路由器操作系統相同。可以推斷,進程“qos_mon_periodic”自動運行并不斷侵占系統內存,是思科2901 系列路由器c2900-universalk9-mz.SPA.155-1.T2.bin 操作系統的一大漏洞。
(1)重啟路由器。根據內存(DRAM)掉電時不保存數據的原理,當思科2901 系列路由器發生“qos_mon_periodic”進程占用內存,導致內存不足告警的時候,作為應急故障處置的方法可以及時重啟路由器,使內存得到及時釋放。如圖3、圖4 所示,重啟路由器之后,處理器內存空間得以恢復,路由器運行流暢、穩定。但重啟路由器之后進程“qos_mon_periodic”仍然存在,又重新開始不斷吞噬內存空間。

圖3 重啟路由器前內存占用

圖4 重啟路由器5 小時后內存占用
(2)升級操作系統。思科2901 系列路由器發生“qos_mon_periodic”進程吞噬內存的根本原因為T2 版本的操作系統存在漏洞,我們從思科技術支持網站下載了穩定的M7 版本操作系統c2900-universalk9-mz.SPA.151-4.M7.bin。經過篩查,對本單位26 臺T2 版本操作系統的思科2901 系列路由器進行了系統升級。如圖5、圖6 所示,升級操作系統之后,處理器內存空間得以恢復,進程“qos_mon_periodic”消失,內存空間余量保持恒定,路由器運行穩定。

圖5 升級操作系統前路由器內存占用

圖6 升級操作系統后路由器內存占用
采取上述措施后,思科2901 系列路由器運行流暢、穩定,內存空間余量保持恒定,無內存泄漏告警發生,隱患得到有效根除。TDCS/CTC 和微機監測系統的穩定運行為鐵路高效安全運輸提供了有力的支撐。