कैविएट: नीचे अशुद्धि हो सकती है। मैं इस सामान के बारे में बहुत कुछ सीख रहा हूं क्योंकि मैं इसके साथ जाता हूं, इसलिए इसे एक चुटकी नमक के साथ लें। यह काफी लंबा है, लेकिन आप बस उन मापदंडों को पढ़ सकते हैं जिनके साथ हम खेल रहे थे, फिर अंत में निष्कर्ष पर जाएं।
वहाँ कई परतें हैं जहाँ आप SQLite लेखन प्रदर्शन के बारे में चिंता कर सकते हैं:
हमने बोल्ड में हाइलाइट किए गए लोगों को देखा। विशेष पैरामीटर थे
- डिस्क कैश लिखें। आधुनिक डिस्क में रैम कैश होता है जिसका उपयोग डिस्क लिखने को कताई डिस्क के संबंध में करने के लिए किया जाता है। इस सक्षम के साथ, डेटा को आउट-ऑफ-ऑर्डर ब्लॉकों में लिखा जा सकता है, इसलिए यदि कोई दुर्घटना होती है, तो आप आंशिक रूप से लिखित फ़ाइल के साथ समाप्त हो सकते हैं। HDparm -W / dev / ... के साथ सेटिंग की जाँच करें और इसे hdparm -W1 / dev / ... (इसे चालू करने के लिए, और -W0 इसे बंद करने के लिए) के साथ सेट करें।
- बाधा = (0 | 1)। ऑनलाइन टिप्पणियों के बहुत सारे "अगर आप बाधा = 0 के साथ चलते हैं, तो डिस्क लेखन कैशिंग सक्षम नहीं है"। आप http://lwn.net/Articles/283161/ पर बाधाओं की चर्चा पा सकते हैं
- डेटा = (पत्रिका | आदेश दिया | राइटबैक)। को देखो http://www.linuxtopia.org/HowToGuides/ext3JournalingFilesystem.html इन विकल्पों के वर्णन के लिए।
- प्रतिबद्ध = एन। सभी डेटा और मेटाडेटा को हर N सेकंड (डिफ़ॉल्ट 5) को सिंक करने के लिए ext3 बताता है।
- SQLite pragma तुल्यकालिक = ON | बंद। जब चालू होता है, तो SQLite सुनिश्चित करेगा कि जारी रखने से पहले एक लेनदेन "डिस्क पर लिखा गया है"। अनिवार्य रूप से इसे बंद करने से अन्य सेटिंग्स काफी हद तक अप्रासंगिक हो जाती हैं।
- SQLite pragma cache_size। नियंत्रण करता है कि स्मृति इन-कैश के लिए SQLite कितना मेमोरी का उपयोग करेगा। मैंने दो आकारों की कोशिश की: एक जहां पूरा DB कैश में फिट होगा, और एक जहां कैश अधिकतम DB आकार का आधा था।
Ext3 प्रलेखन में ext3 विकल्पों के बारे में अधिक पढ़ें ।
मैंने इन मापदंडों के कई संयोजनों पर प्रदर्शन परीक्षण चलाए। आईडी एक परिदृश्य संख्या है, जिसे नीचे संदर्भित किया गया है।
मैंने अपनी मशीन पर डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ परिदृश्य 1 के रूप में चलना शुरू कर दिया। परिदृश्य 2 वह है जिसे मैं "सबसे सुरक्षित" मानता हूं, और फिर विभिन्न संयोजनों की कोशिश की, जहां उपयुक्त / संकेत दिया गया। यह संभवतः मेरे द्वारा उपयोग किए गए मानचित्र के साथ समझने में आसान है:
मैंने एक टेस्ट स्क्रिप्ट लिखी, जिसमें बहुत सारे लेन-देन, आवेषण, अपडेट और डिलीट के साथ, सभी टेबल पर केवल INTEGER के साथ, केवल TEXT (आईडी कॉलम के साथ), या मिश्रित मिला। मैंने ऊपर के प्रत्येक विन्यास पर इसे कई बार चलाया:
नीचे के दो परिदृश्य # 6 और # 17 हैं, जिनमें "प्राग समकालिक = बंद" है, इसलिए यह आश्चर्यजनक है कि वे सबसे तेज़ थे। तीन के अगले क्लस्टर # 7, # 11 और # 19 हैं। इन तीनों को "कॉन्फ़िगरेशन मानचित्र" पर नीले रंग में हाइलाइट किया गया है। मूल रूप से कॉन्फ़िगरेशन डिस्क लेखन कैश ऑन, बैरियर = 0, और डेटा 'जर्नल' के अलावा किसी अन्य चीज़ के लिए सेट है। 5 सेकंड (# 7) और 60 सेकंड (# 11) के बीच परिवर्तन करने से कुछ फर्क नहीं पड़ता। इन परीक्षणों पर डेटा = ऑर्डर किया गया और डेटा = राइटबैक के बीच कोई अंतर नहीं है, जो मुझे आश्चर्यचकित करता है।
मिश्रित अद्यतन परीक्षण बीच शिखर है। परिदृश्यों का एक समूह है जो इस परीक्षण पर अधिक स्पष्ट रूप से धीमा हैं। ये सभी डेटा = जर्नल वाले हैं । अन्यथा अन्य परिदृश्यों के बीच बहुत कुछ नहीं है।
मेरे पास एक और समय परीक्षण था, जिसने विभिन्न प्रकार के संयोजनों पर आवेषण, अपडेट और डिलीट का अधिक विषम मिश्रण किया। इनमें बहुत अधिक समय लगा, यही वजह है कि मैंने इसे उपरोक्त कथानक में शामिल नहीं किया:
यहां आप देख सकते हैं कि राइटबैक कॉन्फ़िगरेशन (# 19) ऑर्डर किए गए लोगों की तुलना में थोड़ा धीमा है (# 7 और # 11)। मुझे उम्मीद थी कि राइटबैक थोड़ा तेज़ होगा, लेकिन शायद यह आपके लेखन पैटर्न पर निर्भर करता है, या शायद मैंने अभी तक एक्स 3 पर पर्याप्त पढ़ा नहीं है :-)
विभिन्न परिदृश्य हमारे अनुप्रयोग द्वारा किए गए संचालन के कुछ प्रतिनिधि थे। परिदृश्यों की एक शॉर्टलिस्ट चुनने के बाद हमने अपने कुछ स्वचालित परीक्षण सूटों के साथ समय परीक्षण किया। वे ऊपर के परिणामों के अनुरूप थे।
निष्कर्ष
- प्रतिबद्ध पैरामीटर, थोड़ा अंतर बनाने के लिए लग रहा था तो हम 5s पर जा रहे हैं।
- हम डिस्क पर कैश लिखने जा रहे हैं, बाधा = 0 , और डेटा = ऑर्डर किया गया । मैंने कुछ चीजें ऑनलाइन पढ़ीं जो सोचा कि यह एक बुरा सेटअप है, और अन्य जो यह सोचते हैं कि यह बहुत सारी स्थितियों में डिफ़ॉल्ट होना चाहिए। मुझे लगता है कि सबसे महत्वपूर्ण यह है कि आप एक सूचित निर्णय लेते हैं, यह जानते हुए कि आप क्या व्यापार बंद कर रहे हैं।
- हम SQLite में सिंक्रोनस प्राग्म का उपयोग करने नहीं जा रहे हैं।
- SQLite cache_size pragma की स्थापना इसलिए DB कुछ मेमोरी पर बेहतर प्रदर्शन में फिट होगा, जैसा कि हम उम्मीद करते हैं।
- उपरोक्त कॉन्फ़िगरेशन का मतलब है कि हम थोड़ा अधिक जोखिम ले रहे हैं। हम आंशिक लिखने पर डिस्क विफलता के खतरे को कम करने के लिए SQLite बैकअप एपीआई का उपयोग करेंगे : प्रत्येक एन मिनट पर एक स्नैपशॉट लेना और अंतिम एम को इधर-उधर रखना। मैंने प्रदर्शन परीक्षण चलाते समय इस एपीआई का परीक्षण किया, और इसने हमें इस तरह जाने के लिए आत्मविश्वास दिया है।
- यदि हम अभी भी अधिक चाहते थे, तो हम कर्नेल के बारे में मिलाना देख सकते हैं, लेकिन हमने वहां जाने के बिना चीजों को बेहतर बनाया।
विभिन्न युक्तियों और संकेत के लिए @Huygens को धन्यवाद।