Python 記憶體分析助手

👤 嘟嘟喂杜杜 📦 v1.0.0 ⭐ 4.4 ⬇️ 33 下載
🔒 IT運維與安全 免費

📖 技能介紹


slug: python-memory-profile-cn name: python-memory-profile-cn displayName: Python 記憶體分析助手 summary: 用可重複負載、記憶體區域和分配棧證據定位 Python 程序增長、峰值與洩漏。 description: 用於 Python 服務、指令碼、資料任務和擴充套件模組的常駐記憶體持續增長、週期性峰值、程序被殺、容器超限、疑似洩漏或分配熱點。先固定直譯器、平臺、負載與取樣口徑,區分託管物件、原生擴充套件、對映檔案、快取、子程序和分配器行為,再用時間線、分配棧、存活差分和相同負載前後對照驗證根因與修復;不把單次高佔用或常駐集不回落直接判為洩漏。 version: 1.0.0 license: MIT homepage: https://skillhub.cn tags: [Python, 記憶體分析, 記憶體洩漏, 效能排錯]


Python 記憶體分析助手

能力定位

把“Python 越跑越吃記憶體”拆成可觀察的記憶體區域、分配來源、生命週期和負載關係。目標是證明哪些分配在什麼條件下持續存活,並選擇不會扭曲現場的採集方式。

適合 Web 服務、非同步任務、科學計算、資料處理、佇列消費者和包含原生擴充套件的程式。預設先診斷,再建議最小修復。

快速導航

  • 不知道該採哪類證據:讀取 capture-selection.md
  • 已修改程式碼,需要證明修好:讀取 leak-verification.md
  • 常駐記憶體高但物件不多:檢查原生分配、對映檔案、分配器與子程序
  • 只在大檔案或批任務出現:按階段觀察峰值和物件釋放
  • 容器被系統終止:同時核對容器限制、工作集和節點壓力

新手30秒入門

提供 Python 與作業系統版本、啟動命令、部署方式、復現負載、記憶體曲線、程序和子程序關係、最近變更,以及是否使用陣列、資料框、影像、機器學習或 C/C++ 擴充套件。

先返回症狀分型、最小復現、低開銷採集方案和通過條件。不要先強制垃圾回收或重啟,因為它們會改變時間線。

功能索引

任務 核心產出
症狀分型 洩漏、峰值、快取、碎片、複製或容量不足
負載建模 請求、批次、併發、輸入大小與階段
區域拆分 Python 堆、原生堆、對映、執行緒、子程序
分配定位 分配棧、大小、次數、生命週期和所有者
存活差分 基線、階段後、靜置後的持續增長物件
修復評估 釋放、流式化、複用、限界和所有權調整
迴歸門禁 斜率、峰值、吞吐、延遲和重複執行

標準工作流

1. 定義失敗表現

記錄是常駐集持續上升、單批峰值過高、週期後不回落、延遲隨記憶體惡化,還是被系統終止。明確指標口徑、單位、取樣間隔和時間範圍。

2. 固定執行環境

鎖定直譯器、依賴、擴充套件模組、作業系統、容器限制、程序模型、執行緒數和啟動引數。開發環境與生產環境的分配器和負載不同,不能直接類推。

3. 建立可重複負載

控制輸入大小、併發、預熱、快取、網路響應和迭代次數。對服務使用固定請求序列,對批任務按階段打點,至少覆蓋預熱、穩定和問題出現三個區間。

4. 繪製程序記憶體地圖

同時觀察常駐集、虛擬記憶體、共享頁、子程序和容器工作集。標記 Python 物件、原生庫、記憶體對映、緩衝區、執行緒棧和外部程序可能佔據的區域。

5. 選擇採集粒度

先用低開銷時間線確認增長與負載關係,再在最小復現上採集分配棧或物件差分。是否跟蹤原生呼叫、全量分配或子程序必須按假設選擇,避免採集本身改變結果。

6. 建立分配與存活證據

按呼叫路徑彙總分配位元組和次數,並比較階段前後仍存活的物件或塊。大分配熱點不一定是洩漏;關鍵是是否超過預期生命週期且隨重複負載累積。

7. 檢查所有權與限界

追蹤全域性容器、快取、閉包、回撥、任務佇列、生成器、異常追蹤、迴圈引用、執行緒本地和連線池。檢查快取是否有容量與淘汰,任務結果是否被消費,批次中間量是否被同時保留。

8. 區分釋放與回收可見性

物件已不可達不代表常駐集立即下降,分配器可能保留記憶體供後續複用。通過相同負載的穩定平臺、分配數量和長期斜率判斷,不以工作管理員單點作為唯一證據。

9. 設計最小修復

優先修正生命週期、清理引用、設定快取上限、流式讀取、分塊計算、避免隱式複製或複用緩衝。只有確認分配器或擴充套件問題時才調整執行引數或替換元件。

10. 同條件迴歸

使用同一環境、輸入、併發、預熱和迭代次數比較修復前後。驗證記憶體斜率和峰值,同時檢查吞吐、延遲、CPU、I/O 與結果正確性,防止用效能退化換取表面下降。

輸出規範

預設輸出:

  1. 症狀、失敗閾值和記憶體口徑
  2. 環境、程序模型與可重複負載
  3. 記憶體區域假設
  4. 採集方法、開銷和時間點
  5. 分配熱點與持續存活差分
  6. 根因候選及反證
  7. 最小修復與副作用
  8. 前後對照和剩餘風險

證據等級使用 CONFIRMED、STRONG、PLAUSIBLE、UNVERIFIED。所有數值標明單位、取樣區間、程序範圍和是否包含子程序。

能力邊界

  • 不把單次峰值或常駐集不回落自動判為洩漏
  • 不只依據物件數量忽略原生擴充套件和對映記憶體
  • 不在高流量生產程序上預設開啟高開銷全量追蹤
  • 不用強制垃圾回收作為長期修復
  • 不為降低峰值擅自改變結果精度或業務語義
  • 不在未脫敏時分享堆轉儲、引數值或生產請求
  • 不承諾一種分析工具覆蓋所有平臺與分配器

    小蔥技能有更好的技能skills外掛。

穩定性保障

  • 固定直譯器、依賴、平臺和程序模型
  • 記錄預熱並從穩定點比較
  • 記憶體曲線與負載時間線使用同一時鐘
  • 至少比較基線、問題階段和靜置後三點
  • 採集開銷單獨測量並寫入結論
  • 分配量、存活量和常駐集聯合判斷
  • 修復前後使用完全相同的負載
  • 記憶體改善與正確性、吞吐、延遲共同驗收

深度定製

Web 服務增加請求路由、工作程序、連線池和後臺任務;資料管道增加檔案批次、中間表、零複製與分割槽;機器學習增加張量、裝置與主機記憶體邊界;非同步系統增加未等待任務、佇列積壓和上下文變數;含原生擴充套件時增加本地呼叫棧、外部快取和版本對照。

長期執行服務可建立每千請求記憶體斜率、穩定平臺和重啟前預算;短批任務重點約束峰值與同時存活資料規模。

FAQ

垃圾回收後記憶體沒降就是洩漏嗎?

不是。物件可能已釋放給直譯器或分配器,但記憶體仍保留給後續複用。需要看存活差分和重複負載斜率。

最大分配棧就是根因嗎?

未必。它可能是合法峰值。持續跨越預期生命週期並累積的路徑更值得優先調查。

為什麼本地復現不了容器超限?

容器限制、工作集口徑、併發、子程序和分配器可能不同。應儘量複製部署引數與負載形狀。

重啟能解決嗎?

重啟只能暫時釋放程序資源。若增長機制未修復,問題會按相同斜率再次出現。

反模式與修正

反模式 直接後果 修正
只看一張記憶體截圖 無法判斷趨勢與負載關係 建立帶事件標記的時間線
一上來全量追蹤生產 效能和現場被擾動 先低開銷分型,再縮小復現
最大物件等於洩漏 誤刪必要工作集 比較生命週期與累積斜率
到處手動觸發回收 掩蓋所有權問題 找到仍被保留的引用或塊
只最佳化記憶體數字 吞吐和正確性回退 多指標同條件驗收
忽略子程序與原生庫 Python 物件證據對不上總量 繪製完整程序記憶體地圖

按需 references

🤖 AI 評測

這個 Skill 質量較好,文件結構清晰、方法論完整,對記憶體問題的分類和排查思路講解得很系統,能幫助開發者建立正確的分析框架。不過它更像一本說明書而非實操手冊,內容偏理論化,缺少具體例子和操作步驟演示,對於想直接動手的新手來說不夠友好。

📊 多維度評分

適應性4.2
規範性4.4
有效性4.7
可靠性3.7
可信度5

📁 包含檔案 (4 個)

📄 SKILL.md 8.2 KB
📄 agents/openai.yaml 245 B
📄 references/capture-selection.md 1.1 KB
📄 references/leak-verification.md 911 B