Tôi thấy pids trên 400.000 tại sao vậy? Liệu nó chỉ ra một cái gì đó là sai?


13

Hôm nay tôi chỉ nhận thấy rằng ID quá trình của tôi rất cao, trong 400.000 (tức là 449624). Khi tôi chạy ps -ef | more, đó là khi tôi nhận thấy nó. Điều đó là bình thường hay điều đó chỉ ra một vấn đề? Nếu không các kịch bản đang chạy tốt.

Tôi đang sử dụng Redhat 7.3 x64 bit.

Một điều khác tôi nhận thấy là chúng ta cũng có Redhat 7.2 và các mức giá không cao, chỉ trên hệ điều hành mới hơn. Tại sao lại như vậy? Có nghĩa là nó liên quan đến hệ điều hành và bình thường?

Tôi không có cái đó kernel_pid_maxtrong tôi sysctl.conf. Tôi chạy mèo /proc/sys/kernel/pid_maxvà tôi thấy 458752.


Bạn không có kernel_pid_maxtrong của bạn sysctl.confbởi vì nó nên được kernel.pid_max.
JRFerguson

ID tiến trình lớn chỉ có nghĩa là bạn đã bắt đầu rất nhiều quy trình kể từ khi máy được khởi động. Mỗi khi một quá trình được bắt đầu, kernel sẽ gán ID tiến trình có sẵn tiếp theo lớn hơn ID được sử dụng gần đây nhất, lăn qua khi bạn đạt đến mức tối đa.
chepner

Câu trả lời:


19

Khi khởi động, kernel điều chỉnh mặc định pid_maxtùy thuộc vào số lượng CPU có sẵn. Khi số thấp, 32768 thông thường được chọn. Khác, việc tính toán được thực hiện như sau (hiển thị ở đây một hạt nhân 3.10 tương tự như RHEL nhưng bên cạnh một số biến thể, nó giống với mọi hạt nhân Linux gần đây):

include/linux/threads.h:

/ *
 * Điều này kiểm soát pid tối đa mặc định được phân bổ cho một quá trình
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 là giá trị thông thường được sử dụng trên các hệ thống có ít hơn 32 luồng cpu.

và sau đó:

#define PIDS_PER_CPU_DEFAULT 1024

Những giá trị này sau đó được sử dụng trong kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

sau này :

    / * vết sưng mặc định và pid_max tối thiểu dựa trên số lượng cpus * /
    pid_max = phút (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: mặc định:% u tối thiểu:% u \ n", pid_max, pid_max_min);

Vì vậy, từ OP, điều này có nghĩa là tổng số 458752/1024 = 448 chủ đề đồng thời có sẵn: khá nhiều. Hệ thống khác có thể không có nhiều CPU / lõi / luồng, v.v., do đó có mặc định thấp hơn pid_max.


1
ví dụ: SuperServer 7089P-TR4T có 224 lõi nên có 450 luồng.
AB

16

Từ các procdocumentaton :

Trên nền tảng 32 bit, 32768 là giá trị tối đa cho pid_max. Trên các hệ thống 64 bit, pid_max có thể được đặt thành bất kỳ giá trị nào lên tới 2 ^ 22 (PID_MAX_LIMIT, xấp xỉ 4 triệu).

Bạn có thể thấy với cat /proc/sys/kernel/pid_max. Bạn cũng có thể truy vấn này với sysctl.

sudo sysctl -a | grep kernel.pid_max

Hoặc là:

sysctl -n kernel.pid_max

Sửa đổi /etc/sysctl.confđể thay đổi giá trị vĩnh viễn và tải lại với sysctl -p.


7

ID tiến trình có thể là bất kỳ giá trị nào được biểu thị theo pid_tloại, dành riêng cho hệ điều hành của bạn. Trong thực tế, nó thường là số nguyên có chữ ký 32 bit, có nghĩa là ID tiến trình tối đa sẽ là 2147483647, hoặc lớn hơn khoảng 5000 lần so với ID tiến trình bạn đang quan sát.

Các tài liệu GNU nói:

Kiểu dữ liệu: pid_t

Kiểu pid_tdữ liệu là kiểu số nguyên đã ký có khả năng biểu diễn ID tiến trình. Trong Thư viện GNU C, đây là một int.

Trong thực tế, hạt nhân thường sẽ thực thi một giới hạn trên thấp hơn mức đó. Trên hệ thống Linux, điều này được kiểm soát bởi /proc/sys/kernel/pid_max, mặc định là 32768. Nếu hệ thống của bạn là Linux, bạn có thể kiểm tra tệp đó để xem giới hạn hiện tại là gì.

Giới hạn có thể khác nhau trên các hệ điều hành khác nhau; ví dụ, có vẻ như trên macOS, PID_MAXđược mã hóa cứng là 99999 .


3
Linux có các lý do API cơ bản không thể lấp đầy khoảng trống 31 bit; 2 bit trên cùng (ngoài bit dấu) được dành riêng cho các mục đích đặc biệt trong giao diện Futex và PI Futex mạnh mẽ. Chỉ còn lại 29 bit, cho khoảng trống 512M.
R .. GitHub DỪNG GIÚP ICE

1
@R.: Chắc chắn, điều đó đúng với Linux. Nhưng khi tôi viết câu trả lời này, câu hỏi đã không chỉ định Linux và vì vậy tôi đã đưa ra câu trả lời cho bất kỳ Unix nào. Theo tôi biết, không có gì trong tiêu chuẩn POSIX yêu cầu kích thước cụ thể cho các nắp; bây giờ có vẻ không cần thiết nhưng tôi có thể tưởng tượng một hệ thống tương lai có pid_tkích thước 64 bit.
Daniel Pryden

Quả thực đó là tất cả sự thật.
R .. GitHub DỪNG GIÚP ICE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.