Saya melihat angka di atas 400.000 mengapa begitu? Apakah ini menunjukkan ada sesuatu yang salah?


14

Hari ini saya hanya memperhatikan bahwa ID proses saya sangat tinggi, yaitu 400.000 (yaitu 449624). Ketika saya berlari ps -ef | more, saat itulah saya menyadarinya. Apakah itu normal atau apakah itu menunjukkan masalah? Kalau tidak, skrip berjalan dengan baik.

Saya menggunakan Redhat 7,3 x64 bit.

Satu hal lain yang saya perhatikan adalah bahwa kami juga memiliki Redhat 7.2 dan pidsnya tidak terlalu tinggi, hanya pada OS yang lebih baru. Kenapa bisa begitu? Apakah ini berarti OS terkait dan normal?

Saya tidak punya itu kernel_pid_maxdi saya sysctl.conf. Saya berlari kucing /proc/sys/kernel/pid_maxdan saya melihat 458752.


Anda tidak memiliki kernel_pid_maxdi Anda sysctl.confkarena harus kernel.pid_max.
JRFerguson

ID proses besar hanya berarti Anda telah memulai banyak proses sejak mesin di-boot. Setiap kali suatu proses dimulai, kernel memberikan ID proses yang tersedia berikutnya yang lebih besar daripada yang baru-baru ini digunakan, berguling ketika Anda mencapai maksimum.
chepner

Jawaban:


19

Saat boot, kernel menyesuaikan default pid_maxtergantung pada jumlah CPU yang tersedia. Ketika angkanya rendah, 32768 yang biasa dipilih. Lain perhitungan dilakukan sebagai berikut (menunjukkan di sini kernel 3,10 mirip dengan RHEL tetapi di samping beberapa variasi itu sama untuk setiap kernel Linux baru-baru ini):

include/linux/threads.h:

/ *
 * Ini mengontrol pid maksimum default yang dialokasikan untuk suatu proses
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 adalah nilai yang biasa digunakan pada sistem dengan kurang dari 32 thread cpu yang tersedia.

dan kemudian:

#define PIDS_PER_CPU_DEFAULT 1024

Nilai-nilai itu kemudian digunakan di kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

dan kemudian :

    / * default bump dan pid_max minimum berdasarkan jumlah CPU * /
    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: default:% u minimum:% u \ n", pid_max, pid_max_min);

Jadi dari OP ini berarti total 458752/1024 = 448 utas simultan tersedia: cukup banyak. Sistem lain mungkin tidak memiliki banyak CPU / core / threads dll, sehingga memiliki standar yang lebih rendah pid_max.


1
contoh: SuperServer 7089P-TR4T memiliki 224 core jadi 448 thread.
AB

16

Dari yang procdocumentaton :

Pada platform 32-bit, 32768 adalah nilai maksimum untuk pid_max. Pada sistem 64-bit, pid_max dapat diatur ke nilai apa pun hingga 2 ^ 22 (PID_MAX_LIMIT, sekitar 4 juta).

Anda dapat melihat dengan cat /proc/sys/kernel/pid_max. Anda juga dapat menanyakan ini dengan sysctl.

sudo sysctl -a | grep kernel.pid_max

Atau:

sysctl -n kernel.pid_max

Ubah /etc/sysctl.confuntuk mengubah nilai secara permanen dan memuat ulang dengan sysctl -p.


7

ID proses dapat berupa nilai apa pun yang diwakili oleh pid_tjenisnya, yang khusus untuk sistem operasi Anda. Dalam praktiknya, biasanya integer bertanda 32-bit, yang berarti ID proses maksimum adalah 2147483647, atau sekitar 5000 kali lebih besar dari ID proses yang Anda amati.

The dokumentasi GNU mengatakan:

Tipe Data: pid_t

The pid_ttipe data adalah tipe integer ditandatangani yang mampu mewakili ID proses. Di Perpustakaan C GNU, ini adalah int.

Dalam praktiknya, kernel biasanya akan memberlakukan batas atas yang lebih rendah dari itu. Pada sistem Linux, ini dikontrol oleh /proc/sys/kernel/pid_max, yang standarnya adalah 32768. Jika sistem Anda adalah Linux, Anda dapat memeriksa file itu untuk melihat berapa batas saat ini.

Batasnya mungkin berbeda pada sistem operasi yang berbeda; misalnya, tampaknya pada macOS, PID_MAXhardcoded sebagai 99999 .


3
Linux memiliki alasan API yang mendasar mengapa pid tidak dapat mengisi ruang 31-bit; 2 bit teratas (selain bit tanda) dicadangkan untuk keperluan khusus di antarmuka futex dan PI futex yang kuat. Itu hanya menyisakan 29 bit, untuk ruang pid 512M.
R .. GitHub BERHENTI MEMBANTU ICE

1
@ R .: Tentu, itu berlaku untuk Linux. Tetapi ketika saya menulis jawaban ini, pertanyaan itu tidak menentukan Linux, jadi saya memberikan jawaban untuk Unix apa pun. Sejauh yang saya tahu, tidak ada dalam standar POSIX yang membutuhkan ukuran tertentu untuk pids; sepertinya tidak perlu sekarang tapi saya bisa membayangkan sistem masa depan di mana pid_t64-bit dalam ukuran.
Daniel Pryden

Memang itu semua benar.
R .. GitHub BERHENTI MEMBANTU ICE
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.