2016-06-30 10 views
5

मैं RedHat 7.1 में जोड़ने के लिए "isolcpus = 3 nohz_full = 3 rcu_nocbs = 3" grub.conf में, कर्नेल: लिनक्स 3.10.0-229 गिरी और http://www.breakage.org/2013/11/15/nohz_fullgodmode/ मैं के अनुसार भी निम्न आदेश निष्पादित करें:टिकलेस कर्नेल, isolcpus, nohz_full, और rcu_nocbs

cat /sys/bus/workqueue/devices/writeback/cpumask 
f 
echo 1 > /sys/bus/workqueue/devices/writeback/cpumask 

cat /sys/bus/workqueue/devices/writeback/numa 
1 
echo 0 > /sys/bus/workqueue/devices/writeback/numa 

बॉक्स केवल 4 सीपीयू कोर होने पर, मैं निम्नलिखित खोल चलाएँ:

watch -d 'cat /proc/interrupts' 

सही काम की तरह लग रहे हैं, केवल स्थानीय टाइमर बीच में आता है cpu0 2000 प्रति 2 सेकेंड है, अन्य सी cuu 3 से pu 1 में 10 से 2 सेकेंड से कम है। में उत्पादन

taskset -c 3 ./x1.exe 

घड़ी:

और उसके बाद मैं निम्नलिखित स्रोत का परीक्षण:

void *Thread2(void *param) 
{ 
    pthread_detach(pthread_self()); 
    while(1){ 
     sleep(100000) ; 
    } 
} 

void *Thread1(void *param) 
{ 
    pthread_detach(pthread_self()); 
    while(1){ 
     ; 
    } 
} 

int main(int argc, char** argv) 
{ 
    pthread_t tid ; 
    pthread_create(&tid , NULL, Thread1, (void*)(long)3); 
    pthread_create(&tid , NULL, Thread2, (void*)(long)3); 

    while(1) 
     sleep(5) ; 
} 

और से इसे चलाने के लिए इस समय

watch -d 'cat /proc/interrupts' 

, सीपीयू 3 से 10 मिल ~ 30 स्थानीय टाइमर प्रति सेकंड सेकेंड इंटरप्ट करता है, ठीक दिखता है, तो मैं 2 थ्रेड 1 को चलाने की कोशिश करता हूं:

pthread_create(&tid , NULL, Thread1, (void*)(long)3); 
pthread_create(&tid , NULL, Thread1, (void*)(long)3); 

उसके बाद फिर से इसे चलाने:

taskset -c 3 ./x1.exe 

तो मैं घड़ी कोर 3 एक ही स्थानीय टाइमर कोर 0 से बाधित है, यह 2 सेकेंड प्रति 2000 बीच में आता है है।

क्या मैं पूछ सकता हूं, क्यों 2 बहुत व्यस्त थ्रेड 1 कोर 3 का कारण होगा अधिक टाइमर इंटरप्ट्स? यह क्या हुआ? और यह कैसे हो सकता है इसे संशोधित करने के लिए?

उत्तर

7

दूसरे मामले में, कर्नेल को कोर 3 पर 2 सीपीयू बाध्य कार्यों को शेड्यूल करने की आवश्यकता है और डायनामिक टिक कॉन्फ़िगरेशन केवल तभी लागू होता है जब बिल्कुल एक रन करने योग्य कार्य होता है। मैंने सोचा था कि SCHED_FIFO इन बीच में आता है (और इसलिए मैं जवाब देने शुरू कर दिया) बंद कर देंगे, लेकिन वह अभी तक लागू नहीं किया गया है के रूप में प्रति https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt

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

संबंधित मुद्दे