कैसे पता लगाने के लिए कि क्या आइसोलिपस सक्रिय है?


15

कैसे पता लगाया जाए कि आइसोलेकस सक्रिय है और किस cpus पर, उदाहरण के लिए जब आप पहली बार किसी सर्वर पर कनेक्ट होते हैं। शर्तेँ:

यह देखने के लिए कोई प्रक्रिया नहीं बताई गई है कि यह कहां माइग्रेट किया जाएगा।

उपयोग का मामला यह है कि isolcpus=1-76 कोर i7 पर, बूट पर आइसोलिपस को सक्रिय नहीं करने के लिए लगता है, और मैं यह जानना चाहूंगा कि क्या यह संभव है /proc/, /sysया किसी भी कर्नेल इंटर्नल जो कि यूजरस्पेस में पढ़ा जा सकता है, आइसोलेकस की सक्रियता की स्पष्ट स्थिति प्रदान करने के लिए और जो सीपीयू चिंतित हैं। या यहां तक ​​कि शेड्यूलर की सक्रिय सेटिंग भी पढ़ें जो आइसोप्लेकस द्वारा पहले चिंतित है।

विचार करें कि अपटाइम इतना बड़ा है, कि dmesgस्टार्टअप पर किसी भी त्रुटि का पता लगाने के लिए कोई अधिक प्रदर्शित बूट लॉग नहीं है। " कर्नेल सीएमडी लाइन को देखो " जैसे मूल उत्तर को स्वीकार नहीं किया जाएगा :)


1
क्या आप उपयोग कर सकते हैं pidstat -C isolcpus? pidstat sysstatपैकेज से है।
तीमुथियुस पुलिअम

2
Im dumb हो सकता है, लेकिन मुझे pidstatऔर के बीच कोई लिंक दिखाई नहीं देता है isolcpus। क्या आप थोड़ा और विस्तृत कर सकते हैं?
netmonk 15

आप कहते हैं कि आपको यह पता होना चाहिए कि CPU किस कमांड पर चल रहा है। मुझे नहीं पता कि क्या isolcpusहै, लेकिन pidstatआपको बता सकता है कि यदि आप -C process_nameध्वज को पास करते हैं तो सीपीयू क्या चल रहा है । उदाहरण के लिए pidstat -C topनिम्नलिखित उत्पादन करता है। 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
तीमुथियुस पुलिअम

2
ठीक है आपके उत्तर के लिए धन्यवाद। isolcpusएक कर्नेल पैरामीटर है, जो अनुसूचक को अलग-थलग होने पर किसी भी प्रक्रिया को स्वयं से स्थानांतरित नहीं करने के लिए मजबूर करता है। isolcpus=1-7कर्नेल कमांड लाइन में एक 8 सीपीयू सर्वर पर छूट के लिए, केवल सीपीयू 0 पर चलने के लिए इनिट और शेल में किसी भी प्रकार की कमांड के लिए सभी स्पॉन्ड प्रक्रिया को बाध्य किया जाएगा। एक पृथक सीपीयू पर एक कार्य चलाने के लिए, आपको इसे छूट के साथ लॉन्च करने की आवश्यकता है taskset। इसलिए मैं जो पूछ रहा हूं, उसके संबंध में, ऐसा लगता है कि आपका उत्तर विषय से बाहर है। वैसे भी मुझे जवाब देने की कोशिश करने के लिए धन्यवाद
netmonk

1
ऐसा कुछ वास्तव में मुश्किल नहीं होना चाहिए ....
user997112

जवाबों:


17

आप इस वर्चुअल फ़ाइल के अंदर क्या देखना चाहते हैं:

/sys/devices/system/cpu/isolated

और में उल्टा

/sys/devices/system/cpu/present    // Thanks to John Zwinck

से drivers/base/cpu.cहम देखते हैं कि स्रोत दिखाया गया कर्नेल चर रहा है cpu_isolated_map:

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

और cpu_isolated_mapवास्तव kernel/sched/core.cमें बूट पर सेट हो जाता है :

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

लेकिन जैसा कि आपने देखा, किसी को प्रक्रियाओं की आत्मीयता को संशोधित किया जा सकता है, जिसमें डेमॉन-स्पॉन्ड्स शामिल हैं cron, systemdऔर इसी तरह। यदि ऐसा होता है, तो नई प्रक्रियाओं को संशोधित आत्मीयता मुखौटा विरासत में मिला होगा, न कि एक सेट द्वारा isolcpus

तो उपरोक्त isolcpusआपको अनुरोध के अनुसार देगा , लेकिन यह अभी भी सहायक नहीं हो सकता है।

यह मानते हुए कि आपको पता चला है कि isolcpusजारी किया गया है, लेकिन "लिया" नहीं गया है, इस अवांछित व्यवहार को किसी प्रक्रिया द्वारा यह महसूस किया जा सकता है कि यह केवल इसके लिए बाध्य है CPU=0, यह मानना ​​है कि यह गलती से मोनोप्रोसेसर मोड में है, और मदद करने के लिए "चीजों को सेट करने" का प्रयास कर रहा है। सही "आत्मीयता मुखौटा को रीसेट करके। यदि ऐसा था, तो आप 1-6 के बजाय CPUS 0-5 को अलग करने का प्रयास कर सकते हैं, और देखें कि क्या यह काम करता है।


1
Centos 7.x पर परीक्षण किया गया है, ध्यान दें कि /sys/devices/system/cpu/possibleआप 'रिवर्स' की व्याख्या कैसे करते हैं, इसके आधार पर 'रिवर्स' नहीं दिखता है। उदाहरण के लिए यदि .../cpu/isolatedरिटर्न 2,4क्योंकि वे अलग-थलग पड़ गया था, .../cpu/possibleवापसी होगी 0-191
बगुरा

1
मुझे लगता है कि अधिकांश लोग चाहते हैं /sys/devices/system/cpu/presentकि कौन से सीपीयू मौजूद हों, बल्कि यह /sys/devices/system/cpu/possibleबताए कि कौन से सीपीयू संभवतः मौजूद हो सकते हैं (लेकिन वर्तमान में मौजूद नहीं हो सकते हैं)। कुछ प्रणालियों पर वे समान हैं, लेकिन यहां तक ​​कि एक बहुत ही बुनियादी डेस्कटॉप पर मैंने जाँच की, वे नहीं हैं।
जॉन Zwinck

@ जॉन्ज्विनक अच्छी कैच। संशोधित उत्तर
LSerni

1
आइसोप्लेकस = 0 और 4 कोर के साथ, मैं / पृथक = 0 और वर्तमान = 0-3 प्राप्त कर रहा हूं।
स्टीफन रीच

10

अगर पता लगाने के लिए आसान तरीकों में से एक isolcpusपरामर्श है procदेखने के लिए जो पैरामीटर क्रम में कर्नेल में पारित किए गए।

उसके लिए, आप उपयोग करेंगे:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

जैसा कि आप देख सकते हैं, इस विशेष उदाहरण isolcpus=2,3में रनिंग कर्नेल के तर्क के रूप में पारित किया गया था।

आप tasksetPID 1 को इंगित कर सकते हैं । चूंकि PID 1 कर्नेल द्वारा शुरू किए गए पहले कार्य के लिए मानक PID है, हम एक बहुत अच्छे संकेत के रूप में ले सकते हैं कि यह प्रतिबिंबित करेगा कि क्या हमारे पास isolcpusकाम है। जैसे की:

$taskset -cp 1
pid 1's current affinity list: 0,1

lscpuएक ही सर्वर में कमांड के साथ तुलना :

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

जैसा कि देखा जा सकता है, lscpu4 सीपीयू / कोर tasksetदिखा रहा है , जबकि केवल 0,1 दिखा रहा है, इसलिए यह शो isolcpusयहां काम कर रहा है।

पर एक नज़र है: कैसे चल रही प्रक्रिया के लिए अनन्य सीपीयू उपलब्धता सुनिश्चित करने के लिए?


उत्तर देने के लिए धन्यवाद सर, लेकिन मैं इसे स्वीकार नहीं करूंगा। मैंने निर्दिष्ट किया कि कर्नेल कमांड लाइन के बारे में बात करने वाला उत्तर स्वीकार नहीं किया जाएगा। मुझे स्पष्ट रूप से पता /proc/cmdlineहै कि grub.confफ़ाइल की सामग्री की सटीक प्रतिलिपि कौन सी है । यह वह नहीं है जो मैंने पूछा! वैसे भी धन्यवाद !
netmonk

मैंने जवाब में जोड़ा है।
रुई एफ रिबेरो

1
किसी ने पहले कार्यपत्रक के साथ प्रक्रिया की आत्मीयता को संशोधित किया है? क्या होगा यदि कोई केवल cpu 0 के लिए init संबंध स्थापित करता है, क्या यह मुझे सक्रियण के बारे में कोई जानकारी देता है या पृथक cpu की नहीं?
netmonk

1

आप वर्तमान शेल प्रक्रिया के लिए Cpus_allowed और Cpus_allowed_list देख सकते हैं कि cpus क्या आरक्षित थे

cat /proc/$$/status|tail -6

उदाहरण के लिए

Cpus_allowed_list:      0-1, 3-5

इसका मतलब है कि cpu = 2 isolcpus6 cpus सर्वर पर आरक्षित था


2
दरअसल नहीं। यह दिखाता है कि सीपीयू वर्तमान शेल प्रक्रिया द्वारा विरासत में प्राप्त आत्मीयता मुखौटा में क्या हैं । यदि ऐसा था, तो कहो, sshऔर एक ने स्वयं को माता-पिता sshdके सीपीयू 1 के लिए आत्मीयता को सीमित कर दिया था , आपको हमेशा सीपीयू 1 दिखाई देगा, चाहे isolcpus"लिया" था या नहीं। $$शाखा आप इस प्रक्रिया को विरासत में मिला मूल्यों, नहीं मूल प्रणाली लोगों देता है।
एलसर्नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.