Widzę stawki powyżej 400 000, dlaczego tak jest? Czy to wskazuje, że coś jest nie tak?


14

Dzisiaj zauważyłem, że moje identyfikatory procesów są bardzo wysokie, na 400 000 (tj. 449624). Kiedy biegnę ps -ef | more, wtedy to zauważyłem. Czy to normalne, czy oznacza to problem? W przeciwnym razie skrypty działają poprawnie.

Używam Redhat 7.3 x64 bit.

Inną rzeczą, którą zauważyłem, jest to, że mamy również Redhat 7.2, a stawki nie są tak wysokie, tylko w nowszym systemie operacyjnym. Dlaczego miałoby to być? Czy to oznacza, że ​​jest to związane z systemem operacyjnym i normalne?

Nie mam tego kernel_pid_maxw sobie sysctl.conf. Uruchomiłem kota /proc/sys/kernel/pid_maxi widzę 458752.


Nie masz kernel_pid_maxw sobie, sysctl.confbo tak powinno być kernel.pid_max.
JRFerguson

Duże identyfikatory procesów oznaczają po prostu, że uruchomiłeś wiele procesów od momentu uruchomienia komputera. Za każdym razem, gdy proces jest uruchamiany, jądro przypisuje następny dostępny identyfikator procesu większy niż ostatnio używany, przewracając się, gdy osiągniesz maksimum.
chepner

Odpowiedzi:


19

Podczas uruchamiania jądro dostosowuje domyślne w pid_maxzależności od liczby dostępnych procesorów. Gdy liczba jest niska, wybierane jest zwykłe 32768. W przeciwnym razie obliczenia są wykonywane w następujący sposób (pokazując tutaj jądro 3.10, które jest podobne do RHEL, ale oprócz niektórych odmian jest takie samo dla każdego ostatniego jądra Linuksa):

include/linux/threads.h:

/ *
 * Kontroluje domyślny maksymalny pid przypisany do procesu
 * /
# zdefiniować PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 jest zwykłą wartością używaną w systemach z mniej niż 32 dostępnymi wątkami procesora.

i później:

# zdefiniuj PIDS_PER_CPU_DEFAULT 1024

Wartości te są następnie używane w kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

a później :

    / * domyślnie wypukły i minimalny pid_max na podstawie liczby cpus * /
    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: domyślnie:% u minimum:% u \ n", pid_max, pid_max_min);

Tak więc z OP powinno to oznaczać łącznie 458752/1024 = 448 dostępnych jednocześnie wątków: całkiem sporo. Drugi system prawdopodobnie nie ma tak wielu procesorów / rdzeni / wątków itp., Więc ma niższą wartość domyślną pid_max.


1
przykład: SuperServer 7089P-TR4T ma 224 rdzenie, więc 448 wątków.
AB

16

Od tej procdocumentaton :

Na platformach 32-bitowych 32768 to maksymalna wartość dla pid_max. W systemach 64-bitowych pid_max można ustawić na dowolną wartość do 2 ^ 22 (PID_MAX_LIMIT, około 4 milionów).

Możesz zobaczyć z cat /proc/sys/kernel/pid_max. Możesz również zapytać o to za pomocą sysctl.

sudo sysctl -a | grep kernel.pid_max

Lub:

sysctl -n kernel.pid_max

Zmień, /etc/sysctl.confaby zmienić wartość na stałe i załaduj ponownie sysctl -p.


7

Identyfikator procesu może być dowolną wartością reprezentowaną przez pid_ttyp, który jest specyficzny dla twojego systemu operacyjnego. W praktyce jest to zwykle 32-bitowa liczba całkowita ze znakiem, co oznacza, że ​​maksymalny identyfikator procesu wynosiłby 2147483647, czyli około 5000 razy był większy niż obserwowane identyfikatory procesu.

Dokumentacja GNU mówi:

Typ danych: pid_t

Typ pid_tdanych to podpisana liczba całkowita, która może reprezentować identyfikator procesu. W bibliotece GNU C jest to plik int.

W praktyce jądro zwykle wymusza górną granicę, która jest niższa. W systemie Linux jest to kontrolowane przez /proc/sys/kernel/pid_max, domyślnie 32768. Jeśli twój system to Linux, możesz sprawdzić ten plik, aby zobaczyć, jaki jest obecny limit.

Limit może być różny w różnych systemach operacyjnych; na przykład wygląda naPID_MAX to, że w systemie macOS jest zakodowany na stałe jako 99999 .


3
Linux ma podstawowe powody API, że pids nie mogą wypełnić 31-bitowej przestrzeni; 2 górne bity (oprócz bitu znaku) są zarezerwowane do specjalnych celów w solidnych interfejsach futex i PI futex. Pozostawia to tylko 29 bitów, dla przestrzeni pid 512 MB.
R .. GitHub ZATRZYMAJ LÓD

1
@R .: Jasne, to prawda w przypadku Linuksa. Ale kiedy napisałem tę odpowiedź, pytanie nie określiło Linuksa, więc dałem odpowiedź na każdy Unix. O ile mi wiadomo, w standardzie POSIX nie ma nic, co wymagałoby określonego rozmiaru dla pid; wydaje się to teraz niepotrzebne, ale mogłem sobie wyobrazić przyszły system, pid_tktóry miałby rozmiar 64-bitowy.
Daniel Pryden

Rzeczywiście to wszystko prawda.
R .. GitHub ZATRZYMAJ LÓD
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.