कुछ सौ मिलीसेकंड के लिए लिनक्स कर्नेल को "फ्रीज" (या लगभग फ्रीज) के लिए कैसे बाध्य किया जाए


17

हम एक गैर-वास्तविक समय कर्नेल (CentOS 6) पर एक वास्तविक समय की प्रक्रिया चला रहे हैं, और यह शायद बदलने वाला नहीं है।

हमारे पास एक स्ट्रीमिंग वीडियो एप्लिकेशन है जो एक समय में 1.5 घंटे के लिए लगातार कस्टम FPGA से PCIe ट्रैफिक के लगभग 500 एमबी / एस की आवश्यकता होती है। आवेदन बहुत अच्छी तरह से काम करता है - ज्यादातर समय। हालाँकि, हमारे पास ऐसी परिस्थितियाँ हैं जहाँ ऐसा प्रतीत होता है कि कर्नेल एक समय में 500 मिलीसेकंड तक की PCIe या मेमोरी रिक्वेस्ट का जवाब देना बंद कर देता है। ऐसा प्रतीत होता है कि किसी अन्य थ्रेड से बर्फ़ीली फ़ाइल IO के दौरान होती है। मैंने पाया है कि मुख्य एप्लिकेशन के चलने के दौरान उपयोगकर्ता स्थान से बहुत सारी डमी फ़ाइल IO द्वारा इस समस्या को दोहराने की कोशिश करना असंभव है।

क्या लिनक्स कर्नेल (विशेष रूप से, PCIe या सभी DDR3 मेमोरी एक्सेस या ऐसा कुछ रोकना) को वैश्विक "फ्रीज़" करने के लिए बाध्य करने (अनुकरण) करने का कोई तरीका है ताकि हम इस समस्या को पुन: उत्पन्न कर सकें?

हमारे पास अभी तक आंतरिक FPGA मेमोरी में लागू 10 मिलीसेकंड तक बफरिंग है, लेकिन यह पर्याप्त नहीं है। हम FPGA DDR3 को बफर कर सकते हैं और फिर मेजबान को डंप कर सकते हैं, लेकिन हमें ड्यूरेस के तहत इस नई सुविधा का परीक्षण करने के लिए एक विधि की आवश्यकता है।

हम कर्नेल को स्थिर या स्थायी रूप से लॉक नहीं करना चाहते हैं। हम समय अंतराल निर्धारित करने की क्षमता चाहते हैं।

मैं /proc/sys/vmअस्थायी रूप से जादुई मूल्यों को लिखने की तर्ज पर कुछ खोज रहा हूं , जो सिस्टम को लगभग क्रॉल बनाता है, और फिर कुछ सौ मिलीसेकंड के बाद वापस लौटता है, लेकिन इसे तोड़ने के संभावित तरीकों की संख्या को देखना मेरे जैसे नौसिखियों के लिए नहीं है। https://www.kernel.org/doc/Documentation/sysctl/vm.txt )। शायद कुछ numactlजादू?


मेरा कूबड़ यह है कि इसके लिए कर्नेल मॉड्यूल लिखना आवश्यक है। आपको सभी सीपीयू पर किसी भी तरह से सभी थ्रेड्स को फ्रीज करना होगा, और टाइमर की बाधा को फिर से शुरू करने की व्यवस्था करनी होगी।
गिल्स एसओ- बुराई को रोकना '

मैं धागे को फ्रीज नहीं करना चाहता, मैं कर्नेल को फ्रीज करना चाहता हूं! मेरा मतलब है, मैं थोड़े समय के लिए हार्डवेयर (मेमोरी और / या पीसीआई और / या डिस्क) तक पहुंच को रोकना चाहता हूं। अगर वह काम नहीं करता है, तो मुझे बहुत सारी चीजें अपनाने में कोई आपत्ति नहीं है, L1 कैश को अक्षम करना, आदि। मुझे नहीं पता कि यह कैसे करना है।
निशान लकाटा

1
आह, इसलिए आप कर्नेल को फ्रीज नहीं करना चाहते हैं, आप केवल कर्नेल के उस हिस्से को फ्रीज करना चाहते हैं जो कुछ हार्डवेयर के प्रति प्रतिक्रिया करता है? वह भी, कर्नेल में बहुत गहरी डाइविंग की आवश्यकता होगी।
गिल्स एसओ- बुराई को रोकना '10

मैं कर्नेल को पूरी तरह से जमने से गुरेज नहीं करता, जब तक कि हार्डवेयर इसके भाग के रूप में जमी नहीं होती।
निशान लता

1
यह पता चला है, यह समस्या टीएलबी थ्रैशिंग से संबंधित है क्योंकि होस्ट सीपीयू कुछ आईओ बफ़र्स (हम फाइलें लिखने के लिए एचडीएफ 5 का उपयोग कर रहे हैं) को फ्लश करते हैं, और यह टीएलबी थ्रॉशिंग करने से कोप्रोसेसर भी थ्रैश हो जाता है, क्योंकि यह एक एनयूएमए सिस्टम है। मुझे लगता है कि हम सभी की जरूरत अब प्रोग्राम का एक विश्वसनीय तरीका है जिससे नियंत्रित समय के लिए टीएलबी थ्रेशिंग होता है।
निशान लता जनता

जवाबों:


9

एक त्वरित परीक्षण करने का एक विकल्प KGDB सक्षम कर्नेल का उपयोग करना और कर्नेल को मैन्युअल रूप से रोकना और परीक्षण करना हो सकता है, इस लिंक को देखें

एक और नोट पर, ऐसी बातें जो मुझे याद हैं कि आपके कारण रुक सकती हैं:

  • cpufreq, cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latencyमान ns में है (मेरे AMD FX में 4000)
  • थर्मल थ्रॉटलिंग या तो सीपीयू या वोल्टेज नियामक मॉड्यूल।
  • NAPI और / या भारी नेटवर्क ट्रैफ़िक
  • PCIe ASPM ( cat /sys/module/pcie_aspm/parameters/policy)
  • अपने गंतव्य उपकरण के बफ़र्स में ध्यान दें (हार्ड डिस्क, nic ...)
  • PCIe बस में कुछ डिवाइस के फर्मवेयर में बग (भले ही आप इसका उपयोग नहीं कर रहे हैं), आप उन्हें बंद करने की कोशिश कर सकते हैं /sys/bus/pci/devices/$DEVICE/power/control

क्या मैं ऐसा करने के kdbबजाय उपयोग कर सकता हूं kgdb? मैंने कभी इस्तेमाल नहीं किया। क्या यह "स्टॉप-ए" कमांड के अनुक्रम के रूप में है। यदि मैं बस एक त्वरित SysRq-g करता हूं, तो "गो" टाइप करें, क्या मुझे सिस्टम को नहीं तोड़ने की उच्च संभावना होगी? (संदर्भ: kernel.org/pub/linux/kernel/people/jwessel/kdb/... )
मार्क Lakata

1
संभवतः आप kdb का उपयोग कर पाएंगे। ध्यान रखें कि यह यूएसबी कनेक्टेड कीबोर्ड के साथ काम करना चाहिए, लेकिन केवल मामले में एक पीएस / 2 एक काम करने की कोशिश करें। और यह एक बहुत ही निम्न स्तर की डिबगर (कर्नेल भूमि) है, इसलिए हमेशा की तरह, बैकअप रखें और यदि यह टूट जाता है तो आपको दोनों टुकड़े रखने के लिए मिलेंगे :)।
जॉर्ज नेरिन

कर्नेल के साथ ट्विकिंग का सहारा लेने से पहले, मैं पहले PCIe उपकरणों के लिए अप्रयुक्त कर्नेल मॉड्यूल को अनलोड करने का प्रयास करूंगा जो बस (ग्राफिक्स ड्राइवरों का सबसे विशेष रूप से) उपयोग कर सकते हैं, और या तो भौतिक रूप से सिस्टम से उपकरणों को हटा सकते हैं या उन्हें बंद कर सकते हैं। PCIe 1.0 X1 में 250MB / s की बैंडविड्थ है और PCIe 2.0 X1 500MB / s तक जाता है, क्या दोनों मूल और गंतव्य डिवाइस बिना किसी रुकावट के इस तरह के निरंतर दर को स्वीकार करने के लिए स्वतंत्र हैं या क्या उनके पास अधिक हेडरूम की अनुमति देने के लिए अधिक लेन हैं?
जॉर्ज नेरिन

अंतराल का एक अन्य संभावित स्रोत कुछ डिवाइस के कुछ एसीपीआई बिजली प्रबंधन हैंडलर हो सकता है या शायद कुछ एसएमएम सीपीयू हैंडलर बाहरी घटना की प्रतीक्षा कर रहा है।
फ्रेंकी

2

क्या आपके आवेदन में FPGA के साथ संचार करने के तरीके के बारे में अधिक जानकारी हो सकती है? क्या यह एप्लिकेशन है जो एफपीजीए से बफर पढ़ता है, या एफपीजीए जो कर्नेल को बाधित करता है (जैसे नेटवर्क कार्ड)?

मैं इसे / देव में एक ब्लॉक / चार खोलने और फिर इसके साथ संवाद करने की उम्मीद करता हूं। इसका मतलब यह है कि यह एप्लिकेशन और / dev / XXX फ़ाइल के बीच संचार करने के लिए ड्राइवर का उपयोग करता है।

मैं का उत्पादन करना चाहते हैं cat /proc/interrupts:; lsmod;ls -al /dev/yourmod

यहाँ विचार है:

  • यदि यह बाधित है, तो आप इसी IRQ को अक्षम करने के लिए CPU PIC सेट कर सकते हैं, फिर इसे सक्षम करें। इससे कार्ड के हर अनुरोध को अनदेखा किया जाएगा (कार्ड के बारे में पता किए बिना)।
  • यदि यह एक बफर रीड की तरह है, तो आप यह कर सकते हैं:
    • अपने एप्लिकेशन को स्लीप अवस्था में रखें, इसलिए FPGA का डेटा पढ़ा नहीं जाएगा, और आपका बफ़र भर जाएगा, फिर अपने एप्लिकेशन को जगाएं और रीड जारी रखें।
    • "क्रैश" या "kgdb" का उपयोग कुछ सेकंड के लिए "रीड" मान को "noop" में बदलने के लिए करें, फिर इसे डिफ़ॉल्ट फ़ंक्शन पर वापस सेट करें।

कृपया उपयोगी होने के लिए सभी जानकारी प्रदान करें।


FPGA मेमोरी को होस्ट करने के लिए DMA लिखता है, और इन आउटेज अवधि के दौरान, FPGA मेमोरी होस्ट करने के लिए लिखने में सक्षम नहीं है, इसलिए इसका आंतरिक FIFO बैक-अप है। होस्ट प्रक्रिया के लिए एक संदेश-आधारित इंटरफ़ेस है (PCIe पर होता है), लेकिन मुझे यकीन है कि यह शामिल नहीं है। सत्यापन उद्देश्यों के लिए, मुझे मूल रूप से कुछ सौ मिलीसेकंड के लिए मेमोरी होस्ट करने के लिए FPGA हार्डवेयर को प्रतिबंधित करने का एक तरीका चाहिए। मैं स्मृति समस्या को हल नहीं करना चाहता, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि FPGA पर हमारा कार्यान्वयन मेमोरी आउटेज (1000 एमएस तक) से निपटने में सक्षम है।
मार्क लकाटा

ठीक है, अगर यह डीएमए का उपयोग कर रहा है, तो आप पर एक नज़र डाल सकते हैं: kernel.org/doc/Documentation/DMA-ISA-LPC.txt particulary का दावा_डमा_लॉक () और dma_disable () पर। हालाँकि, आपको अपने FPGA द्वारा उपयोग किए गए पते को जानना होगा।
एड्रिएन एम।

1

यकीन नहीं होता अगर यह मदद करता है। लेकिन अगर आप एक कर्नेल मॉड्यूल लिख सकते हैं जो suspendकिसी अन्य डिवाइस के कर्नेल मॉड्यूल के फ़ंक्शन को कॉल करता है , तो ऐसा हो सकता है।

प्रत्येक PCI डिवाइस को शीर्ष लेख फ़ाइल http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479 के अनुसार निलंबित किया जा सकता है

उदाहरण के लिए, यहाँ का Intel e1000 NIC का सस्पेंड फ़ंक्शन http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.cn4L4643

मैं जो याद कर सकता हूं, इस फ़ंक्शन का उपयोग मुख्य रूप से तब किया गया था जब सिस्टम हाइबरनेशन पर जाता है, डिवाइस ड्राइवर को चालू चालू स्थिति को बचाने और खुद को बंद करने की आवश्यकता होती है।


धन्यवाद, लेकिन मुझे नहीं लगता कि यह काम करेगा। मैं वास्तव में एक उपकरण को निलंबित नहीं करना चाहता, जो कर्नेल डिवाइस को हाइबरनेशन के लिए तैयार करने के लिए कह रहा है; मैं चाहता हूं कि कर्नेल विशिष्ट डिवाइस (इस मामले में FPGA बेटी बोर्ड) को जानने के बिना अनदेखा करे ( लंबे समय तक विलंब या टाइमआउट के अलावा) - या मैं सभी एसडीआरएएम मेमोरी ट्रांसफर को रोकना चाहता हूं।
मार्क लकाटा

0

मुझे लगता है कि आप गलत लाइनों के साथ सोच रहे हैं। आपका लक्ष्य स्पष्ट है।

तरीका बाकी प्रक्रियाओं को रोकने का नहीं है, बल्कि वास्तविक समय की समयबद्धता प्राथमिकता के पास अपनी मुख्य प्रक्रियाओं को देने का है। उस के लिए अपने महत्वपूर्ण उपयोगकर्ता-अंतरिक्ष-प्रक्रियाओं के लिए अच्छा उपयोग करें ।

अधिक कठिन समस्या PCIe इंटरप्ट हैंडलिंग है, जो कर्नेल-स्पेस में रहती है।

चूंकि हार्डवेयर शामिल है, तो आपको अपने मेनबोर्ड पर शामिल PCIe लेन पर करीब से नज़र डालना शुरू कर देना चाहिए और यह कि यह संभवतः एक विशिष्ट CPU सॉकेट से कैसे जुड़ा हुआ है।

असंबद्धता सामान्य रूप से यहां एक अच्छा काम करती है, लेकिन आप अपनी आवश्यकताओं के अनुरूप इसके bahaviour को कॉन्फ़िगर कर सकते हैं।

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