2017-07-28 16 views
5

/proc/<PID>/sched में शेड्यूलिंग आँकड़े को देख कर, आप इस तरह एक आउटपुट प्राप्त कर सकते हैं:लिनक्स - माइग्रेशन और स्विच के बीच अंतर?

[[email protected] ~]$ cat /proc/1/sched 
systemd (1, #threads: 1) 
------------------------------------------------------------------- 
se.exec_start        : 2499611106.982616 
se.vruntime         :   7952.917943 
se.sum_exec_runtime       :   58651.279127 
se.nr_migrations        :    53355 
nr_switches         :    169561 
nr_voluntary_switches      :    168185 
nr_involuntary_switches      :     1376 
se.load.weight        :    1048576 
se.avg.load_sum        :    343837 
se.avg.util_sum        :    338827 
se.avg.load_avg        :     7 
se.avg.util_avg        :     7 
se.avg.last_update_time      :  2499611106982616 
policy          :     0 
prio           :     120 
clock-delta         :     180 
mm->numa_scan_seq       :     1 
numa_pages_migrated       :     296 
numa_preferred_nid       :     0 
total_numa_faults       :     34 
current_node=0, numa_group_id=0 
numa_faults node=0 task_private=0 task_shared=23 group_private=0 group_shared=0 
numa_faults node=1 task_private=0 task_shared=0 group_private=0 group_shared=0 
numa_faults node=2 task_private=0 task_shared=0 group_private=0 group_shared=0 
numa_faults node=3 task_private=0 task_shared=11 group_private=0 group_shared=0 
numa_faults node=4 task_private=0 task_shared=0 group_private=0 group_shared=0 
numa_faults node=5 task_private=0 task_shared=0 group_private=0 group_shared=0 
numa_faults node=6 task_private=0 task_shared=0 group_private=0 group_shared=0 
numa_faults node=7 task_private=0 task_shared=0 group_private=0 group_shared=0 

मैं यह पता लगाने की क्या माइग्रेशन और स्विच के बीच मतभेद, कुछ प्रतिक्रियाओं here और here हैं कोशिश कर रहे हैं। इन प्रतिक्रियाओं का सारांश:

  • nr_switches: संदर्भ स्विच की संख्या।
  • nr_voluntary_switches: स्वैच्छिक स्विच की संख्या, यानी थ्रेड अवरुद्ध है और इसलिए एक और धागा उठाया जाता है।
  • nr_involuntary_switches: शेड्यूलर ने थ्रेड को लात मार दिया क्योंकि एक और भूख धागा चलाने के लिए तैयार है।

इसलिए, क्या हैं? क्या ये अवधारणाएं संबंधित हैं या नहीं? माइग्रेशन कोर के बीच कोर और स्विच के बीच हैं?

उत्तर

7

माइग्रेशन तब होता है जब एक थ्रेड, आमतौर पर एक संदर्भ स्विच के बाद, पहले से निर्धारित एक अलग CPU पर निर्धारित हो जाता है।

संपादित करें 1: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L1175

if (task_cpu(p) != new_cpu) { 
    ... 
    p->se.nr_migrations++; 

संपादित करें 2: https://en.wikipedia.org/wiki/Process_migration

यहाँ काउंटर बढ़ती गिरी कोड है:

यहाँ प्रवास के बारे में विकिपीडिया के बारे में अधिक जानकारी है:

एक धागा निम्नलिखित मामलों में एक और सीपीयू में माइग्रेट कर सकते हैं:

  1. दौरान exec()
  2. fork()
  3. दौरान धागा वेक-अप के दौरान।
  4. यदि थ्रेड एफ़िनिटी मास्क बदल गया है।
  5. जब वर्तमान सीपीयू ऑफ़लाइन हो रहा है।

अधिक जानकारी के लिए कार्य करता है set_task_cpu(), move_queued_task(), एक ही स्रोत फ़ाइल में migrate_tasks() पर एक नजर है कृपया: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c

नीतियों अनुसूचक select_task_rq(), जो अनुसूचक के वर्ग पर निर्भर में वर्णित इस प्रकार आप उपयोग कर रहे । policier के मूल संस्करण:

if (p->nr_cpus_allowed > 1) 
    cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags); 
else 
    cpu = cpumask_any(&p->cpus_allowed); 

स्रोत: https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L1534

तो क्रम में करने से बचने के प्रवास, अपने धागे sched_setaffinity(2) सिस्टम कॉल का उपयोग कर या इसी POSIX एपीआई pthread_setaffinity_np(3) के लिए CPU आत्मीयता मुखौटा निर्धारित किया है।

यहाँ() पूरी तरह से मेला समयबद्धक के लिए select_task_rq की परिभाषा है: https://github.com/torvalds/linux/blob/master/kernel/sched/fair.c#L5860

तर्क काफी जटिल है, लेकिन मूल रूप से, हम या तो चयन भाई निष्क्रिय CPU या एक कम से कम व्यस्त नया एक पाते हैं।

आशा है कि यह आपके प्रश्न का उत्तर देगा।

+0

आप 'आमतौर पर' कहते हैं, तो शेड्यूलर अन्य कोर पर माइग्रेट करने के लिए कौन सी नीतियों का पालन करता है? क्या आपके पास कोई स्रोत है जो इसकी पुष्टि कर सकता है? – horro

+0

यह शेड्यूलर, प्राथमिकताओं, affinities आदि पर निर्भर करता है। असल में, यदि कोई CPU एफ़िनिटी नहीं है और पिछले सीपीयू किसी अन्य कार्य में व्यस्त है, तो थ्रेड किसी अन्य CPU पर निर्धारित होता है। मैंने कुछ लिंक के साथ जवाब भी अपडेट किया। –

+1

@horro, थ्रेड-कोर एफ़िनिटी के मैन्युअल नियंत्रण के साथ प्रयोग किया गया, मैंने निष्कर्ष निकाला कि कोई बात नहीं है, नीतियां बहुत गहराई से शामिल हैं। बहुत कुछ है जिसे ध्यान में रखना है, और यह प्रत्येक कंप्यूटर के लिए अलग है। एक उदाहरण, एक दोहरी सीपीयू मशीन पर आप विचार कर सकते हैं कि कौन सी सीपीयू में थ्रेड का अधिकांश डेटा है (क्यूपीआई बस अधिभारित करने का कोई मतलब नहीं है)। वह खुद में एक जटिल सवाल है; लगातार मेमोरी पेज CPUs के बीच interleaved किया जा सकता है, या नहीं (यह कुछ मशीनों पर एक BIOS सेटिंग है)। ओएस यह सब और जानता है। मुझे बहुत गहरी प्रिये से डर है ... – bazza

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