2013-11-03 3 views
9

मैं जाने के पैकेज "रनटाइम" के बारे में पढ़ रहा हूं और देख सकता हूं कि मैं अन्य (func GOMAXPROCS (n int)) के बीच कर सकता हूं, जो मेरे प्रोग्राम को चलाने के लिए उपयोग की जा सकने वाली CPU इकाइयों की संख्या सेट कर सकता है। क्या मैं अपनी पसंद के एक विशिष्ट सीपीयू पर एक गोरौटाइन चलाने के लिए मजबूर कर सकता हूं?क्या एक विशिष्ट सीपीयू पर चलने के लिए एक नियमित दिनचर्या को मजबूर करना संभव है?

+0

FWIW जाना 1.5 कैश जाने दिनचर्या के बीच जा रहा से बचने के लिए याद करते हैं और अधिक सही एक "होशियार अनुसूचक" है कि CPU के संबंध के लिए कहा जाता है। मुझे लगता है कि सीपीयू एफ़िनिटी की तरह है ... – rogerdpack

उत्तर

10

आधुनिक जाओ में, मैं goroutines को दक्षता के लिए धागे को लॉक नहीं करता। 1.5 added goroutine scheduling affinity, to minimize how often goroutines switch between OS threads पर जाएं। और सीपीयू के बीच शेष माइग्रेशन की किसी भी लागत को कर्नेल मोड में संदर्भ स्विच से परहेज करने वाले उपयोगकर्ता-मोड शेड्यूलर के लाभ के खिलाफ वजन घटाना होगा। अंत में, लागतों को स्विच करते समय एक वास्तविक समस्या होती है, कभी-कभी एक बेहतर फोकस आपके प्रोग्राम तर्क को बदल रहा है, इसलिए इसे अलग-अलग काम करने की बजाय काम के बैचों को संचारित करके कम स्विच करने की आवश्यकता है।

लेकिन उन सभी पर विचार करने पर भी, कभी-कभी आपको केवल एक goroutine लॉक करना पड़ता है, जैसे कि जब सी एपीआई की आवश्यकता होती है, और मुझे लगता है कि यह मामला नीचे है।


पूरे कार्यक्रम GOMAXPROCS=1, तो it's relatively simple to set a CPU affinity by calling out to the taskset utility from the schedutils package साथ चलाता है।

मैंने सोचा था कि GOMAXPROCS > 1 पर goroutines are migrated between OS threads at runtime पर भाग्य से बाहर थे। वास्तव में, जेम्स हेनस्ट्रिज बताते हैं कि आप अपने goroutine माइग्रेटिंग से रखने के लिए runtime.LockOSThread() का उपयोग कर सकते हैं। एक बार जब आप इसे गोरौटाइन लॉक कर लेते हैं, तो मुझे वर्तमान थ्रेड के सीपीयू एफ़िनिटी को सेट करने के लिए किसी भी गो स्टडीलिब फ़ंक्शन के बारे में पता नहीं है। आप Go uses pthreads in cgo mode स्पष्ट रूप से, कागो का उपयोग करने और pthread_setaffinity_np पर कॉल करने में सक्षम हो सकते हैं। चूंकि हम सिस्टम कॉल के बारे में बात कर रहे हैं, विवरण ओएस द्वारा अलग-अलग होंगे।

+5

हालांकि आप एक रन ओएस थ्रेड को 'रनटाइम.लॉकऑस्टह्रेड' के साथ लॉन्च कर सकते हैं। लक्ष्य को प्राप्त करने के लिए अंतर्निहित ओएस सीपीयू एफ़िनिटी रूटीन के साथ इसका उपयोग किया जा सकता है। –

+0

ओह, धन्यवाद! अद्यतन कर रहा है। – twotwotwo

1

अपने पर निर्भर करता है (यदि आपके पूरे कार्यक्रम शुद्ध जाओ (कोई सी में जुड़ा हुआ है), यह syscall मॉड्यूल के माध्यम से एक शून्य pid पैरामीटर के साथ sched_setaffinity कॉल करने के लिए काम कर सकते हैं। लेकिन वह मुश्किल हो जा रहा है। है) वर्कलोड, लेकिन कभी-कभी प्रति CPU प्रक्रिया जाने के लिए फायदेमंद होता है, gomaxprocs को 1 पर सेट करें और प्रक्रिया को सीपीयू को टास्कसेट के साथ पिन करें।

  • उपयोग reuseport श्रोता: यहाँ भयानक fasthttp पुस्तकालय से उस विषय पर एक अंश है।
  • GOMAXPROCS = 1 के साथ प्रति सीपीयू कोर पर एक अलग सर्वर उदाहरण चलाएं।
  • taskset का उपयोग कर प्रत्येक सर्वर उदाहरण को एक अलग CPU कोर पर पिन करें।
  • सुनिश्चित करें कि मल्टीक्यू नेटवर्क कार्ड के इंटरप्ट्स को सीपीयू कोर के बीच समान रूप से वितरित किया जाता है। विवरण के लिए this article देखें।
  • गो 1.6 का उपयोग करें क्योंकि यह कुछ उल्लेखनीय प्रदर्शन सुधार प्रदान करता है।

स्रोत: https://github.com/valyala/fasthttp#performance-optimization-tips-for-multi-core-systems

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

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