10

【茶包射手日記】Memory Leak 調查之 Paged Pool 分析

 2 years ago
source link: https://blog.darkthread.net/blog/paged-pool-memleak-analysis/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【茶包射手日記】Memory Leak 調查之 Paged Pool 分析-黑暗執行緒

參與一宗記憶體洩漏案件調查,過程學到新工具與新技巧,特筆記備忘。

問題網站平日之正常記憶體使用量依尖峰離峰維持在 40% ~ 10% 週期性起伏,但在某次 Windows Update 後,記憶體在兩三天內一路上升到 90% 以上,最後網站因記憶體不足當機。查看工作管理員,記憶體用近 16G,IIS W3WP 程序只佔 3G 多,而工作管理員上所有程序記憶體用量加總不到 10G。嘗試 IISRESET,記憶體只減少不到 4G。由這些線索,確認記憶體被不明來源佔用。

處理這種狀況,我的第一步是使用 RAMMap 分析記憶體是否被 Mapped File 等工作管理員看不到的項目佔用。參考:Windows記憶體都用到哪裡去了?

註:本文的圖片以示意為主,非案發現場照片。

1948-b380-o.gif

RAMMap 查詢結果出現我沒遇過的狀況,Paged Pool,用量高達 5G,恰巧就是短少的部分。依據上回研究心得,Paged Pool 為可以移至磁碟的核心集區記憶體(Kernal Pool Memory),與 OS 核心程式、驅動程式有關;而 Total 5G、Active 也接近 5G,代表 5G 幾乎都在使用中必須佔用實體記憶體。由此推估可能有 OS 核心程式配置了記憶體卻沒釋放,屬於典型的記憶體洩漏(Memory Leak)。

但要怎麼查出是 Paged Pool 被哪些程式吃掉?我學到新工具 - PoolMon

PoolMon 是 WDK (Windows Driver Kits) 附屬工具程式,可用於觀察驅動程式的記憶體(Paged Kernel Pool、Non-Paged Kernel Pool)使用狀況,方便抓出 Memory Leak 問題。要取得 poolmon.exe 需先安裝 WDK,我們需要 C:\Program Files (x86)\Windows Kits\版本\Tools\x64\poolmon.exeC:\Program Files (x86)\Windows Kits\版本\Debuggers\x64\triage\pooltag.txt。pooltag.txt 負責將 PoolTag 對映到所屬程式名稱及用途,使用時跟 poolmon.exe 放在同一目錄,加上 /g 參數即可參照。

Fig2_637928879298472471.png

使用指令 poolmon /p /p /t /b /g 進行查詢,/p /p 限定查詢 Paged Pool,/t 顯示總計,/b 依耗用記憶體由大至小排序,/g 表參考同目錄下的 pooltag.txt 顯示名稱。poolmon 顯示範例如下:

Fig3_637928879299501208.png

而在本次案件中,排第一的 PoolTag 是 Toke,Mapped Driver 則為 nt!se - Token Objects,使用了 4,280,876,528 Bytes,高達 4G,明顯是兇手。其餘關鍵數字如下:數字意義

  • Allocs 75435505 (7517) 總共配置了 754 萬個,測量期間增加 7517 個
  • Frees 72221064 (7245) 總共釋放了 722 萬個,測量期間釋放 7245 個
  • Diff 3214441 配置但沒釋放的數量

由此可知,配置多於釋放,短時間內就動用了七千五百多個,長期累積了320 萬個 Token 沒釋放掉,算是已鎖定 Memory Leak 爆炸現場。

那要怎麼查出誰用了那麼多 Token Objects?幸運地找到一篇類似情境的文章,一樣是被 Token Objects 耗光記憶體,我從中學到不少追查此種問題的技能。

首先,Kernel Memory 使用量常與 Handle 有關,所謂 Handle 是指向特定資源的參考指標,資源通常是記憶體、檔案或是 Pipe。因此,當遇到 Paged Pool 問題,Handle 便是重要的健康指標,Handle 數愈多,代表耗用的記憶體愈多,通常就是問題所在。隨手可得的工作管理員,其實已經提供一些我沒注意過的重要資訊。

總 Handle 數:

Fig4_637928879300025425.png

要查詢各程序使用的 Handle 數,可選取欄位:

Fig6_637928879300441513.png

用 Handle 排序便能快速找出誰用掉最多 Handle,通常就是吃掉 Paged Pool 記憶體的元凶。
(在我們的案例中是 lsass.exe,它居然用了 330 萬個 Handle,而且不斷持續增加。)

Fig7_637928879300925204.png

另外,工作管理員就有 Paged Pool 大小。(數字跟 RAMMap 有點差距,但判斷問題關鍵)

Fig5_637928879301402711.png

下個問題是,lsass.exe 的 330 萬個 Handle 用到哪裡去了?

本案件的第三個工具登場 - Sysinternals 魔法工具箱之 Handle !

handle -p lsass -s 可統計 lsass 使用的 Handles 數,-p lsass 鎖定程序,-s 統計各種類數量,其中 Token 數 330 萬與工作管理員看到的 Handle 數量、PoolMon 看到的數字相近:

Fig8_637928879301802182.png

若要查詢 lsass 用了哪些 Handle,指令為 handle -p lsass -a,加 -a 會列出所有資源 Handle,否則只會現檔案相關。再深入追查會是另一個議題,就此打住。

簡單整理這次學到的知識及分析技巧:

  1. 用 RAMMap 鎖定 Page Pool 異常飆高造成記憶體不足
  2. 用 WDK PoolMon.exe 找出佔用大量 Paged Pool 的來源,並可由配置、釋放數值偵測記憶體洩漏
  3. Paged Pool 主要由 OS 核心程式或驅動程式使用,記憶體用量常與 Handle 數正相關
  4. 工作管理員可查看總使用 Handes 數及各程序使用 Handles 數
  5. SysInternals Handle 工具可查詢程式使用 Handle 的狀況

Recommend

  • 17

    【茶包射手日記】怪異的 .NET 數學運算溢位錯誤-黑暗執行緒 同事報案,某支提供檔案下載的 ASP.NET 程式,用瀏覽器可正常開啟,但有一支用 HttpWebRequest 存取它的 .NET 程式,原本可以執行,現在則出現 Arithmetic operation resulted in an ove...

  • 11

    【茶包射手日記】IIS 整合式登入 MSSQL 之 AppPool 身分疑雲-黑暗執行緒前天提到我在 IIS 試跑 ASP.NET Core 開源專案 - Kandu,它的資料庫是用 MSSQL,本機跑測試我懶得開帳號,便把連線字串設成 Integrated Security=SSPI 打算走整合式驗證,用 AppPool 的身...

  • 12

    【茶包射手日記】IIS 跑 ASP.NET Core 出現 500.19 0x8007000d 錯誤-黑暗執行緒 低級錯誤一枚。 我玩 ASP.NET Core 多半是跑 VS 偵錯後丟進 Docker 跑,很久沒部署到 IIS,但方法我還記得:Publish、開 AppPool,也記得要設成「沒有受控碼」(No Man...

  • 13

    【茶包射手日記】從 Oracle 改用 MSSQL 出現中文亂碼-黑暗執行緒 將某個老系統的資料來源由 Oracle 換成 MSSQL,遇到一個有意思的狀況。 在 Oracle 與 MSSQL 都有 Schema 完全相同的資料表,資料原本來自 Oracle NVARCHAR,改用 MSSQL 後,部分中文...

  • 13

    【茶包射手日記】偶發型 Oracle Client 版本不相容錯誤-黑暗執行緒同事報案,有個 ASP.NET 網站「偶爾」會出現提供者與 Oracle 從屬版本不相容錯誤。這是 Unmanaged ODP.NET...

  • 27

    【茶包射手日記】用 USB 安裝 Win10 找不到媒體驅動程式-黑暗執行緒2018 開春第一砲包。 元旦在家當工具人,幫小閃光的 Toshiba 小筆電重灌 OS。Windows 10 1709 的 ISO 檔超過 4.8 GB 燒不進 DVD.....

  • 63

    【茶包射手日記】超詭異 Oracle Unicode 難字問題-黑暗執行緒Oracle 遇難字出錯不算新鮮事,現象不外乎中文字變空白變方格變問號變亂碼,老司機們一眼便知,該怎麼做心裡有數,但這回我遇到超不一樣的變種。(這樣算有吸引詭異茶包的特殊體質嗎?) 碰到一...

  • 13

    【茶包射手日記】遠端桌面剪貼簿失效 2014-11-06 08:57 PM

  • 11
    • blog.darkthread.net 3 years ago
    • Cache

    【茶包射手日記】HtmlDecode 鬼打牆記

    【茶包射手日記】HtmlDecode 鬼打牆記-黑暗執行緒 好久沒有鬼打牆,PO 文紀念兼反省。 有個網站代理下載功能,要從 HTML 用 Regex 擷取某個下載 URL,經過加密轉交 ASPX,由 ASPX 自其他主機下載內容再轉回瀏覽器。 (資安提醒:設計這類應用請務必...

  • 4

    【茶包射手日記】LineBotSDK NullReferenceException 錯誤調查-黑暗執行緒 讀者 Edward 問了一個有趣問題,花了點時間追查,發現是 TLS 1.2 問題的變形茶包,累積了一些經驗值,簡單整理分享。 錯誤出現在

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK