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.
Jawaban:
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_CLASS
set keProcessMemoryPriority
(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.
sumber
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:
<Priority>7</Priority>
Sayangnya tidak ada cara untuk mengubah prioritas awal dari tugas yang dijadwalkan dari GUI.
sumber
The format of the task is not valid. The following error was reported: (1,2)::
diberikan. Menyimpan file ke ANSI menyelesaikannya untuk saya.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?
sumber
Mungkin tugas yang dijadwalkan berjalan pada prioritas yang lebih rendah secara default.
Gunakan
prio
untuk memaksakan prioritas yang lebih tinggi.sumber
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
sumber
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.
sumber
Berikut cuplikan PowerShell untuk mengatur prioritas (berfungsi dalam sesi PowerShell jarak jauh!):
sumber