Windows Server 2003 (SP2) 作為 DHCP 伺服器,任務管理器顯示 tcpsvcs.exe 進程虛擬記憶體佔用高達 **1.9 GB**,遠超正常 (<10 MB)。重啟 DHCP 服務暫時恢復,隔日又復發。經排查定位為 **DHCP 服務啟用「DNS 動態更新」導致 Dnsapi.dll 記憶體洩漏** (Microsoft KB939928)。本文記錄完整排查過程、根因確認、兩種修復方案與驗證。
tcpsvcs.exe 為 Microsoft TCP/IP 網路服務主程式,載入 DHCP Server、Simple TCP、Print Services 等服務。tasklist /svc 確認 tcpsvcs.exe (PID 2032) 僅關聯 DHCPServer 服務。查詢 Microsoft 支援知識庫 KB939928:
「因
Dnsapi.dll模組未正確管理記憶體資源,啟用 DHCP DNS 動態更新時會導致記憶體洩漏,tcpsvcs.exe虛擬記憶體持續增長。停用 DNS 動態更新可規避。」
對比另一台正常 DHCP 伺服器,**唯一差異在於「啟用 DNS 動態更新」核取方塊**。
dhcpmgmt.msc (執行 → 輸入 dhcpmgmt.msc)net stop dhcpserver && net start dhcpserver
適用場景: 內網無 DNS 整合需求、或 DNS 由其他機制管理 (手動、腳本、IPAM)。缺點: DHCP 租約不再自動註冊/更新 DNS A/PTR 記錄,客戶端主機名無法透過 DNS 解析。
WindowsServer2003-KB939928-x86-CHS.exe (或對應版本)
5. 以管理員身分執行安裝,完成後**重啟伺服器**
6. 驗證:DHCP 服務保持「啟用 DNS 動態更新」,運行數日觀察 tcpsvcs.exe 虛擬記憶體穩定
風險提示: 熱修補程式未經完整迴歸測試,極少數情況可能引入新問題。安裝前**務必備份系統狀態 (ASR/完整備份)**,並在測試環境驗證無異常後再上生產。
# 監控腳本 (每小時執行,記錄虛擬記憶體)
@echo off
setlocal
for /f "tokens=5" %%i in ('tasklist /fi "imagename eq tcpsvcs.exe" /fo csv ^| findstr "tcpsvcs"') do set VM=%%i
echo %date% %time% tcpsvcs.exe Virtual Memory: %VM% >> C:\Logs\tcpsvcs_vm.log
# 若 VM 持續增長超過 500MB 告警
netsh dhcp server export),災難恢復演練。tcpsvcs.exe 虛擬記憶體暴增,表象在進程,根因在 **DHCP + DNS 動態更新 + Dnsapi.dll 記憶體洩漏**。停用動態更新即刻止血,熱修補程式根治保留功能。**但真正的長期解藥是淘汰 Windows Server 2003**,擁抱現代、受支援的作業系統平台。