Memproses 'kebaikan' vs 'prioritas'

105

Saat berjalan top, saya bisa melihat output contoh ini (disingkat):

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

Ada dua nilai yang saya minati: PR(Prioritas) dan NI(Kesalehan).

Jika saya mengerti apa yang sudah saya temukan dengan benar, keduanya menentukan berapa banyak waktu CPU suatu proses akan berbeda dengan proses lainnya. Tapi apa perbedaan antara nilai-nilai itu?

Bisakah Anda juga menjelaskan bagaimana memanipulasi nilai-nilai dari suatu proses dan dalam keadaan apa ini mungkin berguna?

Komandan Byte
sumber

Jawaban:

103

Nilai yang bagus adalah ruang pengguna dan prioritas PR adalah prioritas aktual proses yang digunakan oleh kernel Linux. Dalam linux, prioritas sistem adalah 0 hingga 139 di mana 0 hingga 99 untuk waktu nyata dan 100 hingga 139 untuk pengguna. kisaran nilai yang bagus adalah -20 hingga +19 di mana -20 tertinggi, 0 default dan +19 terendah. hubungan antara nilai bagus dan prioritas adalah:

PR = 20 + NI

jadi, nilai PR = 20 + (-20 to +19)0 hingga 39 yang memetakan 100 hingga 139.

Menurut manual teratas:

PR - Prioritas Prioritas penjadwalan tugas. Jika Anda melihat 'rt' di bidang ini, itu berarti tugas sedang berjalan di bawah prioritas penjadwalan 'waktu nyata'.

NI adalah nilai tugas yang bagus.

NI - Nice Value Nilai tugas yang bagus. Nilai bagus negatif berarti prioritas lebih tinggi, sedangkan nilai bagus positif berarti prioritas lebih rendah. Angka nol di bidang ini berarti prioritas tidak akan disesuaikan dalam menentukan kemampuan pengiriman suatu tugas.

Sunting: Secara default ketika sebuah program diluncurkan di Linux, program itu diluncurkan dengan prioritas '0'. Namun Anda dapat mengubah prioritas program Anda dengan salah satu metode berikut.

  1. Anda dapat meluncurkan program dengan prioritas yang diperlukan menggunakan

    nice -n nice_value program_name
    
  2. Anda juga dapat mengubah prioritas proses yang sudah berjalan menggunakan

    renice -n nice_value -p process_id
    
pl_rock
sumber
1
Apakah Anda mengatakan, mereka hampir hal yang sama secara terbalik (keduanya merupakan prioritas) TETAPI nicenessdapat digunakan untuk memberikan prioritas negatif sehingga tugas dengan nicenesskeluar dari jalan tugas prioritas tinggi? (Yaitu sedang nicedan membiarkan sumber daya akses lainnya? Atau apakah ini hanya membingungkan saya?
Mark Kirby
1
Contoh yang saya maksud, dua tugas, keduanya memiliki pr20, jadi sama, tugas satu memiliki ni0 dan tugas dua memiliki ni20, jadi, ini berarti bahwa tugas dua akan menyerahkan sumber daya untuk tugas satu karena itu adalahnicer
Mark Kirby
1
Seperti yang saya tahu, prioritas dihitung sebagai PR = 20 + NI. jadi tugas satu prioritas = 20 +0. nilai maksimum dari kehendak baik +19
pl_rock
3
PR = 20 + NI nilai maksimum bisa 39. sebenarnya dalam sistem linux ada 139 prioritas di mana 0 hingga 99 adalah prioritas waktu nyata dan untuk pengguna ada 100 hingga 139. jadi, nilai NI -20 hingga +19 peta untuk prioritas 100 hingga 139. Anda dapat menyesuaikan. tetapi masih kernel tidak yakin jika Anda mengubah nilai NI maka itu akan mengubah prioritas, nilai NI adalah saran yang adil untuk kernel. kernel beberapa waktu abaikan saja
pl_rock
1
Jadi, apakah PR dan NI sebenarnya setara, karena mereka hanya offset yang berbeda? Mengapa kita memiliki kedua nilai itu? Dan Anda bisa menambahkan bahwa pengaturan kebaikan suatu proses <0 memerlukan hak root.
Byte Commander
27

Apa Prioritas dan Mengapa Saya Harus Peduli?

Ketika berbicara tentang proses, prioritas adalah tentang mengatur waktu prosesor. Prosesor atau CPU seperti juggling manusia beberapa tugas pada saat yang sama. Kadang-kadang kita dapat memiliki ruang yang cukup untuk melakukan beberapa proyek. Terkadang kita hanya bisa fokus pada satu hal pada satu waktu. Di lain waktu, sesuatu yang penting muncul dan kami ingin mencurahkan seluruh energi kami untuk menyelesaikan masalah itu sambil meletakkan tugas-tugas yang kurang penting di back burner.

Di Linux kita dapat menetapkan pedoman untuk diikuti CPU ketika sedang melihat semua tugas yang harus dilakukan. Pedoman ini disebut kebaikan atau nilai bagus. Skala kebaikan Linux berubah dari -20 ke 19. Semakin rendah angkanya, semakin prioritas tugas itu. Jika nilai kebaikannya tinggi seperti 19, tugas akan ditetapkan ke prioritas terendah dan CPU akan memprosesnya kapan pun ada kesempatan. Nilai bagus default adalah nol.

Dengan menggunakan skala ini kita dapat mengalokasikan sumber daya CPU kita dengan lebih tepat. Program dengan prioritas lebih rendah yang tidak penting dapat diatur ke nilai bagus yang lebih tinggi, sementara program prioritas tinggi seperti daemon dan layanan dapat diatur untuk menerima lebih banyak fokus CPU. Anda bahkan dapat memberi pengguna tertentu nilai bagus yang lebih rendah untuk semua prosesnya sehingga Anda dapat membatasi kemampuan mereka untuk memperlambat layanan inti komputer.

Sumber

Tetapkan prioritas untuk proses baru dengan nice, mis

nice -n 10 firefox

untuk proses yang ada

renice 10 -p $(pgrep firefox)

Untuk menetapkan prioritas yang <0Anda butuhkan sudo, misalnya:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

tetapi tidak untuk prioritas >=0


Contoh

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

Contoh lainnya

Untuk memperbaiki semua proses yang berjalan untuk pengguna tertentu

renice 20 -u user_name
AB
sumber
Dalam contoh Anda, renice 10itu juga akan bekerja tanpa sudo, kan? Dan bisakah Anda menambahkan contoh untuk membuat semua proses pengguna tertentu lebih menyenangkan? Itu akan sangat berguna jika orang lain masuk pada saat yang sama dan menjalankan beberapa proses yang tidak perlu tetapi memakan sumber daya (seperti flash-game yang dijeda di Firefox, saudara kecil melakukan hal-hal seperti ...: - /)
Byte Komandan
@ByteCommander selesai =)
AB
Bagaimana cara mengembalikan nilai kebaikan lama dari pengguna itu setelah beberapa saat? Pengaturan kembali ke 0? Itu tidak akan mempertimbangkan bahwa beberapa proses mungkin memiliki nilai kebaikan yang berbeda sebelumnya. Apakah ada kemungkinan sederhana untuk melakukan ini?
Byte Commander
@ ByteCommander Tidak, ini tidak sederhana. Baik Anda menggunakan 0atau ... ada masalahnya;)
AB
2
Setelah renice -19, hasilnya dengan psadalah :, PRI: 38, NI: -19namun, dengan topitu PR:1, NI -19mengapa?
bangun
14

Jawaban singkat

PR adalah level prioritas. Semakin rendah PR, semakin tinggi prioritas proses.

PR dihitung sebagai berikut:

  • untuk proses normal: PR = 20 + NI (NI bagus dan berkisar -20 hingga 19)
  • untuk proses waktu nyata: PR = - 1 - real_time_priority (real_time_priority berkisar dari 1 hingga 99)

Jawaban panjang

Ada 2 jenis proses, yang normal dan waktu nyata Untuk yang normal (dan hanya untuk itu), bagus diterapkan sebagai berikut:

Bagus

Skala "kebaikan" berubah dari -20 ke 19, sedangkan -20 adalah prioritas tertinggi dan 19 prioritas terendah. Tingkat prioritas dihitung sebagai berikut:

PR = 20 + NI

Di mana NI adalah level yang bagus dan PR adalah level prioritas. Jadi seperti yang bisa kita lihat, -20 sebenarnya memetakan ke 0, sedangkan 19 memetakan ke 39.

Secara default, nilai program bagus adalah 0, tetapi dimungkinkan bagi pengguna root untuk meluncurkan program dengan nilai bagus yang ditentukan dengan menggunakan perintah berikut:

nice -n <nice_value> ./myProgram 

Waktu sebenarnya

Kita bisa melangkah lebih jauh. Prioritas yang bagus sebenarnya digunakan untuk program pengguna. Sedangkan prioritas keseluruhan UNIX / LINUX memiliki kisaran 140 nilai, nilai bagus memungkinkan proses untuk memetakan ke bagian terakhir dari rentang (dari 100 hingga 139). Persamaan ini membuat nilai dari 0 hingga 99 tidak dapat dijangkau yang akan sesuai dengan level PR negatif (dari -100 ke -1). Untuk dapat mengakses nilai-nilai itu, proses harus dinyatakan sebagai "waktu nyata".

Ada 5 kebijakan penjadwalan di lingkungan LINUX yang dapat ditampilkan dengan perintah berikut:

chrt -m 

Yang akan menampilkan daftar berikut:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Proses penjadwalan dapat dibagi menjadi 2 kelompok, kebijakan penjadwalan normal (1 hingga 3) dan kebijakan penjadwalan waktu nyata (4 dan 5). Proses waktu nyata akan selalu memiliki prioritas di atas proses normal. Proses waktu nyata dapat dipanggil menggunakan perintah berikut (Contohnya adalah bagaimana mendeklarasikan kebijakan SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Untuk mendapatkan nilai PR untuk proses waktu nyata, persamaan berikut ini diterapkan:

PR = -1 - rt_prior

Dimana rt_prior sesuai dengan prioritas antara 1 dan 99. Untuk alasan itu proses yang akan memiliki prioritas lebih tinggi daripada proses lain akan disebut dengan nomor 99.

Penting untuk dicatat bahwa untuk proses waktu nyata, nilai yang bagus tidak digunakan.

Untuk melihat "kebaikan" saat ini dan nilai PR dari suatu proses, perintah berikut ini dapat dijalankan:

top

Yang menunjukkan output berikut:

masukkan deskripsi gambar di sini

Pada gambar, nilai PR dan NI ditampilkan. Adalah baik untuk mencatat proses dengan nilai PR -51 yang sesuai dengan nilai waktu nyata. Ada juga beberapa proses yang nilai PR-nya dinyatakan sebagai "rt". Nilai ini sebenarnya sesuai dengan nilai PR -100.

Agustin Barrachina
sumber