इंडेक्सर बेंचमार्क: Zaino बनाम Ztreamer
Zaino और Ztreamer दो इंडेक्सर हैं जो lightwallet gRPC प्रोटोकॉल प्रदान करते हैं, वह API जिसका उपयोग Zcash लाइट वॉलेट सिंक करने के लिए करते हैं। यह पृष्ठ दोनों की एक स्वतंत्र, पुनरुत्पादनीय तुलना का सार प्रस्तुत करता है: क्या वे समान उत्तर लौटाते हैं, अपना इंडेक्स बनाने में उन्हें कितना समय लगता है, और वे वॉलेट को कितनी तेज़ी से सेवा देते हैं।
संक्षेप में
- दोनों इंडेक्सर सही चेन डेटा लौटाते हैं। हर वह प्रतिक्रिया जिसे Zebra के विरुद्ध जाँचा जा सका, मेल खाई, इसलिए वॉलेट इनमें से किसी का भी उपयोग कर सकते हैं।
- पाए गए अंतर परंपराओं और विशेष स्थितियों के हैं: त्रुटि कोड, एक हैश का बाइट क्रम, डुप्लिकेट पते की गणना का तरीका, और कुछ JSON-RPC प्रतिक्रिया संरचनाएँ।
- Ztreamer समान CPU पर अपना इंडेक्स लगभग 6× तेज़ी से बनाता है। Zaino निर्माण के दौरान अनुरोधों को Zebra तक अग्रेषित करके 6 सेकंड बाद उत्तर देना शुरू कर देता है।
- Ztreamer हर मापे गए परिदृश्य में तेज़ सेवा देता है: पूरे वॉलेट डाउनलोड के लिए प्रति सेकंड 13–17× अधिक ब्लॉक।
- Zaino की विलंबता का बड़ा हिस्सा एक अनुपस्थित सॉकेट सेटिंग (
TCP_NODELAY) से आता है, जो कई अनुरोधों में लगभग 40 ms जोड़ देती है। इसका समाधान एक-पंक्ति का है।
क्या तुलना की गई
| बिल्ड | बैकिंग नोड | क्यों |
|---|
| Zaino 0.10.1 | Zebra 6.4.2 (direct बैकएंड) | नवीनतम स्थिर Zaino रिलीज़ |
| Zaino 0.9.0 | Zebra 6.4.2 (direct बैकएंड) | Ztreamer की स्वयं प्रकाशित तुलना में मापा गया संस्करण |
| Ztreamer v0.1.0 | एम्बेडेड Zakura नोड | नवीनतम Ztreamer टैग |
| Ztreamer master | एम्बेडेड Zakura 1.5.1 | Ztreamer के इंस्टॉल निर्देशों द्वारा बनाया गया संस्करण |
दोनों अलग-अलग डिज़ाइन का उपयोग करते हैं:
- Zaino एक Zebra पूर्ण नोड के साथ अलग प्रक्रिया के रूप में चलता है, Zebra की स्थिति पढ़ता है, और अपना इंडेक्स रखता है। यह Z3 स्टैक का इंडेक्सर है। देखें Zaino।
- Ztreamer उसी प्रक्रिया में एक Zakura नोड (Zebra फोर्क) एम्बेड करता है और एक कॉम्पैक्ट-ब्लॉक इंडेक्स रखता है।
इसे कैसे मापा गया
- सभी के लिए समान डेटा। हर बिल्ड समान Zcash Foundation testnet स्नैपशॉट से शुरू हुआ, जो ऊँचाई 4,382,897 पर स्थिर था, इसलिए सभी ने ठीक उसी चेन को इंडेक्स किया।
- कोई भी इसे दोहरा सकता है। सब कुछ निःशुल्क GitHub-होस्टेड रनर्स पर चलता है: रिपॉज़िटरी को फोर्क करें और एक वर्कफ़्लो चलाएँ।
- हर बिल्ड के लिए तीन रन, प्रत्येक खाली इंडेक्स से। सर्वर और लोड जनरेटर अलग CPU कोर पर चले।
- संगतता: सभी 20 lightwallet-प्रोटोकॉल gRPC विधियाँ (274 परीक्षण मामले), जिनकी बिल्ड के बीच बाइट-दर-बाइट तुलना हुई और Zebra के JSON-RPC के विरुद्ध जाँच हुई। Zaino द्वारा प्रदान की जाने वाली 28 JSON-RPC विधियाँ भी जाँची गईं।
- प्रदर्शन: इंडेक्स बनाने का समय और संसाधन, प्रति-अनुरोध विलंबता, ब्लॉक-रेंज थ्रूपुट, 1 से 128 समवर्ती क्लाइंट, और Sapling सक्रियण से टिप तक का पूरा वॉलेट डाउनलोड।
परिणाम
इंडेक्स निर्माण
तीन रन के माध्यिका:
| बिल्ड | इंडेक्स पूर्ण | पहला उत्तर | डिस्क पर इंडेक्स आकार |
|---|
| Zaino 0.10.1 | 1,395 s | 6 s | 22.06 GiB |
| Zaino 0.9.0 | 1,211 s | 6 s | 22.06 GiB |
| Ztreamer v0.1.0 | 216 s | 210 s | 1.44 GiB |
| Ztreamer master | 159 s | 158 s | 1.44 GiB |
Zaino लगभग तुरंत उपयोग योग्य हो जाता है क्योंकि निर्माण के दौरान यह अनुरोधों को Zebra तक अग्रेषित करता है। Ztreamer अपने इंडेक्स के पूर्ण होने तक कुछ भी सेवा नहीं देता। समान CPU मॉडल पर, Zaino 0.10.1 को Ztreamer v0.1.0 से 6–6.5× अधिक समय लगा और उसने 7.5–8× CPU समय उपयोग किया (Zebra शामिल है)।
सेवा
तीन रन के माध्यिका, जब तक अन्यथा उल्लेख न हो प्रति सेकंड ब्लॉक में:
| परिदृश्य | Zaino 0.10.1 | Ztreamer v0.1.0 |
|---|
| 1,000 ब्लॉक की ब्लॉक रेंज | 11,414 | 179,486 |
| पूरा वॉलेट डाउनलोड (280,000 → टिप) | 11,124 | 189,041 |
| 1,000 ब्लॉक की ब्लॉक रेंज, 128 क्लाइंट | 110,093 | 229,527 |
| एकल ब्लॉक, 128 क्लाइंट (अनुरोध/s) | 6,843 | 11,044 |
128 क्लाइंट के साथ अंतर घटकर लगभग 2× रह जाता है, क्योंकि दोनों सर्वर दो CPU कोर तक सीमित थे।
40 ms की न्यूनतम सीमा
Zaino पर, बारह में से छह RPC की माध्यिका विलंबता लगभग 40 ms है, और प्रत्येक RPC का 99वाँ पर्सेंटाइल लगभग 41 ms है। कारण वह तरीका है जिससे Zaino अपना gRPC लिस्नर सेट करता है: TCP_NODELAY सॉकेट विकल्प कभी चालू नहीं किया जाता, इसलिए ऑपरेटिंग सिस्टम छोटे उत्तरों को 40 ms तक रोके रखता है।
Zaino बाइनरी बदले बिना, बाहर से विकल्प चालू करने पर यह न्यूनतम सीमा हट गई। उदाहरण के लिए, GetTreeState 40.3 ms से घटकर 0.75 ms हो गया (Ztreamer: 0.63 ms)। बल्क ब्लॉक स्ट्रीमिंग में बदलाव नहीं हुआ, इसलिए ऊपर का थ्रूपुट अंतर वास्तविक है।
संगतता अंतर
- Zaino 0.9.0 डिफ़ॉल्ट रूप से
GetBlock में पारदर्शी डेटा शामिल करता है, जबकि प्रोटोकॉल के अनुसार डिफ़ॉल्ट केवल शील्डेड डेटा है। यह 0.10.1 में ठीक कर दिया गया है।
GetSubtreeRoots: completingBlockHash फ़ील्ड दोनों इंडेक्सरों पर विपरीत बाइट क्रम का उपयोग करता है। वर्तमान वॉलेट इस फ़ील्ड को नहीं पढ़ते।
- त्रुटि कोड: Zaino खराब इनपुट के लिए
INTERNAL लौटाता है; Ztreamer INVALID_ARGUMENT या NOT_FOUND लौटाता है।
GetTaddressBalanceStream में डुप्लिकेट पते दो बार गिने जाते हैं, सिवाय Ztreamer master पर।
- JSON-RPC: वर्बोसिटी 0 के साथ Zaino का
getrawtransaction, Zebra और zcashd के विपरीत, hex स्ट्रिंग के बजाय एक ऑब्जेक्ट लौटाता है।
सीमाएँ
- केवल Testnet। Testnet ब्लॉक mainnet की तुलना में छोटे हैं, इसलिए पूर्ण समय और आकार mainnet के आँकड़े नहीं हैं। तुलना समान इनपुट पर सापेक्ष है।
- साझा CI मशीनें जिनमें कई CPU मॉडल हैं। पूर्ण रिपोर्ट मुख्य आँकड़ों के लिए समान-CPU तुलनाएँ देती है।
- नहीं मापा गया: reorgs, लाइव चेन टिप का अनुसरण, mempool लोड, और TLS।
और अधिक कहाँ सीखें