पायथन जीआईएल को हटाने के शुरुआती प्रयास के परिणामस्वरूप बुरा प्रदर्शन हुआ: क्यों?


13

पायथन निर्माता, गुइडो वान रॉसुम के इस पोस्ट में पायथन से जीआईएल को हटाने के एक शुरुआती प्रयास का उल्लेख है:

निराशाजनक परिणामों के साथ यह पहले भी आजमाया जा चुका है, यही वजह है कि मैं खुद इसमें ज्यादा प्रयास करने से हिचक रहा हूं। 1999 में ग्रेग स्टीन (मार्क हैमंड के साथ?) ने पायथन (1.5 मेरा मानना ​​है) का एक कांटा तैयार किया, जिसने जीआईएल को हटा दिया, इसे सभी उत्परिवर्तित डेटा संरचनाओं पर बारीक-बारीक ताले के साथ बदल दिया। उन्होंने उन पैच को भी प्रस्तुत किया, जिन्होंने वैश्विक परिवर्तनशील डेटा संरचनाओं पर बहुत सारी निर्भरताएँ दूर कीं, जिन्हें मैंने स्वीकार कर लिया। हालाँकि, बेंचमार्किंग के बाद, यह दिखाया गया था कि प्लेटफ़ॉर्म पर भी सबसे तेज़ लॉकिंग प्रिमिटिव (उस समय विंडोज) के साथ, यह सिंगल-थ्रेडेड निष्पादन को लगभग दो गुना धीमा कर देता है, जिसका अर्थ है कि दो सीपीयू पर, आपको बस थोड़ा और काम मिल सकता है GIL की तुलना में GIL के बिना GIL के साथ किया जाता है। यह पर्याप्त नहीं था, और ग्रेग का पैच गुमनामी में गायब हो गया। (प्रदर्शन पर ग्रेग का राइटअप देखें।)

मैं शायद ही वास्तविक परिणामों के साथ बहस कर सकता हूं, लेकिन मुझे वास्तव में आश्चर्य है कि ऐसा क्यों हुआ। संभवतः, मुख्य कारण यह है कि सीपीआईएलथॉन से जीआईएल को हटाना इतना मुश्किल है क्योंकि संदर्भ गिनती स्मृति प्रबंधन प्रणाली है। एक विशिष्ट पायथन कार्यक्रम कॉल करेगा Py_INCREFऔर Py_DECREFहजारों या लाखों बार, यह एक महत्वपूर्ण विवाद बिंदु बना देगा यदि हम इसके चारों ओर ताले लपेटने के लिए थे।

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

लेकिन अफसोस, बहुत से लोग जो मुझसे ज्यादा होशियार हैं, वे कोशिश कर चुके हैं और असफल रहे हैं, तो जाहिर है कि मुझे यहां कुछ याद आ रहा है। जिस तरह से मैं इस समस्या को देख रहा हूं उसमें क्या गलत है?


1
ध्यान दें कि refcount ऑपरेशन केवल सिंक्रनाइज़ेशन की आवश्यकता वाली जगह नहीं होगी। उद्धरण में "सभी उत्परिवर्तनीय डेटा संरचनाओं पर महीन दाने वाले ताले" का उल्लेख किया गया है, जो मुझे लगता है कि हर सूची और शब्दकोश वस्तु के लिए कम से कम म्यूटेक्स शामिल है। इसके अलावा, मुझे नहीं लगता कि परमाणु पूर्णांक संक्रियाएं गैर-परमाणु समकक्ष के रूप में उतनी ही कुशल हैं, लेकिन क्या आपके पास इसके लिए कोई स्रोत है?

बस, क्योंकि परमाणु संचालन गैर-परमाणु समकक्षों की तुलना में धीमा है। सिर्फ इसलिए कि यह एक एकल निर्देश है इसका मतलब यह नहीं है कि यह हुड के नीचे तुच्छ है। इसे कुछ चर्चा के लिए देखें
Móż

जवाबों:


9

मैं ग्रेग स्टीन अजगर कांटा से अपरिचित हूं, इसलिए यदि आप चाहें तो इस तुलना को सट्टा ऐतिहासिक सादृश्य के रूप में छूट दें। लेकिन यह एकल से बहु-सूत्रीय कार्यान्वयन के लिए आगे बढ़ने वाले कई बुनियादी ढाँचों वाले कोडबेस का ऐतिहासिक अनुभव था ।

अनिवार्य रूप से हर यूनिक्स कार्यान्वयन, जिसका मैंने 1990 के दशक में अध्ययन किया था - AIX, DEC OSF / 1, DG / UX, DYNIX, HP-UX, IRIX, Solaris, SVR4, और SVR4 MP - सभी बिल्कुल उसी तरह से गुज़रे जैसे कि "हम डालते हैं" बारीक-बारी से बंद - अब यह धीमी है !! मुसीबत। DBMSs का मैंने अनुसरण किया - DB2, Ingres, Informix, Oracle, और Sybase - वे सभी इसके माध्यम से भी गए।

मैंने सुना है "जब हम एक-पिरोया जा रहा है तो ये बदलाव हमें धीमा नहीं करेंगे" एक लाख बार। यह कभी इस तरह से काम नहीं करता है। सशर्त रूप से जाँच का सरल कार्य "क्या हम मल्टीथ्रेडेड चल रहे हैं, या नहीं?" विशेष रूप से अत्यधिक पिपली वाले सीपीयू पर वास्तविक ओवरहेड जोड़ता है। साझा डेटा संरचनाओं की अखंडता को सुनिश्चित करने के लिए परमाणु संचालन और सामयिक स्पिन-लॉक को अक्सर कहा जाता है, और वे बहुत धीमी गति से होते हैं। पहली पीढ़ी के लॉक / सिंक्रोनाइज़ेशन प्राइमेटिव भी धीमे थे। अधिकांश कार्यान्वयन टीमों ने अंततः विभिन्न प्रकार के "ताकत" में, कई जगहों पर प्राइमेटिक्स के कई वर्गों को जोड़ा है, जो विभिन्न स्थानों पर इंटरलॉक सुरक्षा की आवश्यकता थी। तब उन्हें पता चलता है कि जहां उन्होंने शुरू में थप्पड़ मारे थे वहां ताला लगाना आदिम वास्तव में सही जगह नहीं थी, इसलिए उन्हें मिली हुई अड़चनों के बारे में रूपरेखा तैयार करनी थी, और व्यवस्थित रूप से रोटो-तक। इनमें से कुछ चिपके हुए बिंदुओं को अंततः ओएस या हार्डवेयर त्वरण मिला, लेकिन उस पूरे विकास में 3-5 साल लगे, नंगे न्यूनतम। इस बीच, एमपी या एमटी संस्करण सीमित थे, प्रदर्शन-वार।

अन्यथा परिष्कृत विकास टीमों ने तर्क दिया है कि इस तरह की मंदी मूल रूप से जीवन का एक निरंतर, अचूक तथ्य है। आईबीएम उदाहरण के लिए प्रतियोगिता के बाद कम से कम 5 साल के लिए एसएमपी-सक्षम करने से इनकार कर दिया, इस बात पर जोर दिया कि एकल-थ्रेड केवल विशुद्ध रूप से बेहतर था। Sybase ने कुछ ऐसे ही तर्कों का इस्तेमाल किया। केवल कुछ टीमों के अंत में आने का एकमात्र कारण यह था कि सीपीयू स्तर पर एकल-थ्रेड के प्रदर्शन में यथोचित सुधार नहीं किया जा सकता था। उन्हें या तो एमपी / एमटी जाने के लिए मजबूर किया गया था या तेजी से अप्रतिस्पर्धी उत्पाद होने को स्वीकार किया गया था।

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

इसलिए मेरी अटकलें हैं कि अनुपस्थित जीवीआर का समर्थन और समर्थन, किसी ने भी पायथन और इसकी जीआईएल के लिए लंबे समय तक ट्रेज पर नहीं लिया। यहां तक ​​कि अगर वे आज भी ऐसा करते हैं, तो इससे पहले कि आप "वाह! हम वास्तव में एमटी कूबड़ पर!"

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


2
+1 डेवलपर्स के काफी छोटी टीम के साथ Tcl को मल्टी-थ्रेड करने में उस समय का समय लगा। इससे पहले कोड एमटी-सुरक्षित था, लेकिन इसमें बुरा प्रदर्शन की समस्याएं थीं, ज्यादातर स्मृति प्रबंधन में (जो मुझे संदेह है कि गतिशील भाषाओं के लिए एक बहुत ही गर्म क्षेत्र है)। अनुभव वास्तव में अजगर के लिए सबसे सामान्य शब्दों के अलावा और किसी भी चीज़ पर नहीं ले जाता है; दो भाषाओं में पूरी तरह से अलग थ्रेडिंग मॉडल हैं। बस ... एक नारे की उम्मीद करें और अजीब कीड़े की उम्मीद करें ...
डोनल फेलो

-1

एक और जंगली परिकल्पना: १ ९९९ में लिनक्स और अन्य यूनियनों में एक अच्छा तालमेल नहीं था, जैसे अब futex(2)( http://en.wikipedia.org/wiki/Futex ) के साथ है। वे 2002 के आसपास आए (और 2004 के आसपास 2.6 में विलय हो गए)।

चूंकि सभी अंतर्निहित डेटा संरचनाओं को सिंक्रनाइज़ करना पड़ता है, इसलिए लॉकिंग लागत बहुत अधिक होती है। Ӎσᶎ पहले ही बताया गया है, कि परमाणु संचालन आवश्यक सस्ता नहीं है।


1
क्या आपके पास इसे वापस करने के लिए कुछ है? या यह लगभग अटकलें हैं?

1
GvR उद्धरण प्रदर्शन का वर्णन करता है "मंच पर सबसे तेज़ लॉकिंग प्राइमिटिव (उस समय विंडोज)" के साथ लिनक्स पर इतना धीमा लॉक प्रासंगिक है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.