Proses berjalan lebih lambat sebagai tugas terjadwal daripada yang dilakukan secara interaktif

41

Saya memiliki tugas terjadwal yang sangat intensif dengan CPU dan IO, dan membutuhkan waktu sekitar empat jam untuk berjalan (membangun kode sumber, jika Anda penasaran). Tugasnya adalah skrip Powershell yang memunculkan berbagai sub-proses untuk melakukan tugasnya. Ketika saya menjalankan proses yang sama secara interaktif dari prompt Powershell, seperti akun pengguna yang sama, itu berjalan sekitar dua setengah jam. Tugas sedang berjalan di Windows Server 2008 R2.

Yang ingin saya ketahui adalah mengapa dibutuhkan waktu lebih lama untuk berjalan sebagai tugas yang dijadwalkan - lebih dari satu jam lebih lama. Satu hal yang saya perhatikan adalah bahwa penjadwal tugas berjalan pada prioritas di bawah normal, jadi ketika tugas saya dimulai, ia mewarisi prioritas yang diturunkan yang sama. Namun, saya telah memperbarui skrip untuk mengatur prioritas proses Powershell kembali ke Normal, dan itu masih memakan waktu.

Adakah yang tahu apa yang bisa berbeda antara kedua skenario? Saya telah mengesampingkan perbedaan dalam prosesor dan beban IO - tugas ini adalah satu-satunya sistem yang digunakan, jadi tidak ada hal lain yang berjalan yang dapat bersaing untuk sumber daya.

Charlie
sumber
Adakah pembaruan? Saya sangat ingin tahu apa yang dapat Anda temukan.
mfinni
Saya memang menemukan apa yang saya pikir penyebabnya; lihat jawaban saya di bawah ini.
Charlie
Pada Windows 10 Fall Creators, masalah ini masih ada dan pemecahan masalah @Jason Mathison (edit Penjadwal Tugas file .xml) masih merupakan solusi terbaik.
BSalita

Jawaban:

36

Tampaknya ada lebih dari sekadar prioritas proses "biasa" yang bekerja di sini. Seperti yang saya catat dalam pertanyaan, penjadwal tugas secara default menjalankan tugas Anda di bawah prioritas normal. Pertanyaan tentang StackOverflow ini menjelaskan cara memperbaiki tugas apa pun untuk dijalankan pada prioritas Normal, tetapi perbaikannya masih menyisakan satu hal yang sedikit berbeda: prioritas memori. Prioritas memori adalah fitur baru untuk Windows Vista, dan dijelaskan dalam artikel Technet ini . Anda dapat melihat prioritas memori menggunakan Process Explorer , yang merupakan alat yang harus dimiliki oleh administrator atau pemrogram.

Bagaimanapun, bahkan dengan perbaikan prioritas tugas yang dijadwalkan, prioritas memori dari tugas Anda diatur ke 4, yang satu tingkat di bawah pengaturan normal 5. Ketika saya secara manual meningkatkan prioritas memori dari tugas saya hingga 5, kinerjanya menyala setara dengan menjalankan proses secara interaktif.

Untuk info tentang meningkatkan prioritas, lihat jawaban saya untuk pertanyaan StackOverflow terkait tentang prioritas IO; pengaturan prioritas memori dilakukan dengan cara yang sama, melalui NtSetInformationProcess, dengan PROCESS_INFORMATION_CLASSset ke ProcessMemoryPriority(nilai ini adalah 39 atau 0x27). Saya mungkin membuat utilitas gratis yang dapat digunakan untuk mengatur ini, jika orang lain membutuhkannya dan tidak memiliki akses ke alat programmer.

EDIT: Saya telah maju dan menulis sebuah utilitas gratis untuk menanyakan dan mengatur prioritas memori dari suatu tugas, tersedia di sini . Unduhan berisi kode sumber dan biner yang dikompilasi.

Charlie
sumber
Anda dapat melihat prioritas memori di Process Explorer dengan mengklik dua kali pada nama yang dapat dieksekusi, membuka tab "Kinerja", dan di bawah "Memori Fisik" adalah entri untuk "Prioritas Memori"
Moshe
17

Masalahnya adalah bahwa proses Anda dimulai dengan prioritas I / O rendah dan prioritas memori rendah. Cara termudah untuk memverifikasi ini adalah dengan proses explorer dari sysinternals. Jika Anda melihat properti dari salah satu proses yang muncul dari tugas yang dijadwalkan ini, Anda akan melihat bahwa itu memiliki prioritas I / O rendah dan prioritas memori 2.

Inilah solusi untuk masalah ini:

  1. Buat tugas
  2. Klik kanan pada tugas dan "ekspor" itu
  3. Edit file task.xml yang baru saja Anda ekspor
  4. Anda akan menemukan garis yang mirip dengan <Priority>7</Priority>
  5. Ubah nilainya menjadi prioritas normal (antara 4-6). Tabel nilai potensial: Properti TaskSettings.Priority
    • Nilai 4 akan memiliki prioritas I / O dan memori yang sama dengan proses interaktif. Nilai 5 dan 6 akan memiliki prioritas memori yang lebih rendah
  6. Di penjadwal tugas, hapus tugas yang awalnya Anda buat
  7. Di penjadwal tugas, di area tindakan, impor tugas dari file XML

Sayangnya tidak ada cara untuk mengubah prioritas awal dari tugas yang dijadwalkan dari GUI.

Jason Mathison
sumber
Terima kasih untuk sarannya. Prioritas proses reguler dan prioritas IO jelas merupakan bagian dari itu, dan bagian lainnya adalah prioritas memori. Lihat jawaban yang diterima untuk info lebih lanjut.
Charlie
Setelah mengekspor tugas ke file XML, Anda mungkin perlu mengubah pengkodean karakter dari Unicode ke ANSI. Pada Windows Server 2008 R2, ekspor adalah file Unicode dan ketika Anda mencoba mengimpornya kembali, pesan kesalahan The format of the task is not valid. The following error was reported: (1,2)::diberikan. Menyimpan file ke ANSI menyelesaikannya untuk saya.
Erik Anderson
Terima kasih banyak, ini benar-benar solusi terbaik. Seperti yang disebutkan oleh dokumen, Anda juga dapat mengatur Prioritas lebih tinggi (setidaknya hingga 1), untuk mendapatkan prioritas CPU yang lebih tinggi.
Rune Aamodt
Bagi siapa pun yang berpikir Anda mungkin dapat men-tweak ini dalam registri, jangan repot-repot, sepertinya tidak ada di sana dengan cara yang dapat diedit dengan baik.
Nik
1

Jika Anda mengaturnya untuk menjalankan sebagai tugas terjadwal sebagai Pengguna X, dan kemudian login sebagai Pengguna X sebelum itu seharusnya dijalankan, itu harus membuka jendela di sesi Anda ketika dijalankan, itu akan berjalan di sesi Anda.

Jika Anda melakukan ini, apakah perlu waktu yang lebih lama, atau lebih pendek,? Saya tidak tahu apa artinya ini, tetapi ini bisa menjadi pembeda yang bermanfaat. Mungkinkah ada beberapa akses jaringan yang dimiliki akun pengguna saat login, tetapi tidak ketika berjalan sebagai tugas yang dijadwalkan, yang perlu batas waktu dan gagal? Apakah perilaku berbeda jika Anda membuat akun pengguna baru dan menjalankannya sebagai tugas terjadwal di bawah akun itu?

Gagasan lain: Saat menjalankannya sebagai tugas terjadwal - sekarang setelah Anda menetapkan prioritas pada skrip Anda, apakah semua sub-proses berjalan sebagai Normal, atau Di Bawah Normal?

mfinni
sumber
1
Subproses pasti dijalankan sebagai Normal, seperti yang diverifikasi oleh procexp / taskman. Saya pikir hal jaringan bukan, karena tidak melakukan akses jaringan substantif, tapi saya akan periksa itu. Gagasan tentang menjalankan tugas sebagai hal yang interaktif juga menarik, saya akan mencobanya.
Charlie
Proses itu sendiri tidak harus melakukan akses jaringan apa pun yang Anda tahu untuk menjadi masalah. Baca posting ini dari Sysinternals dan lihat bagaimana sesuatu yang tampaknya tidak berhubungan dapat menyebabkan hang / kelambatan. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni
1

Mungkin tugas yang dijadwalkan berjalan pada prioritas yang lebih rendah secara default.

Gunakan priountuk memaksakan prioritas yang lebih tinggi.

mcandre
sumber
Anda benar bahwa mereka menjalankan prioritas yang lebih rendah, tetapi seperti yang saya sebutkan, saya sudah memperhitungkannya. Kecuali ada beberapa prioritas selain prioritas proses yang tidak saya ketahui.
Charlie
0

pada awalnya - Anda dapat menggunakan lebih dari prioritas normal (Tinggi misalnya)

pada detik - Anda harus mengerti, daripada sesi foreground mengambil beberapa sumber daya, terutama IO hard disk dan memori sehingga tugas yang dijadwalkan semakin sedikit. untuk pembandingan yang jelas Anda harus keluar saat Anda menjalankan skrip berjalan

dan Anda juga dapat mencoba menambah lebih banyak memori / menggunakan ramdrive / split work pada beberapa hard disk untuk mempercepat proses

evg345
sumber
Terima kasih atas idenya. Mesin memiliki banyak memori dan kapasitas IO, masalahnya hanya hal-hal berjalan lebih lambat sebagai tugas yang dijadwalkan daripada yang mereka lakukan secara interaktif. Ketika tugas terjadwal berjalan, biasanya tidak ada sesi masuk interaktif, jadi saya pikir itu bukan masalah juga.
Charlie
0

Pertanyaan ini dari beberapa waktu lalu, dan untuk windows server 2008R2. Saya memiliki pertanyaan yang sama, tetapi untuk Windows 10. Pada Windows 10 (diverifikasi pada 1703 dan 1809), hanya pengaturan "Prioritas" ke 4 melalui xml impor sudah cukup untuk memberi Anda Prioritas Basis yang sama, Prioritas Dinamis, Prioritas I / O , dan Prioritas Memori sebagai proses yang dimulai secara interaktif.

agieNick02
sumber
0

Berikut cuplikan PowerShell untuk mengatur prioritas (berfungsi dalam sesi PowerShell jarak jauh!):

$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"
Hank Killinger
sumber