400.000'in üzerindeki pids görüyorum neden bu? Bir şeyin yanlış olduğunu gösteriyor mu?


14

Bugün sadece 400.000'de (yani 449624) işlem kimliklerimin çok yüksek olduğunu fark ettim. Koştuğumda ps -ef | morefark ettim. Bu normal mi yoksa bir sorun mu gösteriyor? Aksi takdirde komut dosyaları düzgün çalışıyordur.

Redhat 7.3 x64 bit kullanıyorum.

Fark ettiğim bir diğer şey de Redhat 7.2'ye sahip olduğumuz ve pidlerin o kadar yüksek olmadığı, sadece yeni işletim sistemlerinde olduğu. Neden olsun ki? İşletim sistemi ile ilgili ve normal olduğu anlamına mı geliyor?

Bunu yok kernel_pid_maxskinTenimde sysctl.conf. Kediyi koştum /proc/sys/kernel/pid_maxve gördüm 458752.


Sen yok kernel_pid_maxGözlerinde farklı sysctl.confolması gerektiği çünkü kernel.pid_max.
JRFerguson

Büyük işlem kimlikleri, makine başlatıldığından beri birçok işleme başladığınız anlamına gelir. Bir işlem her başlatıldığında, çekirdek, en son kullanılan işlemden daha büyük olan bir sonraki kullanılabilir işlem kimliğini atar ve maksimum değere ulaştığınızda devredilir.
chepner

Yanıtlar:


19

Önyükleme sırasında, çekirdek pid_maxkullanılabilir CPU sayısına bağlı olarak varsayılanı ayarlar . Sayı düşük olduğunda, normal 32768 seçilir. Başka hesaplama şu şekilde yapılır (burada RHEL'e benzer bir 3.10 çekirdek gösteriliyor, ancak bazı varyasyonların yanı sıra son Linux çekirdeği için de aynı):

include/linux/threads.h:

/ *
 * Bu, bir işleme ayrılan varsayılan maksimum pid'i kontrol eder
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768, 32 cpu'dan az iş parçacığı bulunan sistemlerde kullanılan normal değerdir.

ve sonra:

#define PIDS_PER_CPU_DEFAULT 1024

Bu değerler daha sonra şu alanlarda kullanılır kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

ve daha sonra :

    / * cpus sayısına göre varsayılan ve minimum pid_max çarpma * /
    pid_max = min (pid_max_max, max_t (int, pid_max,
                PIDS_PER_CPU_DEFAULT * num_possible_cpus ()));
    pid_max_min = max_t (int, pid_max_min,
                PIDS_PER_CPU_MIN * num_possible_cpus ());
    pr_info ("pid_max: varsayılan: minimum% u minimum:% u \ n", pid_max, pid_max_min);

Bu nedenle OP'den toplam 458752/1024 = 448 eşzamanlı iş parçacığı mevcut olmalıdır: oldukça fazla. Diğer sistemde muhtemelen çok fazla CPU / çekirdek / iş parçacığı vb pid_max. Bulunmadığından varsayılan değer daha düşüktür .


1
örnek: SuperServer 7089P-TR4T'nin 224 çekirdeği vardır, böylece 448 dişi vardır.
AB

16

Gönderen documentaton :proc

32 bit platformlarda, pid_max için maksimum değer 32768'dir. 64 bit sistemlerde pid_max, 2 ^ 22'ye kadar herhangi bir değere ayarlanabilir (PID_MAX_LIMIT, yaklaşık 4 milyon).

İle görebilirsiniz cat /proc/sys/kernel/pid_max. Bunu ile de sorgulayabilirsiniz sysctl.

sudo sysctl -a | grep kernel.pid_max

Veya:

sysctl -n kernel.pid_max

Değiştir /etc/sysctl.confile kalıcı değer ve yeniden yüklenmesine değiştirmek için sysctl -p.


7

İşlem kimliği, pid_tişletim sisteminize özgü tür tarafından temsil edilen herhangi bir değer olabilir . Pratikte, genellikle 32 bit işaretli bir tamsayıdır, yani maksimum işlem kimliği 2147483647 veya gözlemlediğiniz işlem kimliklerinden yaklaşık 5000 kat daha büyük olur.

GNU belgeleri diyor ki:

Veri Türü: pid_t

pid_tVeri tipi bir işlem kimliğini temsil edebilen bir tamsayı türüdür. GNU C Kütüphanesinde bu bir int.

Uygulamada, çekirdek genellikle bundan daha düşük bir üst sınır uygular. Bir Linux sisteminde, bu /proc/sys/kernel/pid_maxvarsayılan olarak 32768 olarak kontrol edilir . Sisteminiz Linux ise, geçerli sınırın ne olduğunu görmek için bu dosyayı kontrol edebilirsiniz.

Sınır, farklı işletim sistemlerinde farklı olabilir; örneğin, macOS'ta PID_MAX99999 olarak sabit kodlanmış gibi görünüyor .


3
Linux'un pids'in 31 bitlik bir alanı dolduramaması için temel API nedenleri vardır; ilk 2 bit (işaret bitine ek olarak) sağlam futex ve PI futex arayüzlerinde özel amaçlar için ayrılmıştır. 512M pid alanı için sadece 29 bit kalır.
R .. GitHub BUZA YARDIMCI DURDUR

1
@R .: Elbette, Linux için bu doğru. Ama bu cevabı yazdığımda, soru Linux'u belirtmedi ve bu yüzden herhangi bir Unix için bir cevap verdim. Bildiğim kadarıyla, POSIX standardında pids için belirli bir boyut gerektiren hiçbir şey yok; şimdi gereksiz görünüyor ama pid_t64 bit büyüklüğünde bir gelecek sistemi hayal edebiliyorum .
Daniel Pryden

Gerçekten hepsi doğru.
R .. GitHub BUZA YARDIMCI DURDUR
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.