การรายงานประสิทธิภาพที่ดีขึ้นใน svchost.exe


20

นี่คือสิ่งที่ทำให้ฉันรำคาญอยู่เสมอดังนั้นฉันจะถามชุมชน Server Fault

ฉันรักProcess Explorerสำหรับการติดตามมากกว่าเพียงแค่งานระดับสูงคุณได้รับในที่ Task Manager แต่ฉันอยากรู้อยู่เสมอว่าบริการใดเป็นโหลที่โฮสต์ในกระบวนการเดียวภายใต้svchostทำให้โพรเซสเซอร์ของฉันเพิ่มขึ้น

ดังนั้น ... มีวิธีใดที่ไม่ล่วงล้ำในการค้นหาข้อมูลนี้หรือไม่?

คำตอบ:


34

ใช่มีวิธีการที่ไม่ล่วงล้ำและง่าย:

แยกแต่ละบริการเพื่อให้ทำงานในกระบวนการ SVCHOST.EXE ของตัวเองและบริการที่ใช้รอบ CPU จะสามารถมองเห็นได้ง่ายใน Process Explorer (ช่องว่างหลังจาก "=" จำเป็นต้องมี):

SC Config Servicename Type= own

ทำสิ่งนี้ในหน้าต่างบรรทัดคำสั่งหรือใส่ไว้ในสคริปต์ BAT จำเป็นต้องมีสิทธิ์ระดับผู้ดูแลระบบและต้องรีสตาร์ทคอมพิวเตอร์ก่อนจึงจะมีผล

สถานะเดิมสามารถคืนค่าได้โดย:

SC Config Servicename Type= share

ตัวอย่าง: เพื่อให้ Windows Management Instrumentation ทำงานใน SVCHOST แยกต่างหาก:

SC Config winmgmt Type= own

เทคนิคนี้ไม่มีผลกระทบใด ๆ ยกเว้นอาจเพิ่มการใช้หน่วยความจำเล็กน้อย และนอกเหนือจากการสังเกตการใช้งาน CPU สำหรับแต่ละบริการแล้วยังทำให้สามารถสังเกตความผิดพลาดของหน้าเดลต้าอัตราการอ่านดิสก์ I / O และอัตราการเขียนดิสก์ I / O สำหรับแต่ละบริการ สำหรับ Process Explorer, เมนูมุมมอง / เลือกคอลัมน์: แท็บประมวลผลหน่วยความจำ / เพจฟอลต์ความผิดพลาด, แท็บกระบวนการประสิทธิภาพ / IO เขียนเดลต้า IO, แท็บกระบวนการประสิทธิภาพ / IO เดลต้าอ่านไบต์ตามลำดับ


ในระบบส่วนใหญ่มีเพียงกระบวนการ SVCHOST.EXE เดียวที่มีบริการจำนวนมาก ฉันใช้ลำดับนี้ (สามารถวางโดยตรงในหน้าต่างบรรทัดคำสั่ง):

rem  1. "Automatic Updates"
SC Config wuauserv Type= own

rem  2. "COM+ Event System"
SC Config EventSystem Type= own

rem  3. "Computer Browser"
SC Config Browser Type= own

rem  4. "Cryptographic Services"
SC Config CryptSvc Type= own

rem  5. "Distributed Link Tracking"
SC Config TrkWks Type= own

rem  6. "Help and Support"
SC Config helpsvc Type= own

rem  7. "Logical Disk Manager"
SC Config dmserver Type= own

rem  8. "Network Connections"
SC Config Netman Type= own

rem  9. "Network Location Awareness"
SC Config NLA Type= own

rem 10. "Remote Access Connection Manager"
SC Config RasMan Type= own

rem 11. "Secondary Logon"
SC Config seclogon Type= own

rem 12. "Server"
SC Config lanmanserver Type= own

rem 13. "Shell Hardware Detection"
SC Config ShellHWDetection Type= own

rem 14. "System Event Notification"
SC Config SENS Type= own

rem 15. "System Restore Service"
SC Config srservice Type= own

rem 16. "Task Scheduler"
SC Config Schedule Type= own

rem 17. "Telephony"
SC Config TapiSrv Type= own

rem 18. "Terminal Services"
SC Config TermService Type= own

rem 19. "Themes"
SC Config Themes Type= own

rem 20. "Windows Audio"
SC Config AudioSrv Type= own

rem 21. "Windows Firewall/Internet Connection Sharing (ICS)"
SC Config SharedAccess Type= own

rem 22. "Windows Management Instrumentation"
SC Config winmgmt Type= own

rem 23. "Wireless Configuration"
SC Config WZCSVC Type= own

rem 24. "Workstation"
SC Config lanmanworkstation Type= own

rem End.

4
ว้าวทางออกที่ยอดเยี่ยม +1
Matt Simmons

2
ไปที่โปสเตอร์ที่แนะนำสคริปต์ PowerShell: ฉันลองแล้วมันเปลี่ยนบริการทั้งหมดของฉันสำเร็จ อย่างไรก็ตามเมื่อรีบูทกล่องข้อผิดพลาดก็โผล่ขึ้นมาและการรีสตาร์ทก็จะเริ่มขึ้น ฉันต้องกู้คืนด้วย 'การกำหนดค่าที่ดีครั้งสุดท้าย' ระวัง.
user42670

1
Jelle Fresonต้องการเพิ่มรายชื่อของบริการนี้ว่าจะยังคงใช้ร่วมกัน
Chris S

1
@ChrisS: สิ่งเหล่านี้ได้รับการปกป้องจากการแก้ไขดัดแปลงใน Windows รุ่นที่ใหม่กว่า; ผมคิดว่ามันเป็นสิ่งสำคัญใน Windows XP แต่ ...
Tamara Wijsman

2
@ChrisS ขอบคุณสำหรับลิงค์ไปยังรายการที่แบ่งปัน! ดูเหมือนว่าไซต์นั้นจะตายแล้ว ต่อหนึ่งหน่วยเก็บถาวรรายการคือ: HTTPFilter, KDC, Netlogon, NTLMssp, PolicyAgent, ProtectedStorage, SamSs, Eventlog, PlugPlay(ทั้งหมดเกี่ยวข้องกับlsass.exe)
cxw

2

แม้ว่าฉันจะไม่ทราบวิธีง่ายๆในการทำโดยตรง แต่คุณสามารถอนุมานได้จากหน้าคุณสมบัติ Process Explorer สำหรับกระบวนการ svchost แท็บบริการในคุณสมบัติกระบวนการจะแจ้งให้คุณทราบว่าบริการใดที่โฮสต์อยู่ในกระบวนการนั้น และแท็บเธรดจะแสดงเธรดและสแต็กเธรดที่ทำงานรวมถึงการใช้งาน CPU บ่อยครั้งที่ที่อยู่เริ่มต้นบนเธรดจะให้ข้อบ่งชี้ของจุดเข้าใช้งาน DLL และโดยการขยายการบริการที่กำลังทำงานอยู่บนเธรดนั้น ในบางครั้งคุณสามารถดูที่หัวข้อ callstack และจะเห็นชื่อโมดูลใน call stack ที่บอกคุณว่าส่วนใดของรหัสกำลังทำงานอยู่


1

ลองเครื่องมือการเปิดเผยข้อมูลบริการ มัน:

  1. จัดเก็บบริการที่ใช้กระบวนการ svchost.exe
  2. กำหนดค่าบริการเพื่อให้ทำงานในกระบวนการแยกกัน หลังจากรีบูตคุณจะเห็นแต่ละบริการในกระบวนการแยกต่างหาก
  3. ส่งคืนทั้งหมดที่เก็บไว้ในบริการขั้นตอนที่ 1 กลับสู่กระบวนการ

ความคิดเห็นและข้อเสนอแนะของคุณยินดีต้อนรับ

@ Peter Mortensen: ขอบคุณสำหรับความคิด


1
Dmytro ฉันจะเรียนรู้วิธีใช้เครื่องมือการเปิดเผยข้อมูลบริการได้อย่างไร ฉันดาวน์โหลดและรัน service_disclosure.exe บน Windows 7 สั้น ๆ ฉันเห็นหน้าต่างคำสั่งสีดำเปิดและปิด แต่ดูเหมือนไม่มีอะไรเกิดขึ้น นี่มันช่างน่าละอาย! ฉันต้องการทราบว่าคอมพิวเตอร์ของฉันทำอะไรและใช้เครื่องมืออย่างไร
DeveloperDan

สวัสดีแดน โปรดพิจารณาคู่มือทีละขั้นตอนนี้ ( sourceforge.net/p/svcdisclsr/wiki/Home )
Dmytro Ovdiienko

1

ข้อควรระวัง:โปรดทำการวิจัยที่จำเป็นคืนค่าจุดและขั้นตอนการสำรองข้อมูลก่อนที่จะใช้สิ่งนี้รวมทั้งตรวจสอบว่าทุกอย่างยังคงทำงานต่อไป เป็นไปได้ที่จะกู้คืนจากสิ่งนี้ผ่านสภาพแวดล้อมการกู้คืนบนระบบที่ไม่ใช่ RAID เท่านั้นเช่นเดียวกับ Safe Mode สำหรับทั้งระบบ RAID และระบบที่ไม่ใช่ RAID สิ่งนี้ได้รับการทดสอบบนเครื่องนักพัฒนาไม่ใช่บนเซิร์ฟเวอร์

ใน Powershell คุณสามารถทำได้สำหรับบริการที่ไม่ใช่ lsass ทั้งหมดโดยใช้คำสั่งต่อไปนี้:

Get-Service | ForEach-Object `
    { SC.EXE config $_.Name type= own }
ForEach ($svc in @("efs", "keyiso", "netlogon", "policyagent", "samss", "vaultsvc", `
    "was", "w3svc")) `
    { SC.EXE config $svc type= share }

รายการที่ถูกแยกออกที่นี่ทั้งหมดจำเป็นต้องเรียกใช้ใน lsass.exe ที่ใช้ร่วมกันยกเว้นpolicyagentซึ่งจำเป็นสำหรับเอเจนต์นโยบายกลุ่มเพื่อสื่อสารอย่างถูกต้องระหว่างการบู๊ต

นอกจากนี้เมื่อเร็ว ๆ นี้พบว่าเป็น (กระบวนการเปิดใช้งาน) และw3svc (IIS เวิลด์ไวด์เว็บ) จำเป็นที่จะต้องแบ่งปันกระบวนการของพวกเขาเพื่อให้พวกเขาได้มีการเพิ่มการยกเว้น

สิ่งนี้ได้รับการทดสอบบน Windows 10 (1607, สร้าง 14393.953), การยกเว้นคือ แตกต่างกันใน XP, ...


0

ฉันไม่รู้ว่านี่เป็นคำถามที่คุณต้องการคำตอบหรือไม่ แต่ในขณะที่การแก้ไขข้อผิดพลาด svchost ของลูกค้าฉันได้เรียนรู้ว่ามีบรรทัดคำสั่งสำหรับสิ่งนี้: "tasklist / svc" มันให้รายการกระบวนการทั้งหมดที่ทำงานอยู่ ด้วย ID กระบวนการและบริการที่แต่ละกระบวนการกำลังทำงาน มันไม่ได้ให้การใช้งานตัวประมวลผล แต่คุณสามารถปิดกระบวนการได้ทีละกระบวนการโดยใช้ ID กระบวนการและเรียนรู้อย่างน้อยว่ากลุ่มบริการใดที่อุดตัน CPU ของคุณ


0

ทุกวันนี้คุณสามารถใช้ PowerShell เพื่อเปลี่ยนประเภทบริการเป็น "กระบวนการของตัวเอง" และดูหน่วยความจำสำหรับแต่ละรายการแยกกัน สรุปสาระสำคัญนี้แสดงรหัสที่สมบูรณ์ แนวคิดหลักคือพยายามเปลี่ยนประเภทบริการจากวิธีที่รบกวนน้อยที่สุดมาเป็นวิธีที่ล่วงล้ำที่สุด:

$win32Service = Get-CimInstance -ClassName Win32_Service -Filter "Name = '$ServiceName'" -Verbose:$false

if ($win32Service)
{
    if (!(Set-ServiceTypeToOwnProcessByCim $win32Service))
    {
        if (!(Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service))
        {
            if (Grant-FullControlRightsOnServiceRegistryKeyToCurrentUser $win32Service)
            {
                Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service | Out-Null
            }
        }
    }
}
else
{
    Write-Warning "[$ServiceName] Service not found"
}

เมื่อวางSet-ServiceTypeToOwnProcess.ps1และEnable-Privilege.ps1ไฟล์ในโฟลเดอร์เดียวกันคุณสามารถเรียกใช้งานสคริปต์ดังนี้:

.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.