先分清楚成長 積壓與洩漏
服務連續運作一晚,記憶體從兩百MB變成三百MB,先別急著寫記憶體洩漏。快取暖機、負載增加、尚未處理資料與無法釋放的物件,都可能造成成長。耐久測試的第一步是控制工作量並定義可比較狀態,讓成長原因有機會被分開。
本文適用於採集服務、通訊閘道軟體與資料處理程序的耐久驗證。Python的tracemalloc只作記憶體配置追蹤範例,不能代表所有原生函式庫、作業系統或PLC內部記憶體。各執行環境須選擇相應工具,並記錄工具本身的監測成本。
先訂一個完整工作循環,例如連線、接收一千筆、確認保存、斷線、等待佇列清空。每個循環使用相同資料大小分布與唯一識別,取相同階段的資源數值比較。若一次取處理高峰、另一次取空閒,就算曲線上升也難以判讀。
定義三種指標:程序記憶體的觀測值、仍被追蹤的物件或配置量、待處理佇列深度與年齡。它們不必同步變化。程序占用未下降,可能是配置器保留可重用空間;佇列持續增加,則可能只是處理率低於到達率,還需進一步證據。
設計跨越週期作業的測試時間
先盤點日切檔案、定時備份、憑證更新、連線重建與批次報表的週期,再安排測試跨過相關邊界。只跑兩小時無法覆蓋每天一次的日切;即使跑七天,若刻意關掉所有背景工作,也無法代表實際整合環境。
示例先暖機一小時,再執行二十四個相同循環,每小時記錄循環結束且佇列清空後的基線,同時保留每循環尖峰。暖機結束條件要事先規定,不能看到後段持續上升就不斷延長暖機,直到把所有問題排除在統計範圍外。
除了穩定流量,加入斷線後重連、短暫資料庫不可用與恢復排空的循環。這些動作可能留下未取消的計時器、回呼或連線。一次故障後資源回復正常,不代表重複百次仍然正常,應把循環次數與失敗次數都列入結果。
監測至少包含程序重啟識別與系統時間基準。中途程序崩潰重啟會讓記憶體突然下降,不能當成自動回收成功。若平台會自動重啟服務,報告須列重啟原因、次數及資料影響,不能只展示平滑後的平均曲線。
用基線斜率與積壓年齡找問題
假設暖機後四個相同空閒基線為二百、二百一十、二百二十、二百三十MB,每次相隔一小時,這一段平均成長約每小時十MB。它是需要追查的趨勢,不是已證明的洩漏率,也不能保證未來永遠線性成長。
接著比較相同條件下的物件數或配置快照。Python tracemalloc可比較兩份快照的配置差異,但只看得到其追蹤範圍,也無法補回開始追蹤以前的完整配置歷史。若程序記憶體增加而快照沒有相應增加,應查追蹤範圍及原生資源,而不是宣稱沒有問題。
佇列深度從一千降到一百時,最老事件仍可能等了三小時。若某一筆一直重試並阻擋後續,平均年齡可能掩蓋它。將深度、最老年齡、重試分布與無法處理事件數一起觀察,再核對它們是否在恢復後回到預定狀態。
到達每秒一百二十筆而處理每秒一百筆,十分鐘理想增加一萬二千筆。這是每秒二十筆的容量缺口累積,不應直接叫作佇列洩漏。停止新增後若仍有大量已成功事件無法移除,才需要追查確認與清除機制。
設定可驗收的界線與診斷步驟
用需求設定上限,例如在指定負載與二十四小時期間不得超過配置記憶體、恢復後在指定時間內清空可處理事件、不得無故重啟。基線成長容許值需要參考可用容量與量測雜訊,不能把本篇示例數字直接套到所有主機。
失敗時先檢查輸入量與資料大小是否改變,再查待處理事件與快取是否有預定上限,接著比對相同階段的資源快照。若發現某類物件數隨連線循環只增不減,保存建立與釋放路徑,交給開發者重現;不要先靠定時重啟把證據清掉。
保留原始取樣而不只保存趨勢圖片,並記錄取樣間隔與缺測。每分鐘取一次可能看不到短暫峰值,不能據此宣稱從未超過上限;若上限影響服務,應增加適合的峰值觀測方法。
修正後使用相同測試腳本、資料與量測階段重跑,再加入先前觸發問題的循環。一次降低記憶體峰值不等於修好持續成長;應看每循環基線是否穩定及資料是否完整,避免以丟棄工作換取較低占用。
完成後應取得有起訖、負載、重啟標記與背景作業註記的曲線,並能區分容量不足與疑似資源未釋放。若只有趨勢尚未定位,結論就寫待查,附上下一步量測。
練習與常見問題
練習:三個相同循環的空閒記憶體都約二百MB,但尖峰為三百、四百、五百MB;檢查是否每循環資料量不同。另一組基線每次增加五MB且連線物件每次多一個,應保存快照與連線生命週期,作為疑似未釋放的線索。
驗收紀錄附上測試未涵蓋的最長週期。測試一天而憑證更新每月發生,就明列尚未覆蓋更新流程,另用可控演練補證據;不能因為服務一天沒當機就寫全部長期情境通過。
問:記憶體沒有回到啟動值就是洩漏嗎?答:不一定,要排除快取、配置器保留與工作量差異。
問:佇列沒有變長就一定健康嗎?答:還要看最老年齡、丟棄與重試,固定容量佇列可能一直丟資料。
問:每天自動重啟可以算耐久通過嗎?答:若需求允許該維運策略,須明列服務中斷和資料影響,不能宣稱程序可無限連續運行。
問:快照能證明沒有任何洩漏嗎?答:只能提供該工具與時間範圍內的證據,還要結合其他資源及重複循環觀察。
參考:Python tracemalloc官方文件:配置追蹤與快照差異比較。