मुझे 400,000 से ऊपर के ग्रिड दिखाई देते हैं, ऐसा क्यों है? क्या यह इंगित करता है कि कुछ गलत है?


14

आज मैंने सिर्फ यह देखा कि मेरी प्रक्रिया की आईडी बहुत अधिक है, 400,000 में (अर्थात 449624)। जब मैं दौड़ता हूं ps -ef | more, तभी मैंने इस पर ध्यान दिया है। क्या यह सामान्य है या इससे समस्या का संकेत मिलता है? अन्यथा स्क्रिप्ट ठीक चल रही हैं।

मैं Redhat 7.3 x 64 बिट का उपयोग कर रहा हूं।

एक और बात जिस पर मैंने गौर किया, वह यह है कि हमारे पास रेडहैट 7.2 भी है और नए हाई ओएस पर सिर्फ इतना ही नहीं है। ऐसा क्यों होगा? इसका मतलब यह है कि यह ओएस से संबंधित और सामान्य है?

मुझे लगता है कि नहीं है kernel_pid_maxमेरे में sysctl.conf। मैंने बिल्ली को दौड़ाया /proc/sys/kernel/pid_maxऔर मैंने देखा 458752


आप की जरूरत नहीं है kernel_pid_maxअपने में sysctl.conf, क्योंकि यह होना चाहिए kernel.pid_max
JRFerguson

बड़ी प्रक्रिया आईडी का मतलब है कि आपने मशीन शुरू होने के बाद बहुत सारी प्रक्रियाएं शुरू कर दी हैं। हर बार जब कोई प्रक्रिया शुरू की जाती है, तो कर्नेल अगली उपलब्ध प्रक्रिया आईडी को सबसे हाल ही में उपयोग किए जाने वाले से बड़ा बना देता है, जब आप अधिकतम तक पहुंचते हैं तो रोलिंग करते हैं।
चेपनर

जवाबों:


19

बूट पर, कर्नेल pid_maxउपलब्ध सीपीयू की संख्या के आधार पर डिफ़ॉल्ट को समायोजित करता है। संख्या कम होने पर, सामान्य रूप से 32768 का चयन किया जाता है। गणना निम्न प्रकार से की जाती है (यहाँ 3.10 कर्नेल को RHEL के समान दिखाया गया है लेकिन कुछ भिन्नताओं के साथ यह किसी हाल के लिनक्स कर्नेल के लिए समान है):

include/linux/threads.h:

/ *
 * यह एक प्रक्रिया के लिए आवंटित डिफ़ॉल्ट अधिकतम पीआईडी ​​को नियंत्रित करता है
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL; 0x1000: 0x8000)

0x8000 = 32768 सामान्य मूल्य है जिसका उपयोग सिस्टम पर 32 cpu से कम थ्रेड उपलब्ध है।

और बादमें:

#define PIDS_PER_CPU_DEFAULT 1024

उन मूल्यों का उपयोग तब किया जाता है kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

और बाद में :

    / * बम्प डिफ़ॉल्ट और न्यूनतम pid_max 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: default:% u न्यूनतम:% u \ n", pid_max, pid_max_min);

तो ओपी से इसका मतलब कुल 458752/1024 = 448 एक साथ उपलब्ध धागे होना चाहिए: काफी। दूसरी प्रणाली में शायद अधिक सीपीयू / कोर / थ्रेड्स आदि नहीं हैं, इसलिए कम डिफ़ॉल्ट है pid_max


1
उदाहरण: सुपरसर्वर 7089P-TR4T में 224 कोर हैं इसलिए 448 धागे हैं।
एबी

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.confमान को स्थायी रूप से बदलने और पुनः लोड करने के लिए संशोधित करें sysctl -p


7

एक प्रक्रिया आईडी किसी भी pid_tप्रकार का प्रतिनिधित्व कर सकता है , जो आपके ऑपरेटिंग सिस्टम के लिए विशिष्ट है। व्यवहार में, यह आमतौर पर एक 32-बिट हस्ताक्षरित पूर्णांक है, जिसका अर्थ है कि अधिकतम प्रक्रिया आईडी 2147483647 होगी, या आपके द्वारा देखी जा रही प्रक्रिया आईडी से लगभग 5000 गुना बड़ी होगी।

जीएनयू प्रलेखन का कहना है:

डेटा प्रकार: pid_t

pid_tडेटा प्रकार एक हस्ताक्षरित पूर्णांक प्रकार जो प्रक्रिया ID प्रतिनिधित्व करने में सक्षम है। जीएनयू सी लाइब्रेरी में, यह एक है int

व्यवहार में, कर्नेल आमतौर पर एक ऊपरी सीमा लागू करेगा जो उससे कम है। लिनक्स सिस्टम पर, इसे नियंत्रित किया जाता है /proc/sys/kernel/pid_max, जो 32768 पर डिफॉल्ट करता है। यदि आपका सिस्टम लिनक्स है, तो आप उस फाइल को देख सकते हैं कि वर्तमान सीमा क्या है।

अलग-अलग ऑपरेटिंग सिस्टम पर सीमा भिन्न हो सकती है; उदाहरण के लिए, ऐसा प्रतीत होता है कि macOS पर, PID_MAX99999 के रूप में हार्डकोड किया गया है


3
लिनक्स में मूलभूत एपीआई कारण हैं जो एक 31-बिट स्थान नहीं भर सकते हैं; शीर्ष 2 बिट्स (साइन बिट के अलावा) मजबूत futex और PI futex इंटरफेस में विशेष उद्देश्यों के लिए आरक्षित हैं। 512M pid स्पेस के लिए यह केवल 29 बिट्स को छोड़ता है।
R .. गिटहब स्टॉप हेल्पिंग ICE

1
@ आर .: ज़रूर, यह लिनक्स के लिए सच है। लेकिन जब मैंने यह जवाब लिखा, तो सवाल में लिनक्स नहीं था, और इसलिए मैंने किसी भी यूनिक्स के लिए जवाब दिया। जहाँ तक मुझे पता है, पोसिक्स मानक में ऐसा कुछ भी नहीं है जिसके लिए किसी विशेष आकार की आवश्यकता हो; यह अब अनावश्यक लगता है, लेकिन मैं एक भविष्य की प्रणाली की कल्पना कर सकता हूं जहां pid_tआकार में 64-बिट था।
डैनियल प्रीडेन

वास्तव में यह सब सच है।
आर .. गिटहब स्टॉप हेल्पिंग ICE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.