ฉันเห็นจำนวนมากกว่า 400,000 ที่เป็นสาเหตุ มันบ่งบอกว่ามีบางอย่างผิดปกติหรือไม่?


14

วันนี้ฉันเพิ่งสังเกตว่ารหัสกระบวนการของฉันสูงมากใน 400,000 (เช่น 449624) เมื่อฉันวิ่งps -ef | moreนั่นคือเมื่อฉันสังเกตเห็นมัน เป็นเรื่องปกติหรือไม่หรือที่บ่งบอกถึงปัญหา มิฉะนั้นสคริปต์จะทำงานได้ดี

ฉันใช้ Redhat 7.3 x64 บิต

อีกสิ่งหนึ่งที่ฉันสังเกตเห็นคือเรายังมี Redhat 7.2 และ pids นั้นไม่สูงเพียงแค่ระบบปฏิบัติการรุ่นใหม่ ทำไมถึงเป็นเช่นนั้น? มันหมายความว่ามันเกี่ยวข้องกับระบบปฏิบัติการและปกติหรือไม่?

ผมไม่ได้ว่าในของฉันkernel_pid_max sysctl.confฉันวิ่งแมวและฉันเห็น/proc/sys/kernel/pid_max458752


คุณไม่จำเป็นต้องkernel_pid_maxในของคุณเพราะมันควรจะเป็นsysctl.conf kernel.pid_max
JRFerguson

รหัสกระบวนการขนาดใหญ่หมายถึงคุณได้เริ่มต้นกระบวนการจำนวนมากตั้งแต่เครื่องถูกบูท แต่ละครั้งที่กระบวนการเริ่มต้นเคอร์เนลจะกำหนด ID กระบวนการที่มีอยู่ถัดไปให้ใหญ่กว่ากระบวนการที่ใช้ล่าสุดซึ่งจะพลิกมาเมื่อถึงระดับสูงสุด
chepner

คำตอบ:


19

ในการบูตเคอร์เนลจะปรับค่าเริ่มต้นpid_maxขึ้นอยู่กับจำนวนของ CPU ที่มีให้ เมื่อหมายเลขต่ำ 32768 ปกติจะถูกเลือก มิฉะนั้นการคำนวณจะทำดังต่อไปนี้ (แสดงเคอร์เนล 3.10 ให้คล้ายกับ RHEL แต่นอกเหนือจากการเปลี่ยนแปลงบางอย่างมันก็เหมือนกันสำหรับเคอร์เนล Linux ล่าสุด):

include/linux/threads.h:

/ *
 * สิ่งนี้จะควบคุม pid สูงสุดเริ่มต้นที่จัดสรรให้กับกระบวนการ
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 เป็นค่าปกติที่ใช้กับระบบที่มีเธรด cpu น้อยกว่า 32 รายการ

และหลังจากนั้น:

#define PIDS_PER_CPU_DEFAULT 1024

ค่าเหล่านั้นจะถูกใช้ในkernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

และต่อมา :

    / * bump เริ่มต้นและ pid_max ขั้นต่ำขึ้นอยู่กับจำนวน cpus * /
    pid_max = นาที (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: ค่าเริ่มต้น:% u ขั้นต่ำ:% u \ n", pid_max, pid_max_min);

ดังนั้นจาก OP สิ่งนี้ควรหมายถึงจำนวนทั้งหมด 458752/1024 = 448 เธรดพร้อมกัน: ค่อนข้างมาก ระบบอื่น ๆ ที่มีอาจจะไม่ได้เป็นซีพียูหลาย / แกน / หัวข้ออื่น ๆ pid_maxเพื่อให้มีการเริ่มต้นที่ต่ำกว่า


1
ตัวอย่าง: SuperServer 7089P-TR4Tมี 224 แกนดังนั้น 448 เธรด
AB

16

จากdocumentaton :proc

บนแพลตฟอร์ม 32 บิต 32768 เป็นค่าสูงสุดสำหรับ pid_max บนระบบ 64 บิต pid_max สามารถตั้งค่าใด ๆ ได้สูงสุด 2 ^ 22 (PID_MAX_LIMIT ประมาณ 4 ล้าน)

cat /proc/sys/kernel/pid_maxท่านสามารถเข้าดูด้วย sysctlนอกจากนี้คุณยังสามารถสอบถามนี้กับ

sudo sysctl -a | grep kernel.pid_max

หรือ:

sysctl -n kernel.pid_max

ปรับเปลี่ยนเพื่อเปลี่ยนค่าอย่างถาวรและโหลดด้วย/etc/sysctl.confsysctl -p


7

ID กระบวนการสามารถเป็นค่าใด ๆ ที่แสดงโดยpid_tชนิดซึ่งเป็นค่าเฉพาะสำหรับระบบปฏิบัติการของคุณ ในทางปฏิบัติโดยปกติจะเป็นจำนวนเต็มแบบ 32 บิตซึ่งหมายความว่ารหัสกระบวนการสูงสุดจะเป็น 2147483647 หรือใหญ่กว่า ID กระบวนการที่คุณสังเกตเห็นประมาณ 5000 เท่า

เอกสาร GNUพูดว่า:

ชนิดของข้อมูล: pid_t

pid_tชนิดข้อมูลเป็นชนิดจำนวนเต็มลงนามซึ่งเป็นความสามารถในการเป็นตัวแทนของ ID กระบวนการ ใน C Library GNU intนี้เป็น

ในทางปฏิบัติเคอร์เนลมักจะบังคับใช้ขีด จำกัด บนซึ่งต่ำกว่านั้น บนระบบ Linux สิ่งนี้ถูกควบคุมโดย/proc/sys/kernel/pid_maxซึ่งมีค่าเริ่มต้นเป็น 32768 หากระบบของคุณเป็น Linux คุณสามารถตรวจสอบไฟล์นั้นเพื่อดูว่าขีด จำกัด ปัจจุบันคืออะไร

ขีด จำกัด อาจแตกต่างกันในระบบปฏิบัติการที่แตกต่างกัน ตัวอย่างก็ปรากฏว่าใน MacOS, PID_MAXเป็น hardcoded เป็น 99999


3
Linux มีเหตุผลพื้นฐาน API ที่ pids ไม่สามารถเติมเต็มพื้นที่ 31 บิตได้ บิต 2 อันดับแรก (นอกเหนือจากเครื่องหมายบิต) ถูกสงวนไว้สำหรับวัตถุประสงค์พิเศษในอินเทอร์เฟซ futex และ PI futex ที่แข็งแกร่ง ซึ่งเหลือเพียง 29 บิตสำหรับพื้นที่ pid 512M
.. GitHub หยุดช่วยเหลือน้ำแข็ง

1
@R .: แน่นอนว่าเป็นจริงสำหรับ Linux แต่เมื่อฉันเขียนคำตอบนี้คำถามไม่ได้ระบุ Linux ดังนั้นฉันจึงให้คำตอบสำหรับ Unix ใด ๆ เท่าที่ฉันรู้ไม่มีอะไรในมาตรฐาน POSIX ที่ต้องมีขนาดเฉพาะสำหรับ pids; ดูเหมือนไม่จำเป็นตอนนี้ แต่ฉันสามารถจินตนาการถึงระบบในอนาคตที่pid_tมีขนาด 64 บิต
Daniel Pryden

แน่นอนว่าเป็นเรื่องจริงทั้งหมด
.. GitHub หยุดช่วยเหลือน้ำแข็ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.