'Öncelik' ile 'öncelik' süreci


104

Çalıştırırken top, bu (kısaltılmış) örnek çıktıyı görebiliyorum:

  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

İlgilendiğim iki değer var: PR(Öncelik) ve NI(Hassasiyet).

Neyi doğru bulduğumu anladıysam, her ikisi de bir işlemin diğer işlemlerin aksine ne kadar CPU zamanı alacağını belirler. Peki bu değerler arasındaki fark nedir?

Lütfen bir sürecin bu değerlerini nasıl kullanacağınızı ve bunun hangi durumlarda yararlı olabileceğini de açıklayabilir misiniz?

Yanıtlar:


103

İyi değer bir kullanıcı alanıdır ve öncelik PR, Linux çekirdeği tarafından kullanılan işlemin gerçek önceliğidir. Linux sisteminde öncelikler 0 ila 139'dur; bunun içinde gerçek zamanlı 0 ila 99, kullanıcılar için 100 ila 139'dur. hoş değer aralığı -20 ila +19'dur, burada -20 en yüksek, 0 varsayılan ve +19 en düşüktür. güzel değer ve öncelik arasındaki ilişki şöyledir:

PR = 20 + NI

bu nedenle, PR = 20 + (-20 to +19)0 ile 39 arasında olan değer, 100 ile 139 arasında eşleşir.

En üst kılavuza göre:

PR - Öncelik Görevin zamanlama önceliği. Bu alanda 'rt' görürseniz, görevin 'gerçek zamanlı' zamanlama önceliği altında çalıştığı anlamına gelir.

NI, görevin iyi bir değeri.

NI - Nice Value Görevin güzel değeri. Olumsuz bir değer daha yüksek öncelik anlamına gelirken, olumlu bir değer daha düşük öncelik anlamına gelir.

Düzenleme: Linux'ta bir program başlatıldığında varsayılan olarak, '0' önceliği ile başlatılır. Ancak, programlarınızın önceliğini aşağıdaki yöntemlerden birini kullanarak değiştirebilirsiniz.

  1. Kullanarak istediğiniz önceliği olan bir programı başlatabilirsiniz.

    nice -n nice_value program_name
    
  2. Ayrıca, çalışmakta olan bir işlemin önceliğini kullanarak

    renice -n nice_value -p process_id
    

1
Bunların neredeyse tersi olarak aynı şeyleri olduğunu mu söylüyorsunuz (her ikisi de önceliği temsil eder) AMA nicenessnegatif bir öncelik vermek için kullanılabilir, böylece nicenessyüksek öncelikli görevlerin önüne geçmek için görev kullanılabilir mi? (yani, nicediğer erişim kaynaklarının olması ve izin verilmesi mi? Yoksa bu sadece kafamı karıştırdı mı?
Mark Kirby

1
Ne demek istediğimin bir örneği, her ikisi de pr20 olan , her ikisi de eşit olan, görev 1'in ni0'a sahip olduğu ve görev iki'nin ni20'sinin olduğu, yani bu, görevin ikinci görevin birinci için kaynakları vereceği anlamına gelir;nicer
Mark Kirby,

1
Bildiğim gibi, PR = 20 + NI olarak hesaplanan öncelik. bu yüzden görev bir öncelik = 20 +0. iyi
niyetin

3
PR = 20 + NI maksimum değer 39 olabilir. Aslında linux sisteminde 0 ile 99 arasında gerçek zamanlı öncelik olan 139 kullanıcı ve 100 ile 139 arasında bir kullanıcı var. bu nedenle, NI değeri -20 ila +19, öncelik 100 ila 139'a eşlenir. Ayarlayabileceğinizi ama yine de çekirdeği NI değerini değiştirip değiştirmeyeceğinizden emin değilsiniz, o zaman önceliği değiştirecek, NI değeri çekirdeğe verilecek bir öneri. çekirdek biraz zaman yoksay
pl_rock

1
Öyleyse PR ve NI aslında eşdeğerdir, çünkü sadece farklı bir ofset var mı? Öyleyse neden iki değerimiz var? Ve bir işlemin <0 ayarının güzelliğini kök hakları gerektirdiğini de ekleyebilirsiniz.
Byte Commander

26

Öncelik nedir ve neden umursamalıyım?

İşlemlerden bahsederken öncelik, işlemci zamanını yönetmekle ilgilidir. İşlemci veya CPU, aynı anda birden fazla görevi gerçekleştiren bir insan gibidir. Bazen birden fazla projeye başlayacak kadar yerimiz olabilir. Bazen bir anda sadece bir şeye odaklanabiliriz. Diğer zamanlarda önemli bir şey ortaya çıkar ve tüm enerjimizi arkadaki brülöre daha az önemli görevler koyarken bu problemi çözmeye adamak isteriz.

Linux'ta CPU'nun yapması gereken tüm görevlere bakarken izlemesi için kurallar koyabiliriz. Bu kurallara nezaket veya nezaket değeri denir. Linux incelik ölçeği -20 ila 19 arasındadır. Sayı ne kadar düşük olursa, o iş o kadar öncelik kazanır. Nezaket değeri 19 gibi yüksek bir sayı ise, görev en düşük önceliğe ayarlanacak ve CPU bir şans yakalandığında işleyecektir. Varsayılan değer sıfırdır.

Bu ölçeği kullanarak CPU kaynaklarımızı daha uygun bir şekilde tahsis edebiliriz. Önemli olmayan düşük öncelikli programlar, daha iyi bir değere ayarlanabilirken, artalan ve servisler gibi yüksek öncelikli programlar CPU'nun odağını daha fazla alacak şekilde ayarlanabilir. Belirli bir kullanıcıya tüm işlemleri için daha düşük bir değer bile verebilir, böylece bilgisayarın çekirdek hizmetlerini yavaşlatma yeteneklerini sınırlayabilirsiniz.

Kaynak

niceÖrneğin, yeni işlemler için önceliği belirleyin

nice -n 10 firefox

mevcut işlemler için

renice 10 -p $(pgrep firefox)

<0İhtiyacınız olan önceliği belirlemek için sudo, örneğin:

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

ama öncelik için değil >=0


Örnek

% 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

Diğer örnek

Çalışan tüm işlemleri belirli bir kullanıcı için iptal etmek için

renice 20 -u user_name

Örneğinizde renice 10bu da olmazdı sudo, değil mi? Ve lütfen belirli bir kullanıcının tüm işlemlerini daha iyi hale getirmek için bir örnek ekler misiniz? Aynı anda başka biri de giriş yaptıysa ve gereksiz ama kaynak tüketen bazı işlemlere sahipse (Firefox’ta duraklatılmış bir flash oyunu gibi, küçük kardeşler böyle şeyler yaparsa ... ... - /)
Byte Komutan

@ByteCommander yapılır =)
AB

Bir süre sonra bu kullanıcının eski incelik değerlerini nasıl geri yüklerim? 0'a mı dönüyorsunuz? Bu, bazı işlemlerin daha önce farklı bir incelik değerine sahip olabileceğini dikkate almaz. Bunu yapmak için herhangi bir basit olasılık var mı?
Byte Commander

@ByteCommander Hayır, basit değil. Ya kullanın 0ya da… sorun var;)
AB

2
Renice -19'dan sonra, sonuç psşöyledir PRI: 38, NI: -19, ancak topbunun PR:1, NI -19nedeni nedir?
uyanık

14

Kısa cevap

PR öncelik seviyesidir. PR ne kadar düşük olursa işlem önceliği de o kadar yüksek olur.

PR aşağıdaki gibi hesaplanır:

  • normal süreçler için: PR = 20 + NI (NI iyidir ve -20 ila 19 arasındadır)
  • Gerçek zamanlı işlemler için: PR = - 1 - real_time_priority (real_time_priority 1 ile 99 arasında değişmektedir)

Uzun cevap

Normal ve gerçek zamanlı olmak üzere 2 tür işlem vardır Normal olanlar için (ve sadece olanlar için), aşağıdaki gibi güzel uygulanır:

Güzel

"Nezaket" ölçeği -20'den 19'a çıkarken, -20 en yüksek öncelik ve 19 en düşük önceliktir. Öncelik seviyesi aşağıdaki gibi hesaplanır:

PR = 20 + NI

NI güzel seviye ve PR ise öncelik seviyesidir. Gördüğümüz gibi, -20 aslında 0 ile eşlenirken, 19 39 ile eşleşiyor.

Varsayılan olarak, bir program güzel değeri 0'dır, ancak kök kullanıcının aşağıdaki komutu kullanarak belirli bir güzel değere sahip programları başlatması mümkündür:

nice -n <nice_value> ./myProgram 

Gerçek zaman

Daha da ileri gidebiliriz. Güzel öncelik aslında kullanıcı programları için kullanılır. UNIX / LINUX genel önceliğinin 140 değer aralığına sahip olmasına rağmen, hoş değer, işlemin aralığın son kısmıyla eşleşmesini sağlar (100 ile 139 arasında). Bu denklem, 0 ila 99 arasında, ulaşılamayan negatif bir PR seviyesine (-100 ila -1) karşılık gelecek şekilde bırakır. Bu değerlere ulaşabilmek için işlem “gerçek zamanlı” olarak belirtilmelidir.

LINUX ortamında aşağıdaki komutla görüntülenebilecek 5 programlama politikası vardır:

chrt -m 

Aşağıdaki liste gösterilecektir:

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

Çizelgeleme işlemleri, normal çizelgeleme politikaları (1 ila 3) ve gerçek zamanlı çizelgeleme politikaları (4 ve 5) olmak üzere 2 gruba ayrılabilir. Gerçek zamanlı süreçler her zaman normal süreçlere göre önceliğe sahip olacaktır. Aşağıdaki komut kullanılarak gerçek zamanlı bir işlem çağrılabilir (örnek, SCHED_RR politikasını nasıl bildireceğinizdir):

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

Gerçek zamanlı bir işlem için PR değerini elde etmek için aşağıdaki denklem uygulanır:

PR = -1 - rt_prior

Rt_prior, 1 ile 99 arasında önceliğe karşılık gelir. Bu nedenle, diğer işlemlere göre daha yüksek önceliğe sahip olan süreç, 99 ile adlandırılan işlem olacaktır.

Gerçek zamanlı işlemler için nezaketin kullanılmadığına dikkat etmek önemlidir.

Bir işlemin geçerli "niceliği" ve PR değerini görmek için aşağıdaki komut çalıştırılabilir:

top

Aşağıdaki çıktıyı gösterir:

görüntü tanımını buraya girin

Şekilde PR ve NI değerleri görüntülenir. Gerçek zaman değerine karşılık gelen PR -51 değerine sahip süreci not etmek iyidir. PR değeri "rt" olarak belirtilen bazı işlemler de vardır. Bu değer aslında -100 değerinde bir PR değerine karşılık gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.