Σύγκριση επιδόσεων indexer: Zaino vs Ztreamer
Τα Zaino και Ztreamer είναι δύο indexer που εξυπηρετούν το πρωτόκολλο lightwallet gRPC, το API που χρησιμοποιούν τα light wallets του Zcash για συγχρονισμό. Αυτή η σελίδα συνοψίζει μια ανεξάρτητη, αναπαραγώγιμη σύγκριση των δύο: αν επιστρέφουν τις ίδιες απαντήσεις, πόσο χρόνο χρειάζονται για να δημιουργήσουν το index τους και πόσο γρήγορα εξυπηρετούν πορτοφόλια.
Με λίγα λόγια
- Και οι δύο indexer επιστρέφουν σωστά δεδομένα αλυσίδας. Κάθε απάντηση που μπορούσε να ελεγχθεί σε σχέση με το Zebra ταίριαζε, επομένως τα πορτοφόλια μπορούν να χρησιμοποιούν οποιονδήποτε από τους δύο.
- Οι διαφορές που βρέθηκαν είναι συμβάσεις και ακραίες περιπτώσεις: κωδικοί σφάλματος, η σειρά byte ενός hash, ο τρόπος καταμέτρησης μιας διπλότυπης διεύθυνσης και μερικά σχήματα απόκρισης JSON-RPC.
- Το Ztreamer δημιουργεί το index του περίπου 6× γρηγορότερα στον ίδιο CPU. Το Zaino αρχίζει να απαντά έπειτα από 6 δευτερόλεπτα προωθώντας αιτήματα στο Zebra ενώ το δημιουργεί.
- Το Ztreamer εξυπηρετεί γρηγορότερα σε κάθε σενάριο που μετρήθηκε: 13–17× περισσότερα μπλοκ ανά δευτερόλεπτο για πλήρη λήψη πορτοφολιού.
- Μεγάλο μέρος της καθυστέρησης του Zaino προέρχεται από μία ρύθμιση socket που λείπει (
TCP_NODELAY), η οποία προσθέτει περίπου 40 ms σε πολλά αιτήματα. Η διόρθωση απαιτεί μία γραμμή.
Τι συγκρίθηκε
| Build | Υποστηρικτικός κόμβος | Γιατί |
|---|
| Zaino 0.10.1 | Zebra 6.4.2 (direct backend) | Τελευταία σταθερή έκδοση του Zaino |
| Zaino 0.9.0 | Zebra 6.4.2 (direct backend) | Η έκδοση που μετρήθηκε στη δημοσιευμένη σύγκριση του Ztreamer |
| Ztreamer v0.1.0 | Ενσωματωμένος κόμβος Zakura | Τελευταίο tag του Ztreamer |
| Ztreamer master | Ενσωματωμένο Zakura 1.5.1 | Αυτό που δημιουργούν οι οδηγίες εγκατάστασης του Ztreamer |
Οι δύο χρησιμοποιούν διαφορετικά σχέδια:
- Το Zaino εκτελείται ως ξεχωριστή διεργασία δίπλα σε έναν πλήρη κόμβο Zebra, διαβάζει την κατάσταση του Zebra και διατηρεί το δικό του index. Είναι ο indexer στη στοίβα Z3. Δες Zaino.
- Το Ztreamer ενσωματώνει έναν κόμβο Zakura (ένα fork του Zebra) στην ίδια διεργασία και διατηρεί ένα index compact-block.
Πώς μετρήθηκε
- Τα ίδια δεδομένα για όλους. Κάθε build ξεκίνησε από το ίδιο snapshot testnet του Zcash Foundation, παγωμένο στο ύψος 4.382.897, ώστε όλα να κάνουν index ακριβώς την ίδια αλυσίδα.
- Οποιοσδήποτε μπορεί να το επαναλάβει. Όλα εκτελούνται σε δωρεάν runners που φιλοξενούνται από το GitHub: κάνε fork το αποθετήριο και εκτέλεσε ένα workflow.
- Τρεις εκτελέσεις ανά build, καθεμία από κενό index. Ο server και η γεννήτρια φορτίου εκτελέστηκαν σε ξεχωριστούς πυρήνες CPU.
- Συμβατότητα: και οι 20 μέθοδοι gRPC του πρωτοκόλλου lightwallet (274 περιπτώσεις δοκιμών), συγκρίθηκαν byte προς byte μεταξύ των builds και ελέγχθηκαν σε σχέση με το JSON-RPC του Zebra. Ελέγχθηκαν επίσης οι 28 μέθοδοι JSON-RPC που εξυπηρετεί το Zaino.
- Επιδόσεις: χρόνος και πόροι για τη δημιουργία του index, καθυστέρηση ανά αίτημα, απόδοση εύρους μπλοκ, 1 έως 128 ταυτόχρονοι πελάτες και πλήρης λήψη πορτοφολιού από την ενεργοποίηση του Sapling έως την κορυφή.
Αποτελέσματα
Δημιουργία index
Διάμεσοι τριών εκτελέσεων:
| Build | Ολοκλήρωση index | Πρώτη απάντηση | Μέγεθος index στον δίσκο |
|---|
| 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 ενώ δημιουργεί το index του. Το Ztreamer δεν εξυπηρετεί τίποτα έως ότου ολοκληρωθεί το index του. Στο ίδιο μοντέλο CPU, το Zaino 0.10.1 χρειάστηκε 6–6,5× περισσότερο χρόνο από το Ztreamer v0.1.0 και χρησιμοποίησε 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×, επειδή και οι δύο server περιορίστηκαν σε δύο πυρήνες CPU.
Το κατώφλι των 40 ms
Στο Zaino, έξι από τα δώδεκα RPC έχουν διάμεση καθυστέρηση περίπου 40 ms και κάθε RPC έχει 99ο εκατοστημόριο γύρω στα 41 ms. Η αιτία είναι ο τρόπος με τον οποίο το Zaino ρυθμίζει τον gRPC listener του: η επιλογή socket TCP_NODELAY δεν ενεργοποιείται ποτέ, επομένως το λειτουργικό σύστημα καθυστερεί μικρές απαντήσεις έως και 40 ms.
Η ενεργοποίηση της επιλογής εξωτερικά, χωρίς αλλαγή του binary του Zaino, αφαίρεσε το κατώφλι. Για παράδειγμα, το GetTreeState μειώθηκε από 40,3 ms σε 0,75 ms (Ztreamer: 0,63 ms). Η μαζική ροή μπλοκ δεν άλλαξε, επομένως το παραπάνω χάσμα απόδοσης είναι πραγματικό.
Διαφορές συμβατότητας
- Το Zaino 0.9.0 περιλαμβάνει διαφανή δεδομένα στο
GetBlock από προεπιλογή, ενώ το πρωτόκολλο λέει ότι η προεπιλογή είναι μόνο θωρακισμένα δεδομένα. Αυτό διορθώθηκε στο 0.10.1.
GetSubtreeRoots: το πεδίο completingBlockHash χρησιμοποιεί αντίθετες σειρές byte στους δύο indexer. Τα τρέχοντα πορτοφόλια δεν διαβάζουν αυτό το πεδίο.
- Κωδικοί σφάλματος: το Zaino επιστρέφει
INTERNAL για μη έγκυρη είσοδο· το Ztreamer επιστρέφει INVALID_ARGUMENT ή NOT_FOUND.
- Οι διπλότυπες διευθύνσεις στο
GetTaddressBalanceStream μετρούνται δύο φορές, εκτός από το Ztreamer master.
- JSON-RPC: το
getrawtransaction του Zaino με verbosity 0 επιστρέφει ένα αντικείμενο αντί για συμβολοσειρά hex, σε αντίθεση με τα Zebra και zcashd.
Περιορισμοί
- Μόνο testnet. Τα μπλοκ του testnet είναι μικρότερα από εκείνα του mainnet, επομένως οι απόλυτοι χρόνοι και τα μεγέθη δεν είναι στοιχεία mainnet. Η σύγκριση είναι σχετική, σε πανομοιότυπες εισόδους.
- Κοινόχρηστες μηχανές CI με αρκετά μοντέλα CPU. Η πλήρης αναφορά παρέχει συγκρίσεις στον ίδιο CPU για τους βασικούς αριθμούς.
- Δεν μετρήθηκαν: reorgs, παρακολούθηση μιας ζωντανής κορυφής αλυσίδας, φορτίο mempool και TLS.
Πού να μάθεις περισσότερα