Svchost.exe 執行 NSI 服務會洩漏記憶體,且非分頁池會洩漏 標籤 NSpc

套用到
Windows Server 2008 R2 Service Pack 1 Windows 7

症狀

假設您有一個應用程式或工具正在 Windows 7 或 Windows Server 2008 R2 中運行,且該應用程式或工具執行以下一項或多項任務:

  • 透過使用 ICMP 或 ping.exe 監控其他伺服器
  • 啟動多個短命程序執行同一工作,然後該程序被停止
  • 只要進行任何網路活動,這個程序就會被其他應用程式或腳本停止

在這種情況下,當你的伺服器連續運行數小時或數天後,你會注意到 NSI) 服務 (網路儲存介面會洩漏記憶體。 此外,你會注意到以下症狀:

  • 如果你停止監控軟體,記憶體洩漏就會停止。
  • 如果你停止應用程式再重新啟動電腦,NSI 服務中不會發生記憶體洩漏。
  • 有時候,如果你先停用再啟用網路卡,你會發現 NSI 服務的 CPU 使用率突然飆升。 此外,記憶體使用量會立即從 1 或 2 GB、 () 降至 200 或 300 MB (MB) 。

此問題可能發生於以下任一情境。

案例 1

若像 ping.exe 這樣的應用程式被強制停止, IcmpCloseHandle 函式 可能未被呼叫。 此時,NSI 服務可能會偵測到有客戶端可用。 因此,服務會持續發送任何 ICMP 訊息的通知。 由於客戶端不存在,通知清單會持續增加。 名單只有在國家安全局服務停止前才會被清理。

要發送 ping,您必須先開啟 ICMP 帳號,然後使用以下 IP 助手函式來發送和接收 ICMP 資料:

IcmpCreateFile 函式

ICMPCreateFile 函式

IcmpSendEcho2Ex 函式

應用程式發送 ping 後,必須呼叫 IcmpCloseHandle 函式 來關閉 ICMP 帳柄。

案例 2

軟體開發者會透過使用 IPHlelper API 來建立一個應用程式來發送和接收 ICMP 訊息。 如果只使用一個 ICMP 句柄來傳送多個用戶端的 ICMP 訊息,且發送速率非常高,收到訊息通知的 IPHelper API 將無法維持該速度。 在這種情況下,你會注意到 NSI 服務記憶體持續呈指數成長。 此外,你會注意到 NSI 服務 (nsisvc.dll) CPU 使用率很高。

情境三

你有一個應用程式或服務直接或間接使用 IP Helper 功能。 應用程式會停止或被停止,且當每次通知未被取消時,也不會優雅地退出 (取消 MibChangeNotify2) 。 在這種情況下,NSI 伺服器會讓註冊暫停,等待被停止的程序。 如果申請多次停止,NSI服務會有許多未完成的註冊。 每次註冊都會維持 RPC 非同步狀態及其他資訊。 這會增加記憶體使用量。 通常,這些註冊是針對介面變更或單播 IP 位址變更而進行。 若州內情況無變,這些登記仍會被維持。

註冊過程中會使用以下通知功能:

許多應用程式不呼叫 (取消MibChangeNotify2) 或停止該程序的原因,已在Microsoft開發者網絡網站上的 NotifyIpInterfaceChange功能 主題中討論。

在呼叫 NotifyIpInterfaceChange 函 式以註冊變更通知後,這些通知會持續發送,直到應用程式取消註冊以接收變更通知或應用程式停止。 若應用程式停止,系統會自動取消註冊任何變更通知。 我們建議您設定應用程式在變更通知停止前明確取消註冊。

每次註冊通知時,你也必須分配一些非分頁池 (NPP) 記憶體作為 NSpc 標籤。

原因

此問題發生於註冊通知的程序在未先取消註冊NSI服務的情況下退出。 因此,NSI 的註冊洩漏會導致 NSI 服務的記憶體洩漏。 此外,NPP 會洩漏 NSI 代理上下文標籤 NSpc (NSI.dll) 的記憶體。

解決方式

Hotfix 資訊

Microsoft 支援服務提供支援的熱修正。 不過,這個熱修正僅針對本文所述的問題進行修正。 此熱修正僅適用於遇到本文所述問題的系統。 這個熱修補可能會有額外的測試。 因此,如果您沒有受到此問題嚴重影響,我們建議您等待下一次包含此熱修補丁的軟體更新。

如果熱修補程式可供下載,這篇知識庫文章頂部有一個「熱修補丁下載可用」的區塊。 若此部分未出現,請聯絡 Microsoft 客服與支援以取得熱修正。

注意 若發生其他問題或需要排除故障,您可能需要另行建立服務請求。 一般的支援費用將適用於不符合本次熱修正範圍的其他支援問題與問題。 欲查詢完整的 Microsoft 客戶服務與支援電話號碼清單,或建立獨立的服務請求,請前往以下 Microsoft 網站:

http://support.microsoft.com/contactus/?ws=support

備註 「熱修正下載可用」表單顯示該熱修正可用的語言。 如果你看不到你的語言,那是因為該語言沒有熱修正。

先決條件

要套用此熱修補,必須安裝 Windows 7 服務包 1 或 Windows Server 2008 R2。

重新啟動需求

你必須在套用這個熱修補程式後重新啟動電腦。

熱修正更換資訊

此熱修正不會取代先前發布的任何熱修正。

檔案詳細資訊

英文 (美國) 版本的熱修補程式安裝的檔案包含以下表格中列出的屬性。 這些檔案的日期與時間是以國際標準時間 (UTC) 表示。 本機電腦上這些檔案的日期與時間,是以您當地的時間和目前的日光節約時間 (DST) 的時差來顯示。 此外,當您對檔案執行特定作業時,其日期與時間可能會改變。

Windows 7 與 Windows Server 2008 R2 檔案資訊與備註

重要 Windows 7 hotfixes 和 Windows Server 2008 R2 的 hotfixes 隨附於相同的套件中。 但是,Hotfix 要求頁面上的 Hotfix 會列在各自的作業系統中。 如果要請求適用於其中一或兩個作業系統的 Hotfix 套件,請選取頁面上列於「Windows 7/Windows Server 2008 R2」下方的 Hotfix。 請一律參照文章中的<適用於>一節,以判定每個 Hotfix 適用的確切作業系統。

  • 可透過查看下列表格中所顯示的檔案版本號碼來識別套用至特定產品、SR_Level(RTM,SPn)及服務分支(LDR、GDR)的檔案:

    版本 產品 SR_Level 服務分支
    6.1.760 0. 16xxx Windows 7 和 Windows Server 2008 R2 RTM GDR
    6.1.760 1. 22xxx Windows 7 和 Windows Server 2008 R2 SP1 LDR
  • GDR 服務分支只包含針對普遍的特別重要問題所發行的通用修正程式。 LDR 服務分支除了通用修正程式之外,還包含 Hotfix。

  • 為每個環境安裝的 MANIFEST 檔案 (.manifest) 與 MUM 檔案 (.mum) ,分別列於「Windows 7 及 Windows Server 2008 R2 的附加檔案資訊」章節中。

  • 對於維持已更新元件的狀態,MUM 及 MANIFEST 檔案及相關的安全性目錄 (.cat) 檔案都很重要。 屬性未列出的安全性目錄檔案是以 Microsoft 數位簽章簽署。

適用於所有支援的 x86 版本 Windows 7

檔案名稱 檔案版本 檔案大小 日期 時間 平台
Nsi.dll 6.1.7600.16385 8,704 2009 年 7 月 14 日 16:01 x86
Nsiproxy.sys 6.1.7600.16385 16,896 2009 年 7 月 13 日 12:23 x86
Nsisvc.dll 6.1.7601.22590 20,480 2014年2月5日 02:03 x86
Winnsi.dll 6.1.7600.16385 16,896 2009 年 7 月 14 日 16:01 x86

適用於所有支援的 x64 版本的 Windows 7 及 Windows Server 2008 R2

檔案名稱 檔案版本 檔案大小 日期 時間 平台
Nsi.dll 6.1.7600.16385 13,824 2009 年 7 月 14 日 01:41 x64
Nsiproxy.sys 6.1.7601.22590 24,576 2014年2月5日 01:15 x64
Nsisvc.dll 6.1.7601.22590 26,624 2014年2月5日 02:42 x64
Winnsi.dll 6.1.7600.16385 26,112 2009 年 7 月 14 日 01:41 x64
Nsi.dll 6.1.7601.22590 8,704 2014年2月5日 02:03 x86
Winnsi.dll 6.1.7601.22590 16,896 2014年2月5日 02:04 x86

適用於所有支援的 IA-64 版本 Windows Server 2008 R2

檔案名稱 檔案版本 檔案大小 日期 時間 平台
Nsi.dll 6.1.7600.16385 18,944 2009 年 7 月 14 日 01:48 IA-64
Nsiproxy.sys 6.1.7601.22590 53,760 2014年2月5日 00:50 IA-64
Nsisvc.dll 6.1.7601.22590 60,928 2014年2月5日 01:48 IA-64
Winnsi.dll 6.1.7600.16385 38,912 2009 年 7 月 14 日 01:50 IA-64
Nsi.dll 6.1.7601.22590 8,704 2014年2月5日 02:03 x86
Winnsi.dll 6.1.7601.22590 16,896 2014年2月5日 02:04 x86

Windows 7 與 Windows Server 2008 R2 的額外檔案資訊

所有支援的 x86 版本 Windows 7 的其他檔案

檔案名稱 Package_1_for_kb2847346~31bf3856ad364e35~x86~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,822
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_2_for_kb2847346~31bf3856ad364e35~x86~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,805
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_3_for_kb2847346~31bf3856ad364e35~x86~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,807
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_for_kb2847346_rtm~31bf3856ad364e35~x86~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,459
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_for_kb2847346_sp1~31bf3856ad364e35~x86~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,819
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 X86_dfca12963d5c03edca970b29ad513eb4_31bf3856ad364e35_6.1.7601.22590_none_ff32d7aebbbb6891.manifest
檔案版本 不適用
檔案大小 699
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 X86_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_749890603f18301d.manifest
檔案版本 不適用
檔案大小 8,301
日期 (UTC) 2014年2月5日
時間 (UTC) 06:38
平台 不適用

所有支援的 x64 版本 Windows 7 與 Windows Server 2008 R2 的額外檔案

檔案名稱 Amd64_37e172e525713d1718cb98daea282913_31bf3856ad364e35_6.1.7601.22590_none_9888f3a0165278fe.manifest
檔案版本 不適用
檔案大小 1,048
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Amd64_3839818617f8250fd6f59e35da1df9bd_31bf3856ad364e35_6.1.7601.22590_none_8fbf427f98b0d1cb.manifest
檔案版本 不適用
檔案大小 703
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Amd64_a9af583825031567fe0548a9c2c728ab_31bf3856ad364e35_6.1.7601.22590_none_59ced916edddc9da.manifest
檔案版本 不適用
檔案大小 703
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Amd64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_d0b72be3f775a153.manifest
檔案版本 不適用
檔案大小 8,305
日期 (UTC) 2014年2月5日
時間 (UTC) 06:41
平台 不適用
檔案名稱 Package_1_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,832
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_2_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 2,237
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_3_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 2,015
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_4_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 2,036
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_for_kb2847346_rtm~31bf3856ad364e35~amd64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,467
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_for_kb2847346_sp1~31bf3856ad364e35~amd64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 2,830
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Wow64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_db0bd6362bd6634e.manifest
檔案版本 不適用
檔案大小 4,690
日期 (UTC) 2014年2月5日
時間 (UTC) 02:16
平台 不適用

所有支援的 Windows Server 2008 R2 IA-64 版本的其他檔案

檔案名稱 Ia64_44d491142723affea686ec2fba3cb4ac_31bf3856ad364e35_6.1.7601.22590_none_dc26e555dbabe437.manifest
檔案版本 不適用
檔案大小 1,046
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Ia64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_749a34563f163919.manifest
檔案版本 不適用
檔案大小 8,303
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_1_for_kb2847346~31bf3856ad364e35~ia64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 2,029
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Package_for_kb2847346_sp1~31bf3856ad364e35~ia64~~6.1.1.0.mum
檔案版本 不適用
檔案大小 1,446
日期 (UTC) 2014年2月5日
時間 (UTC) 06:35
平台 不適用
檔案名稱 Wow64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_db0bd6362bd6634e.manifest
檔案版本 不適用
檔案大小 4,690
日期 (UTC) 2014年2月5日
時間 (UTC) 02:16
平台 不適用

因應措施

為了解決這個問題,請根據你的情況使用以下其中一種變通方法。

情境一的變通方法

確保該應用程式(如 ping.exe)不會被強制停止。 不如讓應用程式優雅地關閉。

或者,升級到 Windows Server 2012。 這個問題在 Windows Server 2012 中已被修正。 此修正可防止 NSI 服務洩漏記憶體,無論應用程式如何停止。

情境二的變通方法

軟體開發者應建立多個 ICMP 帳號來發送 ICMP 請求。 如果你必須傳送大量 ICMP 封包,應該使用 Raw 套接字,並直接在 RAW 套接字上發送和接收 ICMP 封包。 這樣能帶來最快的效能。

情境三的變通方法

在這種情況下,如果你停用並啟用網路介面卡,記憶體使用率會立即下降,但 CPU 使用率會短暫飆升。

這是因為當 IP 位址或介面發生變更時,核心會通知 NSI 服務。 NSI 服務接著嘗試通知所有已註冊的客戶端。 當服務嘗試通知不存在的用戶端程序時,RPC 會回報錯誤。 因此,NSI 服務會刪除該用戶端程序中所有儲存的狀態資訊。 此後,該記憶被釋放。

在此情況下,已登記數十萬通通知。 事件發生後,這些無效客戶端的所有記憶體都會被釋放。

這個問題在 Windows 8 中已經修正。