Bagaimana cara mengkonfigurasi proses layanan Windows agar berjalan dengan prioritas rendah?


17

Apakah ada cara untuk mengkonfigurasi proses layanan Windows (mis. SquidNT, SQL Server, dll) untuk memulai secara otomatis dengan prioritas rendah tanpa mengubah prioritas proses secara manual melalui Task Manager?


Mengubah prioritas utas atau proses biasanya merupakan ide yang buruk, kecuali jika kode telah ditulis untuk dijalankan pada prioritas yang berbeda. Mengubah prioritas menambah "inversi prioritas" ke daftar masalah konkurensi yang harus dihindari.
Richard

1
OP tidak bertanya apakah itu ide yang bagus atau tidak. OP bertanya apakah itu bisa dilakukan, dan bagaimana . - Harap diingat untuk tetap pada topik. 😉
BrainSlugs83

Jawaban:


11

Service Control Manager, yang menangani layanan permulaan / penghentian, tidak memiliki mekanisme apa pun (dalam versi Windows apa pun sebelumnya) untuk menentukan prioritas pada proses yang dimulai.

Karena Anda dapat memodifikasi prioritas pada proses yang sudah berjalan, taruhan terbaik Anda mungkin menggunakan alat untuk melakukan itu.

Saya tidak mengetahui alat baris perintah Microsoft untuk mengubah prioritas proses, tetapi baris perintah "PV" juga tersedia di http://www.teamcti.com/pview/prcview.htm memiliki fungsi untuk menetapkan prioritas .

pv -pb process-name.exe

Itu akan mengatur "process-name.exe" menjadi prioritas "Below Normal".

Jika Anda dapat hidup dengan proses mulai dari prioritas "Normal" hingga Anda mengubahnya, Anda dapat melakukannya dengan skrip yang dijalankan sebagai "Tugas Terjadwal" untuk mematikan setiap-sesekali (jika layanan mendapatkan memantul).

Ini peretasan yang cepat dan kotor, tetapi saya berhutang banyak pada kehidupan saya karena peretasan yang cepat dan kotor yang menyelesaikan pekerjaan!


Mungkin menjalankan file batch untuk memulai aplikasi dan kemudian mengatur prioritas proses, dengan mungkin tidur singkat di antaranya, daripada menjalankan aplikasi secara langsung dan kemudian menjalankan tugas lain untuk mengatur prioritas. Tidak akan bekerja untuk semuanya tetapi patut dicoba.
John Gardeniers

3

Jawaban di atas tidak bekerja untuk saya. Saya akhirnya membuat skrip PowerShell berikut:

ChangePriority.ps1

Get-WmiObject Win32_process -Filter 'name="ProcessName.exe"' | ForEach-Object {$_.SetPriority(128)}

Dan kemudian saya membuat tugas yang dijadwalkan yang menyebutnya setiap 5 menit. Dari skrip Administrator atau skrip batch:

schtasks /Create /tn "Process Priority Change" /sc MINUTE /mo 5 /ru SYSTEM /tr "powershell -noprofile -executionpolicy bypass -file \"%cd%\ChangePriority.ps1\""

Diusahakan untuk digunakan wmicsebagaimana dibahas di sini untuk membuat tugas yang dijadwalkan tidak tergantung pada file yang gagal. Similary menggunakan skrip powershell: Saya tidak bisa hanya membuat satu perintah yang hanya membuat tugas dengan skrip inline. Dihargai jika Anda berhasil melakukannya dan menambahkan jawaban lain.

Nilai untuk prioritas dalam skrip powershell dapat ditemukan di sini [1].

[1] https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/setpriority-method-in-class-win32-process


Sangat berguna. Saya memotong garis dengan keterampilan ps saya yang buruk untuk mengatur layanan audio yang mengandung proses host layanan untuk realtime untuk mencegah audio berderak selama penggunaan CPU yang berat (driver yang buruk, saya kira). Bagus sekali!
JasonXA

@ JasonXA Sama-sama. Dihargai jika Anda dapat memberikan versi satu baris, yang saya tidak bisa
ceztko

Tentu: PowerShell.exe -noprofile -executionpolicy memotong -command "& {Get-WmiObject Win32_service -Filter \" Name = 'AudioSrv' \ "| ForEach {Get-WmiObject Win32_process -Filter -Filter \" ProcessId = $ ($ _. ProcessId) \ "} | ForEach-Object {$ _. SetPriority (256)}}" Saya tidak tahu seberapa benar itu ... tetapi berfungsi. Saya belum berhasil membuatnya bekerja tersembunyi, hanya dapat bekerja di bawah pengguna w / admin priv.
JasonXA

1

Berikut ini mungkin juga berfungsi. Edit kunci registri ImagePath, dan gunakan perintah mulai dari cmd.exe:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]

Sayangnya ini tidak bekerja sama sekali karena executable yang diluncurkan ImagePathharus menghormati antarmuka untuk layanan Windows, dan starttidak mengimplementasikan atau tidak akan merutekan ini ke executable yang diluncurkan.
ceztko

0

Saya harus melakukan itu untuk membuat teamcity mengambil cpu lebih sedikit. Dan, karena teamcity adalah satu-satunya aplikasi java yang kami jalankan, solusi itu bekerja dengan sempurna.

  1. Tetapkan layanan sebagai "manual" startup.
  2. Buat file batch, yang akan memulai layanan Anda, dan turunkan prioritas, seperti:

    net start tcbuildagent
    net start teamcity
    proses wmic di mana nama = "java.exe" CALL setpriority "di bawah normal"

  3. Buat pekerjaan "penjadwal tugas", dipicu pada "startup windows", yang akan meluncurkan file batch itu.

Saya mengkonfigurasi pemicu TaskScheduler dengan penundaan 1 menit, agar tidak mengganggu layanan lainnya.

ps Anda juga dapat mengatur semua startup layanan Anda sebagai manual, dan menggunakan file batch itu untuk memulai semuanya sesuai urutan yang Anda inginkan! SQL, IIS, dll.


0

Anda dapat mengikuti skrip PowerShell berikut ini, memasukkannya ke dalam tugas terjadwal yang berjalan saat startup.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.