กระบวนการทำงานช้าลงตามภารกิจที่กำหนดไว้มากกว่าทำงานแบบโต้ตอบ


41

ฉันมีงานที่กำหนดเวลาไว้ซึ่งเป็น CPU และ IO มากและใช้เวลาประมาณสี่ชั่วโมงในการเรียกใช้ (การสร้างซอร์สโค้ดหากคุณอยากรู้) ภารกิจคือสคริปต์ Powershell ซึ่งวางไข่กระบวนการย่อยต่าง ๆ เพื่อทำงาน เมื่อฉันเรียกใช้กระบวนการเดียวกันแบบโต้ตอบได้จากพรอมต์ Powershell เช่นเดียวกับบัญชีผู้ใช้เดียวกันมันจะทำงานในเวลาประมาณสองชั่วโมงครึ่ง งานกำลังทำงานบน Windows Server 2008 R2

สิ่งที่ฉันอยากรู้คือทำไมมันใช้เวลานานกว่าจะทำงานตามกำหนดเวลา - นานกว่าหนึ่งชั่วโมง สิ่งหนึ่งที่ฉันสังเกตเห็นคือตัวกำหนดตารางงานทำงานที่ลำดับความสำคัญต่ำกว่าปกติดังนั้นเมื่องานของฉันเริ่มทำงานจะมีลำดับความสำคัญลดลงเหมือนเดิม อย่างไรก็ตามฉันได้อัปเดตสคริปต์เพื่อตั้งค่าลำดับความสำคัญของกระบวนการ Powershell กลับเป็นปกติและยังคงใช้เวลานาน

ใครมีความคิดว่าอะไรจะแตกต่างกันระหว่างสองสถานการณ์ ฉันได้พิจารณาข้อแตกต่างของตัวประมวลผลและโหลด IO - งานนี้เป็นสิ่งเดียวที่ระบบใช้สำหรับดังนั้นจึงไม่มีอะไรทำงานที่สามารถแข่งขันกับทรัพยากรได้


อัปเดตใด ๆ ฉันอยากรู้ว่าคุณสามารถค้นหาอะไร
mfinni

ฉันพบสิ่งที่ฉันคิดว่าเป็นสาเหตุ ดูคำตอบของฉันด้านล่าง
Charlie

ตั้งแต่ Windows 10 Fall Builders ปัญหานี้ยังคงมีอยู่และวิธีแก้ปัญหาของ @Jason Mathison (แก้ไขไฟล์. Task Scheduler .xml) ยังคงเป็นทางออกที่ดีที่สุด
BSalita

คำตอบ:


36

ปรากฏว่ามีความสำคัญมากกว่า "ปกติ" กระบวนการทำงานที่นี่ ดังที่ฉันได้กล่าวไว้ในคำถามตัวจัดกำหนดการงานตามค่าเริ่มต้นจะเรียกใช้งานของคุณที่ต่ำกว่าระดับความสำคัญปกติ คำถามนี้ใน StackOverflowอธิบายถึงวิธีแก้ไขงานใด ๆ ให้ทำงานที่ระดับความสำคัญปกติ แต่การแก้ไขยังคงมีสิ่งหนึ่งที่แตกต่างกันเล็กน้อย: ลำดับความสำคัญของหน่วยความจำ ลำดับความสำคัญของหน่วยความจำที่เป็นคุณลักษณะใหม่สำหรับ Windows Vista และอธิบายไว้ในบทความนี้เปอเรเตอร์ คุณสามารถดูลำดับความสำคัญของหน่วยความจำได้โดยใช้Process Explorerซึ่งเป็นเครื่องมือที่ต้องมีสำหรับผู้ดูแลระบบหรือโปรแกรมเมอร์

อย่างไรก็ตามแม้ว่าการแก้ไขลำดับความสำคัญของงานที่กำหนดเวลาไว้ลำดับความสำคัญของหน่วยความจำของงานของคุณจะถูกตั้งค่าเป็น 4 ซึ่งเป็นหนึ่งรอยด้านล่างการตั้งค่าปกติ 5 เมื่อฉันเพิ่มลำดับความสำคัญหน่วยความจำของงานของฉันเองถึง 5 ประสิทธิภาพด้วยตนเอง เสมอกับการเรียกใช้กระบวนการแบบโต้ตอบ

สำหรับข้อมูลเกี่ยวกับการเพิ่มระดับความสำคัญให้ดูคำตอบของฉันสำหรับคำถาม StackOverflow ที่เกี่ยวข้องกับความสำคัญของ IO การตั้งค่าลำดับความสำคัญของหน่วยความจำทำได้เช่นเดียวกันผ่าน NtSetInformationProcess โดยPROCESS_INFORMATION_CLASSตั้งค่าเป็นProcessMemoryPriority(ค่านี้คือ 39 หรือ 0x27) ฉันอาจสร้างโปรแกรมอรรถประโยชน์ฟรีที่สามารถใช้ในการตั้งค่านี้หากผู้อื่นต้องการและไม่สามารถเข้าถึงเครื่องมือโปรแกรมเมอร์

แก้ไข: ฉันได้ไปข้างหน้าและเขียนสาธารณูปโภคฟรีสำหรับการสอบถามและการตั้งค่าลำดับความสำคัญความทรงจำของงานอยู่ที่นี่ การดาวน์โหลดมีทั้งซอร์สโค้ดและไบนารีที่คอมไพล์แล้ว


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

17

ปัญหาคือกระบวนการของคุณเริ่มต้นด้วยลำดับความสำคัญต่ำ I / O และลำดับความสำคัญต่ำหน่วยความจำ วิธีที่ง่ายที่สุดในการตรวจสอบสิ่งนี้คือกระบวนการสำรวจจาก sysinternals หากคุณดูคุณสมบัติของกระบวนการใด ๆ ที่เกิดจากงานที่กำหนดเวลานี้คุณจะเห็นว่ามีลำดับความสำคัญ I / O ต่ำและลำดับความสำคัญหน่วยความจำ 2

นี่คือวิธีแก้ไขปัญหานี้:

  1. สร้างงาน
  2. คลิกขวาที่งานและ "ส่งออก" มัน
  3. แก้ไขไฟล์ task.xml ที่คุณเพิ่งเอ็กซ์พอร์ต
  4. คุณจะพบบรรทัดที่คล้ายกับ <Priority>7</Priority>
  5. เปลี่ยนค่าเป็นลำดับความสำคัญปกติ (ระหว่าง 4-6) ตารางค่าที่เป็นไปได้: คุณสมบัติ TaskSettings.Priority
    • ค่า 4 จะมี I / O และลำดับความสำคัญของหน่วยความจำเหมือนกับกระบวนการโต้ตอบ ค่า 5 และ 6 จะมีลำดับความสำคัญต่ำกว่าหน่วยความจำ
  6. ในตัวกำหนดตารางงานลบงานที่คุณสร้างขึ้นในตอนแรก
  7. ในตัวกำหนดเวลางานในพื้นที่การดำเนินการนำเข้างานจากไฟล์ XML

น่าเสียดายที่ไม่มีวิธีแก้ไขลำดับความสำคัญเริ่มต้นของงานที่กำหนดเวลาไว้จาก GUI


ขอบคุณสำหรับคำแนะนำ ลำดับความสำคัญของกระบวนการปกติและลำดับความสำคัญ IO เป็นส่วนหนึ่งของมันแน่นอนและส่วนอื่น ๆ คือลำดับความสำคัญของหน่วยความจำ ดูคำตอบที่ยอมรับสำหรับข้อมูลเพิ่มเติม
Charlie

หลังจากส่งงานไปยังไฟล์ XML คุณอาจต้องเปลี่ยนการเข้ารหัสอักขระจาก Unicode เป็น ANSI บน Windows Server 2008 R2 การส่งออกเป็นไฟล์ Unicode และเมื่อคุณพยายามนำเข้ากลับมาThe format of the task is not valid. The following error was reported: (1,2)::จะได้รับข้อความแสดงข้อผิดพลาด การบันทึกไฟล์เป็น ANSI จะแก้ไขให้ฉัน
Erik Anderson

ขอบคุณมากนี่เป็นทางออกที่ดีที่สุด ดังที่เอกสารระบุไว้คุณสามารถตั้งค่าลำดับความสำคัญให้สูงขึ้น (อย่างน้อย 1 สูงสุด) เพื่อรับลำดับความสำคัญของ CPU ที่สูงขึ้น
Rune Aamodt

สำหรับใครก็ตามที่คิดว่าคุณอาจสามารถปรับแต่งสิ่งนี้ในรีจิสทรีไม่ต้องกังวลไม่ดูเหมือนจะมีวิธีแก้ไขได้อย่างดี
Nik

1

หากคุณตั้งให้มันทำงานตามกำหนดเวลาในฐานะผู้ใช้ X จากนั้นเข้าสู่ระบบในฐานะผู้ใช้ X ก่อนที่มันควรจะทำงานมันควรเปิดหน้าต่างในเซสชั่นของคุณเมื่อมันทำงานมันจะทำงานในเซสชั่นของคุณ

หากคุณทำเช่นนี้จะใช้เวลานานขึ้นหรือสั้นลง? ฉันไม่รู้ว่ามันจะหมายถึงอะไร แต่อาจเป็นประโยชน์ที่แตกต่าง อาจมีการเข้าถึงเครือข่ายบางอย่างที่บัญชีผู้ใช้มีเมื่อเข้าสู่ระบบ แต่ไม่เมื่อทำงานตามกำหนดเวลาที่ต้องหมดเวลาและล้มเหลว? พฤติกรรมนั้นแตกต่างกันหรือไม่หากคุณสร้างบัญชีผู้ใช้ใหม่และใช้งานตามกำหนดเวลาภายใต้บัญชีนั้น

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


1
กระบวนการย่อยทำงานเป็นปกติแน่นอนตามที่ตรวจสอบโดย procexp / taskman ฉันคิดว่าสิ่งที่เครือข่ายไม่ได้เป็นเพราะมันไม่ได้เข้าถึงเครือข่ายที่สำคัญใด ๆ แต่ฉันจะตรวจสอบอีกครั้งว่า แนวคิดเกี่ยวกับการทำงานเป็นแบบโต้ตอบก็น่าสนใจเช่นกันฉันจะลองดู
Charlie

กระบวนการเองไม่จำเป็นต้องทำการเข้าถึงเครือข่ายใด ๆ ที่คุณรู้ว่าสิ่งนี้เป็นปัญหา อ่านโพสต์นี้จาก Sysinternals และดูว่าสิ่งที่ดูเหมือนไม่เกี่ยวข้องกันอาจทำให้เกิดอาการแฮงค์ / ความเชื่องช้า blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni

1

อาจมีการกำหนดเวลาทำงานตามลำดับความสำคัญที่ต่ำกว่า

ใช้prioเพื่อบังคับให้ลำดับความสำคัญสูงขึ้น


คุณพูดถูกว่าพวกเขาทำงานที่ลำดับความสำคัญต่ำกว่า แต่ตามที่ฉันได้กล่าวไปแล้ว นอกจากว่าจะมีความสำคัญนอกเหนือจากลำดับความสำคัญของกระบวนการที่ฉันไม่ทราบ
Charlie

0

ในตอนแรก - คุณสามารถใช้ความสำคัญมากกว่าปกติ (สูงเช่น)

ที่สอง - คุณต้องเข้าใจก่อนที่เซสชั่นเบื้องหน้าจะใช้ทรัพยากรบางอย่างส่วนใหญ่เป็นฮาร์ดดิสก์ IO และหน่วยความจำเพื่อให้งานที่กำหนดไว้ลดน้อยลง สำหรับเกณฑ์มาตรฐานที่ชัดเจนคุณต้องออกจากระบบในขณะที่คุณเปิดใช้งานสคริปต์ PowerShell

และคุณสามารถลองเพิ่มหน่วยความจำ / ใช้งาน ramdrive / split บนฮาร์ดดิสก์หลายตัวเพื่อเร่งกระบวนการ


ขอบคุณสำหรับความคิด เครื่องมีหน่วยความจำมากมายและความจุ IO ปัญหาก็คือสิ่งที่ทำงานช้าลงตามภารกิจที่กำหนดไว้มากกว่าที่จะโต้ตอบ เมื่องานที่กำหนดเวลาทำงานปกติจะไม่มีเซสชันการเข้าสู่ระบบแบบโต้ตอบดังนั้นฉันคิดว่านั่นไม่ใช่ปัญหา
Charlie

0

คำถามนี้มานานแล้วและสำหรับ windows server 2008R2 ฉันมีคำถามเดียวกัน แต่สำหรับ Windows 10 บน Windows 10 (ตรวจสอบแล้วที่ 1703 และ 1809) เพียงแค่ตั้งค่า "ลำดับความสำคัญ" เป็น 4 ผ่าน xml ที่นำเข้าก็เพียงพอที่จะให้ความสำคัญพื้นฐานเดียวกันลำดับความสำคัญแบบไดนามิก I / O และลำดับความสำคัญของหน่วยความจำเป็นกระบวนการเริ่มต้นแบบโต้ตอบ


0

นี่คือตัวอย่างของ PowerShell สำหรับการตั้งค่าลำดับความสำคัญ (ทำงานในเซสชัน PowerShell ระยะไกล!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.