Αυτός ο οδηγός καλύπτει τη λειτουργία του seine σε μεγάλα μηχανήματα και σε ένα rack από rigs εξόρυξης: πώς τοποθετεί τα νήματα σε διακομιστές με πολλούς πυρήνες, πώς να το τρέχετε χωρίς τερματικό κάτω από έναν διαχειριστή υπηρεσιών και πώς να ξεκινάτε, να σταματάτε και να παρακολουθείτε κάθε rig μέσω του τοπικού API ελέγχου, της ζωντανής ροής συμβάντων και των μετρικών Prometheus.
Πώς αξιοποιεί το seine έναν μεγάλο διακομιστή;
Στο Linux, το seine κατανέμει τα νήματα εξόρυξης σε κόμβους NUMA και στις ομάδες cache L3 μέσα σε κάθε κόμβο, με ένα νήμα ανά φυσικό πυρήνα πριν από οποιοδήποτε αδέλφι SMT. Κάθε νήμα δεσμεύεται στον πυρήνα του πριν δεσμεύσει την arena των 2 GiB, ώστε η μνήμη να βρεθεί κοντά του. Αυτή είναι η προεπιλογή, οπότε δεν υπάρχει τίποτα να ρυθμίσετε.
Η απόδειξη εργασίας Argon2id του Blocknet είναι κυρίως κίνηση μνήμης. Κάθε νήμα γεμίζει και διαβάζει ξανά τη δική του arena 2 GiB για κάθε hash, οπότε το hashrate εξαρτάται από το πόσους ελεγκτές μνήμης και ομάδες cache κρατούν απασχολημένους τα νήματά σας ταυτόχρονα. Ο οδηγός για το Argon2id εξηγεί το γιατί.
Αν τα νήματα απλώς ακολουθούν τη σειρά CPU του λειτουργικού συστήματος, γεμίζουν τους πρώτους πυρήνες της λίστας, που βρίσκονται όλοι στον ίδιο κόμβο και στις ίδιες λίγες ομάδες cache. Σε ένα μηχάνημα EPYC με δύο κόμβους, οκτώ νήματα με τη σειρά του λειτουργικού κατέληξαν όλα στον κόμβο 0, με σχεδόν και τα 16 GiB των arenas στη μνήμη εκείνου του κόμβου. Η αυτόματη τοποθέτηση του seine έβαλε τέσσερα νήματα σε κάθε κόμβο και περίπου 8 GiB arenas σε καθέναν, οπότε η μνήμη και των δύο κόμβων χρησιμοποιούνταν ταυτόχρονα. Σε ένα EPYC 8434P ενός κόμβου με οκτώ ομάδες L3, 24 νήματα με τη σειρά του λειτουργικού στοιβάχτηκαν ανά έξι σε τέσσερις ομάδες. Το seine χρησιμοποίησε και τις οκτώ ομάδες, με τρία νήματα στην καθεμία.
Η τοποθέτηση ακολουθεί τα όρια που δίνετε στη διεργασία. Σέβεται τις μάσκες CPU και μνήμης της διεργασίας, οπότε λειτουργεί μέσα σε taskset, cgroups και containers και χρησιμοποιεί μόνο τους πυρήνες που επιτρέπετε. Απευθείας στα Windows, η ίδια ρύθμιση auto γεμίζει τους φυσικούς πυρήνες πριν από τα αδέλφια SMT.
Πόσο ταχύτερη είναι η τοποθέτηση με επίγνωση NUMA;
Οι προγραμματιστές του seine τη μέτρησαν στις 24 Οκτωβρίου 2026 με το ίδιο ακριβώς εκτελέσιμο, τρέχοντάς το με δύο τρόπους σε εναλλασσόμενα ζεύγη: με την αυτόματη τοποθέτηση του seine και με δέσμευση στην απλή σειρά του λειτουργικού (--cpu-affinity os):
| Μηχάνημα | Νήματα | Σελίδες μνήμης | Κέρδος από την αυτόματη τοποθέτηση |
|---|---|---|---|
| AMD EPYC δύο κόμβων · Zen 3 (EPYC 7R13, AWS c6a.8xlarge) | 8 | Κανονικές | +73% |
| AMD EPYC δύο κόμβων · Zen 3 (EPYC 7R13, AWS c6a.8xlarge) | 8 | Huge pages 2 MiB | +108% |
| Διακομιστής AMD EPYC (EPYC 8434P, 48 πυρήνες, οκτώ ομάδες L3) | 24 | Κανονικές | +16,7% |
Κάθε εναλλασσόμενο ζεύγος ευνόησε την αυτόματη τοποθέτηση, και η πλήρης μέθοδος και τα ακατέργαστα αποτελέσματα βρίσκονται στον οδηγό για μεγάλους διακομιστές και στο ημερολόγιο βελτιστοποίησης CPU του seine.
Το κέρδος εμφανίζεται όταν το seine τρέχει λιγότερα νήματα από τους πυρήνες του μηχανήματος. Αυτό συμβαίνει κάθε φορά που η RAM, και όχι ο αριθμός πυρήνων, ορίζει τον αριθμό νημάτων: κάθε νήμα χρειάζεται περίπου 2 GB, οπότε για να γεμίσει ένας διακομιστής 48 πυρήνων χρειάζονται περίπου 96 GB μόνο για τις arenas. Η τοποθέτηση εξασφαλίζει ότι τα νήματα που χωρούν απλώνονται σε κάθε κόμβο NUMA και κάθε ομάδα cache.
Η τοποθέτηση και οι huge pages αθροίζονται, όπως δείχνει η δεύτερη γραμμή. Αν δεσμεύετε huge pages, δεσμεύστε τες σε κάθε κόμβο που φιλοξενεί νήματα, επειδή ένα αρκετά μεγάλο σύνολο δεν εγγυάται τοπικές σελίδες. Ο οδηγός για τις huge pages καλύπτει τη ρύθμιση των σελίδων, και στο Linux η δεξαμενή 2 MiB κάθε κόμβου ορίζεται στο /sys/devices/system/node/node<N>/hugepages/hugepages-2048kB/nr_hugepages.
Για να ελέγξετε το αποτέλεσμα στο δικό σας μηχάνημα, συγκρίνετε το auto με το os με τον ίδιο αριθμό νημάτων και την ίδια ρύθμιση σελίδων. Το --cpu-affinity off αφήνει την τοποθέτηση εξ ολοκλήρου στον χρονοπρογραμματιστή.
Περιθώριο μνήμης σε κοινόχρηστους διακομιστές
Ο αυτόματος καθορισμός νημάτων κρατά ελεύθερο το 5% της συνολικής RAM, επιπλέον από τυχόν δέσμευση για GPU. Αλλάξτε το με --cpu-memory-reserve-percent. Αν άλλες υπηρεσίες αρχίσουν να χρησιμοποιούν μνήμη, τα αυτόματα νήματα του seine απελευθερώνουν τις arenas τους και επιστρέφουν μόλις ελευθερωθεί μνήμη, οπότε η εξόρυξη προσαρμόζεται στο υπόλοιπο μηχάνημα. Τα αποτελέσματα ρύθμισης αποθηκεύονται ανά μηχάνημα, και η αποθήκευση μηδενίζεται όταν αλλάζει το επιτρεπόμενο σύνολο CPU ή η διάταξη NUMA και L3, για παράδειγμα μετά από αλλαγή μεγέθους μιας εικονικής μηχανής.
Πώς τρέχετε το seine χωρίς τερματικό;
Δώστε τη διεύθυνση πληρωμής και το pool στη γραμμή εντολών, για παράδειγμα --address με τη διεύθυνσή σας ή το @name σας και --pool-url stratum+tcp://bntpool.com:3333. Το seine τότε ξεκινά χωρίς ερωτήσεις, αποθηκεύει τις ρυθμίσεις στον κατάλογο δεδομένων του και τυπώνει απλές γραμμές καταγραφής όταν δεν υπάρχει συνδεδεμένο τερματικό, ώστε να μπορεί να το τρέξει ένας διαχειριστής υπηρεσιών.
Σε έναν επιτραπέζιο υπολογιστή, το seine ζητά διεύθυνση και pool την πρώτη φορά που τρέχει. Σε έναν διακομιστή χωρίς συνδεδεμένο τερματικό, δώστε του και τα δύο από την αρχή:
./seine --address '@yourname' \
--pool-url stratum+tcp://bntpool.com:3333 \
--pool-worker rack1-node04 \
--data-dir /var/lib/seine
Το όνομα του rig (εδώ rack1-node04) είναι ο τρόπος με τον οποίο εμφανίζεται αυτό το μηχάνημα στο pool. Το seine αποθηκεύει τη διεύθυνση, το pool και το όνομα του rig στο seine.config.json στον κατάλογο δεδομένων (./seine-data από προεπιλογή), οπότε οι επόμενες εκκινήσεις με τον ίδιο κατάλογο δεδομένων δεν χρειάζονται άλλα flags. Με την προεπιλογή --ui auto, δείχνει τον πίνακα ελέγχου σε τερματικό και απλές γραμμές καταγραφής σε κάθε άλλη περίπτωση· το --ui plain επιβάλλει απλή έξοδο. Βάλτε σε εισαγωγικά τα @name και $name στις εντολές του shell.
Στο Linux, μια μονάδα systemd ξεκινά το seine κατά την εκκίνηση και το επανεκκινεί αν τερματιστεί:
[Unit]
Description=seine Blocknet miner
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/opt/seine/seine --data-dir /var/lib/seine --address @yourname --pool-url stratum+tcp://bntpool.com:3333 --ui plain
DynamicUser=yes
StateDirectory=seine
Restart=always
[Install]
WantedBy=multi-user.target
Το seine επιλύει το σύντομο όνομα κατά την εκκίνηση, οπότε η μονάδα περιμένει το δίκτυο. Κάθε rig ρυθμίζεται μόνο του ενώ κάνει εξόρυξη και κρατά τις επιλογές του στον δικό του κατάλογο δεδομένων για την επόμενη εκκίνηση.
Πώς ελέγχετε το seine μέσω του API του;
Το seine έχει τοπικό REST API με ζωντανή ροή συμβάντων και μετρικές Prometheus, φτιαγμένο για πίνακες ελέγχου και εργαλεία διαχείρισης στόλου. Υπάρχουν δύο τρόποι να το ξεκινήσετε:
# API only: seine waits for a start request
./seine --service --api-bind 127.0.0.1:9977
# Mine right away and serve the API
./seine --api-server --api-bind 127.0.0.1:9977
Η λειτουργία --service ξεκινά το API και αφήνει τον miner σε αναμονή μέχρι ένας ελεγκτής να στείλει POST /v1/miner/start, που μπορεί να περιέχει τη διεύθυνση, το pool, τον αριθμό νημάτων και άλλες ρυθμίσεις για εκείνη την εκτέλεση. Ο ελεγκτής σας αποφασίζει πότε κάνει εξόρυξη κάθε μηχάνημα και με ποιες ρυθμίσεις.
Το token του API
Από την έκδοση v0.2.23 του seine, κάθε endpoint εκτός από το GET /v1/health χρειάζεται Authorization: Bearer <token>. Το seine γράφει ένα νέο τυχαίο token στο control-api.cookie στον κατάλογο δεδομένων σε κάθε εκκίνηση, αναγνώσιμο μόνο από τον κάτοχό του στο Unix, και το διαγράφει κατά τον τερματισμό. Για εργαλεία στόλου που χρειάζονται σταθερή τιμή, ορίστε μία με --api-token ή μετακινήστε το αρχείο με --api-cookie. Επίσης, το API δεν στέλνει κεφαλίδες CORS από προεπιλογή και, όταν ακούει σε loopback, απορρίπτει αιτήματα των οποίων το Host δεν είναι τοπικό, κάτι που εμποδίζει τους ιστότοπους που επισκέπτεστε να αλλάξουν τη διεύθυνση πληρωμής ή τις ρυθμίσεις σας.
Το API ακούει στο 127.0.0.1:9977 από προεπιλογή. Για σύνδεση σε άλλη διεπαφή χρειάζεται το --api-allow-unsafe-bind, οπότε το API μένει στο μηχάνημα εκτός αν επιλέξετε διαφορετικά.
export SEINE_API_TOKEN="$(cat seine-data/control-api.cookie)"
curl -s -X POST http://127.0.0.1:9977/v1/miner/start \
-H "Authorization: Bearer $SEINE_API_TOKEN" \
-H 'content-type: application/json' \
-d '{"mode":"pool","mining_address":"@yourname","pool_url":"stratum+tcp://bntpool.com:3333","pool_worker":"rack1-node04"}'
curl -N -H "Authorization: Bearer $SEINE_API_TOKEN" http://127.0.0.1:9977/v1/events/stream
Ζωντανά συμβάντα
Το GET /v1/events/stream είναι μια ροή server-sent events. Αναφέρει αλλαγές κατάστασης, φάσεις backend, την πρόοδο και τα αποτελέσματα της αυτόματης ρύθμισης, λύσεις που βρέθηκαν και αποτελέσματα υποβολών τη στιγμή που συμβαίνουν, ώστε ένας πίνακας ελέγχου να δείχνει κάθε rig ζωντανά. Μετά από επανασύνδεση, το GET /v1/runtime/state επιστρέφει όλη την τρέχουσα κατάσταση.
Μετρικές Prometheus
Το GET /metrics σερβίρει μετρικές Prometheus, όπως τις seine_miner_running, seine_miner_lifecycle_info, seine_miner_submitted_blocks_total, seine_miner_accepted_blocks_total και seine_miner_stale_submits_total. Επειδή το cookie αλλάζει σε κάθε εκκίνηση και μόνο ο χρήστης του seine μπορεί να το διαβάσει, δώστε στο Prometheus ένα σταθερό token: ξεκινήστε το seine με --api-token και αποθηκεύστε την ίδια τιμή σε ένα αρχείο που μπορεί να διαβάσει το Prometheus. Μια εργασία scrape στο ίδιο μηχάνημα μοιάζει τότε έτσι:
scrape_configs:
- job_name: seine
authorization:
type: Bearer
credentials_file: /etc/prometheus/seine-token
static_configs:
- targets: ['127.0.0.1:9977']
Η πλήρης λίστα endpoints, τα σχήματα αιτημάτων και ο κατάλογος συμβάντων βρίσκονται στην τεκμηρίωση του API ελέγχου του seine.
Επιλογή μηχανημάτων για ένα rig
Η τοποθέτηση, η λειτουργία χωρίς τερματικό και το API λειτουργούν το ίδιο σε έναν μεμονωμένο πύργο και σε ένα rack διακομιστών. Για το ποιοι επεξεργαστές κάνουν ταχύτερη εξόρυξη και πόση RAM να βάλετε ανά νήμα, δείτε τον οδηγό υλικού εξόρυξης Blocknet. Νέοι στο seine; Ξεκινήστε με το πώς να κάνετε εξόρυξη Blocknet.
Συχνές ερωτήσεις
Υποστηρίζει το seine διακομιστές NUMA;
Ναι. Στο Linux, η προεπιλεγμένη αυτόματη συνάφεια (affinity) του seine κατανέμει τα νήματα εξόρυξης σε κόμβους NUMA και ομάδες cache L3, ένα ανά φυσικό πυρήνα πριν από τα αδέλφια SMT, και κάθε νήμα δεσμεύεται στον πυρήνα του πριν δεσμεύσει την arena των 2 GiB, ώστε η μνήμη να βρεθεί κοντά του. Σε ένα μηχάνημα EPYC με δύο κόμβους αυτό αύξησε το hashrate κατά 73 τοις εκατό με οκτώ νήματα.
Μπορεί το seine να τρέχει χωρίς τερματικό, ως υπηρεσία στο παρασκήνιο;
Ναι. Δώστε --address και --pool-url στην πρώτη εκτέλεση και το seine ξεκινά χωρίς καμία ερώτηση, αποθηκεύει και τα δύο στο seine.config.json στον κατάλογο δεδομένων του και περνά σε απλές γραμμές καταγραφής όταν δεν υπάρχει συνδεδεμένο τερματικό. Έτσι τρέχει εύκολα κάτω από το systemd ή άλλο διαχειριστή υπηρεσιών που το επανεκκινεί αυτόματα.
Εξάγει το seine μετρικές Prometheus;
Ναι. Ξεκινήστε το seine με --api-server ή --service και σερβίρει μετρικές Prometheus στο /metrics του τοπικού API ελέγχου, που ακούει στο 127.0.0.1 θύρα 9977 από προεπιλογή. Οι μετρικές καλύπτουν αν ο miner τρέχει, την κατάσταση κύκλου ζωής του, τις υποβληθείσες, αποδεκτές και ληγμένες λύσεις, και τις απομονώσεις backend. Τα scrapes στέλνουν το bearer token του API.
Γιατί το API ελέγχου του seine ζητά token;
Από την έκδοση v0.2.23 του seine, κάθε endpoint του API ελέγχου εκτός από τον έλεγχο υγείας χρειάζεται bearer token, κάτι που εμποδίζει τους ιστότοπους που επισκέπτεστε να αλλάξουν τη διεύθυνση πληρωμής ή τις ρυθμίσεις σας. Το seine γράφει νέο token στο control-api.cookie στον κατάλογο δεδομένων του σε κάθε εκκίνηση, ή μπορείτε να ορίσετε σταθερό με --api-token.