किसी कार्यक्रम को संचालित करने के लिए सर्वश्रेष्ठ हास्केल पुस्तकालय क्या हैं? [बन्द है]


115

अगर मैं किसी कार्यक्रम को प्रोडक्शन में डालने जा रहा हूँ, तो मुझे "ऑपरेशनलीज़" पर विचार करने के लिए कई चीजें चाहिए जो मुझे करने के लिए उस प्रोग्राम की ज़रूरत है - जो कि इंजीनियर और ऑपरेशंस स्टाफ दोनों के द्वारा एक मापने योग्य और सत्यापन योग्य तरीके से चल रहा है और बनाए रखने योग्य है। मेरे उद्देश्यों के लिए, एक परिचालित कार्यक्रम होना चाहिए:

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

स्काला दुनिया में, कम से कम पहले तीन आवश्यकताओं से निपटने के लिए अच्छे पुस्तकालय हैं। उदाहरण:

तैनाती के लिए के रूप में, एक दृष्टिकोण स्काला दुनिया में ले लिया बाईटकोड और पुस्तकालयों ऐसा ही कुछ के साथ एक कार्यक्रम में शामिल एक साथ बंडल है विधानसभा-एसबीटी , तो जैसे उपकरण के साथ दूरस्थ सर्वर के परिणामस्वरूप बंडल (एक "वसा जार") धक्का Capistrano जो SSH के समानांतर कमांड को निष्पादित करता है। यह एक ऐसी समस्या नहीं है जो भाषा-विशिष्ट उपकरणों की आवश्यकता होती है, लेकिन अगर हास्केल समुदाय में ऐसा उपकरण मौजूद है, तो मैं उत्सुक हूं।

संभवतः हास्केल पुस्तकालय हैं जो मेरे द्वारा वर्णित लक्षण प्रदान करते हैं। मैं जानना चाहता हूं कि उपलब्ध पुस्तकालयों में से कौन सा "सर्वश्रेष्ठ" माना जाता है; वह है, जो सबसे परिपक्व, अच्छी तरह से बनाए रखा जाता है, आमतौर पर हास्केल समुदाय में उपयोग किया जाता है, और हास्केल सर्वोत्तम प्रथाओं का अनुकरण है।

यदि हास्केल कोड "प्रोडक्शन-रेडी" बनाने के आसपास कोई अन्य पुस्तकालय, उपकरण, या प्रथाएं हैं, तो मुझे उनके बारे में भी जानना अच्छा लगेगा।


1
चौथी गोली परेशानी का कारण बन सकती है, क्योंकि हास्केल मूल के लिए संकलित है। आप सांख्यिकीय रूप से संकलित करने का प्रयास कर सकते हैं, जो काम कर सकता है या नहीं भी हो सकता है, लेकिन आशा है कि आपके पास विकास सर्वर की तुलना में उत्पादन सर्वर पर समान वातावरण होगा। कैबल-देव सैंडबॉक्स वाला वातावरण है, जो अन्य मशीनों को स्थानांतरित करने के लिए उपयुक्त हो सकता है। तब भी उसे लक्ष्य मशीन पर कम से कम आधार पुस्तकालयों की आवश्यकता होगी।
Masse

1
अन्य उपकरणों और तकनीकों के बारे में, इस SO प्रश्न का अवलोकन है: stackoverflow.com/questions/3077866/…
डॉन स्टीवर्ट

1
एक अन्य बात - आप * nix सिस्टम पर बड़ी संख्या में प्रोसेस स्टैटिस्टिक्स और मेटाडेटा को सीधे / proc फाइल सिस्टम के माध्यम से एक्सेस कर सकते हैं। इसलिए यदि आप आत्मनिरीक्षण करने के लिए कुछ दिनचर्या लिखते हैं, तो यह रनटाइम में सीधे हुक की कमी के लिए स्थानापन्न करने में मदद करता है।
sclv

1
जब तक आप एक ही वातावरण पर निर्माण करते हैं, तब तक एक द्विआधारी को तैनात करना आसान होता है (यदि आपका कंप्यूटर एक अलग आर्किटेक्चर है तो आपको एक स्टेजिंग सर्वर होना चाहिए)। तब आप बाइनरी और किसी भी बाहरी फ़ाइलों को rsync कर सकते हैं। स्वचालित रूप से पुनरारंभ कमांड निष्पादित करने के लिए हैस्केल के लिए कोई ssh लाइब्रेरी नहीं है, लेकिन आप कैपिस्ट्रानो का उपयोग कर सकते हैं।
ग्रेग वेबर

1
@ टीचर वह पहले पैराग्राफ और बुलेटेड सूची के बाकी हिस्सों को खर्च करता है, जो सीधे सादे अंग्रेजी में इसका अर्थ बताते हुए परिचालित शब्द है ।
विल मैककिचेन 15

जवाबों:


54

यह एक बड़ा सवाल है! यहाँ पहली कटौती है।

कई स्तरों पर लॉग इन करने में सक्षम हो (उदाहरण: डिबग, चेतावनी, आदि)।

hslogger आसानी से सबसे लोकप्रिय लॉगिंग फ्रेमवर्क है।

कार्यक्रम किस प्रकार के काम कर रहे हैं और उस कार्य में कितना समय लग रहा है, इसके बारे में मेट्रिक्स / आंकड़े एकत्र करने और साझा करने में सक्षम हों। आदर्श रूप से, एकत्रित मेट्रिक्स एक प्रारूप में उपलब्ध हैं, जो आमतौर पर इस्तेमाल किए जाने वाले निगरानी उपकरणों जैसे कि गंगालिया, या इतने गूंगे हो सकते हैं।

मैं किसी भी मानकीकृत रिपोर्टिंग उपकरण से अवगत नहीं हूँ, हालाँकि, +RTS -sस्ट्रीम से (या प्रोफाइलिंग आउटपुट फ़्लैग के माध्यम से) रिपोर्ट निकालना कुछ ऐसा है जो मैंने अतीत में किया है।

$ ./A +RTS -s
64,952 bytes allocated in the heap
1 MB total memory in use
 %GC time       0.0%  (6.1% elapsed)
 Productivity 100.0% of total user, 0.0% of total elapsed

आप इसे मशीन-पठनीय प्रारूप में भी प्राप्त कर सकते हैं:

$ ./A +RTS -t --machine-readable

 [("bytes allocated", "64952")
 ,("num_GCs", "1")
 ,("average_bytes_used", "43784")
 ,("max_bytes_used", "43784")
 ,("num_byte_usage_samples", "1")
 ,("peak_megabytes_allocated", "1")
 ,("init_cpu_seconds", "0.00")
 ,("init_wall_seconds", "0.00")
 ,("mutator_cpu_seconds", "0.00")
 ,("mutator_wall_seconds", "0.00")
 ,("GC_cpu_seconds", "0.00")
 ,("GC_wall_seconds", "0.00")
 ]

आदर्श रूप से आप एक सॉकेट के ऊपर चल रहे जीएचसी रनटाइम से जुड़ सकते हैं और इन GC आँकड़ों को अंतःक्रियात्मक रूप से देख सकते हैं, लेकिन वर्तमान में यह सुपर आसान नहीं है ("rts / Stats.h" इंटरफ़ेस के लिए FFI बाइंडिंग की आवश्यकता है)। आप ThreadScopeजीसी और थ्रेडिंग व्यवहार का उपयोग करके निगरानी कर सकते हैं ।

समान झंडे वृद्धिशील, लॉग किए गए समय और स्थान की रूपरेखा के लिए उपलब्ध हैं , जिनका उपयोग निगरानी के लिए किया जा सकता है (उदाहरण के लिए ये रेखांकन वृद्धिशील रूप से बनाए जा सकते हैं)।

hpcप्रोग्राम निष्पादन के बारे में बहुत सारे आंकड़े एकत्र करता है, इसके Tixप्रकार के माध्यम से , और लोगों ने टाइम-स्लाइस द्वारा लॉग करने के लिए उपकरण लिखे हैं जो कोड निष्पादित कर रहा है।

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

इसके लिए कई उपकरण उपलब्ध हैं, आप xmonad- शैली की स्थिति को पुनः लोड कर सकते हैं; या plugins* हॉट पैकेजिंग को * पैकेज या के माध्यम से कोड करने के लिए आगे बढ़ें hint। इनमें से कुछ दूसरों की तुलना में अधिक प्रयोगात्मक हैं।

निरस्त करने वाली तैनाती

गाल्वा ने हाल ही में जारी किया cabal-dev, जो प्रतिलिपि प्रस्तुत करने योग्य बिल्ड करने के लिए एक उपकरण है (यानी निर्भरताएं स्कोप और नियंत्रित होती हैं)।


6
रंजक पैकेज को xmonad- शैली की स्थिति को पुनः लोड करने के लिए माना जाता है, इसलिए विशेष रूप से उल्लेख किया जाना चाहिए, मुझे लगता है। हालांकि, यह एक साथ पुनर्संयोजन और पुन: तैनाती को जोड़ता है इसलिए वास्तव में पूरे टूलकिन के साथ मशीन पर बदलाव के बारे में है। सुदूर रेडेप्लो के लिए आपको एसिड-स्टेट जैसा कुछ और चाहिए, हालांकि यह मेरे स्वाद के लिए थोड़ा भारी है। मुझे यह लगातार mvar अमूर्त मिला है जिसकी कमजोर गारंटी है, लेकिन जिसे आप सिर्फ एक सादे एमवीआर की तरह व्यवहार कर सकते हैं जो कि बाइनरी के प्रत्येक लॉन्च पर जादुई रूप से पॉपुलेटेड होता है, जिसके अंतिम डेटा के साथ इसे आयोजित किया जाता है।
sclv

2
इसके अलावा, जीएचसी का नया EventLogलॉगिंग फ्रेमवर्क ( +RTS -lरनटाइम का उपयोग करके ) एक फाइल को आउटपुट देता है, जिसे किसी भी टूल के साथ देखा जा सकता है।
डॉन स्टीवर्ट

2
एक कार्यक्रम इस तरह से अपनी घटनाओं के लॉग का उत्सर्जन करेगा: galois.com/~dons/tmp/A.event.log - जिसे कल्पना की जा सकती है - i.imgur.com/QAe6r.png । मैं इस प्रारूप के शीर्ष पर अन्य निगरानी उपकरणों के निर्माण की कल्पना कर सकता था।
डॉन स्टीवर्ट

2
यह भी ध्यान दें कि बहुत सारे प्रोफाइलिंग टूल परीक्षण के लिए बहुत अच्छे हैं लेकिन उत्पादन कोड के लिए बहुत नहीं हैं। ओवरहेड छोड़कर, उदाहरण के लिए -prof केवल एक प्रोसेसर के साथ उपयोग किया जा सकता है।
sclv

9
  • कॉन्फ़िगरेशन के बारे में, मैंने अपने प्रोजेक्ट्स के लिए कॉन्फ़िगरफ़ाइल को उपयोगी पाया है। मैं उत्पादन में अपने सभी डेमॉन के लिए इसका उपयोग करता हूं। यह स्वचालित रूप से अद्यतन नहीं करता है।
  • मैं वातावरण (स्थानीय, देव, सहकर्मी-स्थानीय) में प्रतिलिपि प्रस्तुत करने योग्य बिल्ड बनाने के लिए काबाल-देव का उपयोग करता हूं। वास्तव में कैबल-देव अपरिहार्य है, विशेष रूप से परियोजना निर्देशिका के भीतर पुस्तकालयों के स्थानीय, पैच संस्करणों का समर्थन करने की अपनी क्षमता के लिए।
  • इसके लायक होने के लिए, मैं xmonad- शैली की स्थिति को पुनः लोड करने के साथ जाऊंगा। हास्केल की पवित्रता इस तुच्छ बनाता है; प्रवास एक मुद्दा है लेकिन यह वैसे भी है। मैंने अपने IRCd के लिए hsplugins और संकेत के साथ प्रयोग किया और पूर्व मामले में एक GHC रनटाइम समस्या थी, और बाद के एक विभाजन दोष में। मैंने बाद में पोस्टमॉर्टम के लिए जीथब पर शाखाएं छोड़ दीं: https://github.com/chrisdone/hulk

कॉन्फ़िगाइल का उदाहरण:

# Default options
[DEFAULT]
hostname: localhost
# Options for the first file
[file1]
location: /usr/local
user: Fred

9

मैं डॉन की कही गई हर बात को प्रतिध्वनित करूंगा और सलाह के कुछ सामान्य बिट्स जोड़ूंगा।

उदाहरण के लिए, दो अतिरिक्त उपकरण और पुस्तकालय जिन पर आप विचार करना चाहते हैं:

  • संपत्ति आधारित परीक्षण के लिए क्विकचेक
  • hlint के एक विस्तारित संस्करण के रूप में-Wall

उन दोनों को कोड गुणवत्ता पर लक्षित किया गया है।

कोडिंग अभ्यास के रूप में, आलसी IO से बचें। आप आईओ स्ट्रीमिंग की जरूरत है, तो इस तरह के रूप iteratee पुस्तकालयों में से एक के साथ जाने के लिए प्रगणक । यदि आप हैकेज को देखते हैं तो आप http-एन्यूमरेटर जैसी लाइब्रेरी देखेंगे जो http अनुरोधों के लिए एन्यूमरेटर शैली का उपयोग करते हैं।

हैकेज पर पुस्तकालयों को चुनने के लिए यह कभी-कभी यह देखने में मदद कर सकता है कि कितने पैकेज किसी चीज़ पर निर्भर हैं। किसी पैकेज की रिवर्स निर्भरता को आसानी से देखें आप इस वेबसाइट का उपयोग कर सकते हैं, जो हैकेज को दर्पण करता है:

यदि आपका आवेदन तंग छोरों को पूरा करता है, तो कई अनुरोधों को संभालने वाले वेब सर्वर की तरह, अंतरिक्ष रिसाव के रूप में आलस्य एक मुद्दा हो सकता है। अक्सर यह सही स्थानों पर सख्ती के उद्घोषों को जोड़ने का मामला है। प्रोफाइलिंग, अनुभव और रीडिंग कोर इस तरह की चीज़ों से निपटने के लिए मेरे द्वारा जानी जाने वाली मुख्य तकनीकें हैं। सबसे अच्छा प्रोफाइलिंग संदर्भ मुझे पता है कि रियल-वर्ल्ड हास्केल का अध्याय 25 है ।

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