معيار أداء المفهرسات: Zaino مقابل Ztreamer
Zaino وZtreamer مفهرسان يوفّران بروتوكول gRPC الخاص بـ lightwallet، وهو واجهة API التي تستخدمها محافظ Zcash الخفيفة للمزامنة. تلخّص هذه الصفحة مقارنة مستقلة وقابلة لإعادة الإنتاج بينهما: ما إذا كانا يعيدان الإجابات ذاتها، والوقت الذي يستغرقه كل منهما لبناء فهرسه، ومدى سرعة خدمته للمحافظ.
الخلاصة
- يعيد كلا المفهرسين بيانات سلسلة صحيحة. طابقت كل استجابة أمكن التحقق منها مقابل Zebra، لذا يمكن للمحافظ استخدام أيٍّ منهما.
- الفروقات التي وُجدت هي اصطلاحات وحالات طرفية: رموز الأخطاء، وترتيب البايتات لتجزئة واحدة، وكيفية احتساب عنوان مكرر، وبعض أشكال استجابة JSON-RPC.
- يبني Ztreamer فهرسه بسرعة أكبر بنحو 6× على المعالج نفسه. يبدأ Zaino بالإجابة بعد 6 ثوانٍ عبر تمرير الطلبات إلى Zebra أثناء البناء.
- يخدم Ztreamer بسرعة أكبر في كل سيناريو تم قياسه: 13–17× كتلاً أكثر في الثانية لتنزيل محفظة كاملة.
- يأتي كثير من زمن الاستجابة في Zaino من إعداد socket مفقود واحد (
TCP_NODELAY)، يضيف نحو 40 مللي ثانية إلى العديد من الطلبات. إصلاحه يتطلب سطراً واحداً.
ما الذي تمت مقارنته
| البناء | العقدة الخلفية | السبب |
|---|
| 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) في العملية نفسها ويحافظ على فهرس للكتل المدمجة.
كيفية القياس
- البيانات نفسها للجميع. بدأ كل بناء من لقطة testnet نفسها لـ Zcash Foundation، مجمّدة عند الارتفاع 4,382,897، بحيث فهرست جميعها السلسلة نفسها تماماً.
- يمكن لأي شخص تكراره. يعمل كل شيء على مشغّلات مستضافة من GitHub مجاناً: انسخ المستودع وشغّل سير عمل واحداً.
- ثلاثة تشغيلات لكل بناء، كل منها من فهرس فارغ. عمل الخادم ومولّد الحمل على نواتَي CPU منفصلتين.
- التوافق: جميع طرق gRPC الـ20 لبروتوكول lightwallet (274 حالة اختبار)، قورنت بايتاً ببايت عبر البنى وتحققت مقابل JSON-RPC الخاص بـ Zebra. كما تم التحقق من طرق JSON-RPC الـ28 التي يقدمها Zaino.
- الأداء: الوقت والموارد لبناء الفهرس، وزمن الاستجابة لكل طلب، ومعدل نقل نطاق الكتل، ومن 1 إلى 128 عميلاً متزامناً، وتنزيل محفظة كاملة من تفعيل Sapling حتى القمة.
النتائج
بناء الفهرس
وسيط ثلاث تشغيلات:
| البناء | اكتمال الفهرس | أول إجابة | حجم الفهرس على القرص |
|:--|--:|--:|
| Zaino 0.10.1 | 1,395 ث | 6 ث | 22.06 GiB |
| Zaino 0.9.0 | 1,211 ث | 6 ث | 22.06 GiB |
| Ztreamer v0.1.0 | 216 ث | 210 ث | 1.44 GiB |
| Ztreamer master | 159 ث | 158 ث | 1.44 GiB |
يمكن استخدام Zaino فوراً تقريباً لأنه يمرر الطلبات إلى Zebra أثناء البناء. لا يقدم Ztreamer أي شيء حتى يكتمل فهرسه. وعلى طراز CPU نفسه، استغرق Zaino 0.10.1 وقتاً أطول بمقدار 6–6.5× من Ztreamer v0.1.0، واستخدم وقت CPU أكبر بمقدار 7.5–8× (بما في ذلك 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 عميلاً (طلبات/ث) | 6,843 | 11,044 |
مع 128 عميلاً، تضيق الفجوة إلى نحو 2×، لأن كلا الخادمين كانا محدودين بنواتَي CPU.
حد 40 مللي ثانية
في Zaino، لدى ستة من اثني عشر RPC زمناً وسيطاً للاستجابة يبلغ نحو 40 مللي ثانية، ولكل RPC قيمة مئوية 99 تقارب 41 مللي ثانية. والسبب هو طريقة إعداد Zaino لمستمع gRPC: لا يُفعَّل خيار socket TCP_NODELAY مطلقاً، لذلك يؤخر نظام التشغيل الاستجابات الصغيرة لمدة تصل إلى 40 مللي ثانية.
أدى تفعيل الخيار من الخارج، دون تغيير الملف الثنائي لـ Zaino، إلى إزالة هذا الحد. على سبيل المثال، انخفض GetTreeState من 40.3 مللي ثانية إلى 0.75 مللي ثانية (Ztreamer: 0.63 مللي ثانية). لم يتغير تدفق الكتل المجمعة، لذا فإن فجوة معدل النقل أعلاه حقيقية.
اختلافات التوافق
- يتضمن Zaino 0.9.0 بيانات شفافة في
GetBlock افتراضياً، بينما ينص البروتوكول على أن الافتراضي هو البيانات المحمية فقط. تم إصلاح ذلك في 0.10.1.
GetSubtreeRoots: يستخدم الحقل completingBlockHash ترتيبي بايتات متعاكسين في المفهرسين. لا تقرأ المحافظ الحالية هذا الحقل.
- رموز الأخطاء: يعيد Zaino القيمة
INTERNAL للإدخال غير الصحيح؛ بينما يعيد Ztreamer القيمة INVALID_ARGUMENT أو NOT_FOUND.
- تُحتسب العناوين المكررة في
GetTaddressBalanceStream مرتين، باستثناء Ztreamer master.
- JSON-RPC: يعيد Zaino's
getrawtransaction مع الإسهاب 0 كائناً بدلاً من سلسلة hex، بخلاف Zebra وzcashd.
القيود
- Testnet فقط. كتل testnet أصغر من كتل mainnet، لذا فالأزمنة والأحجام المطلقة ليست أرقام mainnet. المقارنة نسبية، على مدخلات متطابقة.
- أجهزة CI مشتركة تضم عدة طرازات CPU. يقدم التقرير الكامل مقارنات على CPU نفسه للأرقام الرئيسية.
- لم يُقَس: إعادة التنظيم، ومتابعة قمة سلسلة حية، وحمل mempool، وTLS.
أين تتعلم المزيد