คู่มือนี้ครอบคลุมการรัน seine บนเครื่องขนาดใหญ่และแร็กริกขุด วิธีจัดเธรดบนเซิร์ฟเวอร์หลายคอร์ วิธีรันแบบ headless ภายใต้ตัวจัดการบริการ และวิธีเริ่ม หยุด และติดตามทุกริกผ่าน API ควบคุมภายในเครื่อง สตรีมอีเวนต์สด และเมตริก Prometheus
seine ใช้เซิร์ฟเวอร์ขนาดใหญ่อย่างไร?
บน Linux นั้น seine กระจายเธรดขุดตามโหนด NUMA และกลุ่มแคช L3 ภายในแต่ละโหนด โดยใช้หนึ่งเธรดต่อคอร์จริงก่อนเธรด SMT ร่วมคอร์ แต่ละเธรดผูกกับคอร์ก่อนจัดสรรบล็อกหน่วยความจำ 2 GiB เพื่อให้หน่วยความจำอยู่ใกล้เธรด นี่เป็นค่าเริ่มต้น จึงไม่ต้องตั้งค่า
Proof of Work แบบ Argon2id ของ Blocknet ส่วนใหญ่เป็นการเคลื่อนย้ายข้อมูลในหน่วยความจำ ทุกเธรดเติมและอ่านบล็อกหน่วยความจำ 2 GiB ของตัวเองกลับในแต่ละแฮช แฮชเรตจึงขึ้นอยู่กับจำนวนตัวควบคุมหน่วยความจำและกลุ่มแคชที่เธรดใช้งานพร้อมกัน บทความอธิบาย Argon2id อธิบายเหตุผล
หากเธรดเรียงตามลำดับ CPU ของระบบปฏิบัติการอย่างเดียว จะไปลงคอร์แรกๆ ในรายการ ซึ่งอยู่บนโหนดเดียวกันและกลุ่มแคชเพียงไม่กี่กลุ่ม บนเครื่อง EPYC สองโหนด แปดเธรดตามลำดับ OS ลงบนโหนด 0 ทั้งหมด และหน่วยความจำเกือบครบ 16 GiB อยู่บนโหนดนั้น การจัดวางอัตโนมัติของ seine วางสี่เธรดต่อโหนดและหน่วยความจำประมาณ 8 GiB ต่อโหนด จึงใช้หน่วยความจำของทั้งสองโหนดพร้อมกัน บน EPYC 8434P โหนดเดียวที่มีแปดกลุ่ม L3 นั้น 24 เธรดตามลำดับ OS อัดลงสี่กลุ่ม กลุ่มละหกเธรด ส่วน seine ใช้ครบแปดกลุ่ม กลุ่มละสามเธรด
การจัดวางเคารพขีดจำกัดที่คุณให้โปรเซส โดยทำตาม CPU mask และ memory mask ของโปรเซส จึงทำงานภายใน taskset, cgroups และคอนเทนเนอร์ และใช้เฉพาะคอร์ที่คุณอนุญาต บน Windows โดยตรง ค่า auto เดียวกันจะใช้คอร์จริงก่อนเธรด SMT ร่วมคอร์
การจัดวางตาม NUMA เร็วขึ้นเท่าไร?
ผู้พัฒนา seine วัดเมื่อ 24 ตุลาคม 2026 โดยรันไบนารีเดียวกันสองแบบสลับเป็นคู่ ได้แก่การจัดวางอัตโนมัติของ seine และการผูกคอร์ตามลำดับ OS ธรรมดา (--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 เฉพาะบล็อกหน่วยความจำ การจัดวางช่วยให้เธรดที่หน่วยความจำรองรับกระจายทั่วทุกโหนด NUMA และกลุ่มแคช
การจัดวางและ 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 ปล่อยการจัดวางให้ตัวจัดตารางงานทั้งหมด
ส่วนเผื่อหน่วยความจำบนเซิร์ฟเวอร์ที่ใช้ร่วมกัน
การกำหนดจำนวนเธรดอัตโนมัติเผื่อ RAM รวมไว้ 5% นอกเหนือจากส่วนที่จองให้ GPU เปลี่ยนได้ด้วย --cpu-memory-reserve-percent หากบริการอื่นเริ่มใช้หน่วยความจำ เธรดอัตโนมัติของ seine จะคืนบล็อกหน่วยความจำและกลับมาเมื่อมีที่ว่าง การขุดจึงอยู่ร่วมกับงานอื่นของเครื่อง ผลปรับจูนถูกแคชแยกตามเครื่อง และแคชรีเซ็ตเมื่อชุด CPU ที่อนุญาตหรือโครงสร้าง NUMA และ L3 เปลี่ยน เช่นหลังปรับขนาด VM
รัน seine แบบ headless อย่างไร?
ส่งที่อยู่รับเงินและพูลผ่านบรรทัดคำสั่ง เช่น --address พร้อมที่อยู่หรือ @name และ --pool-url stratum+tcp://bntpool.com:3333 จากนั้น seine เริ่มโดยไม่ถามข้อมูล บันทึกการตั้งค่าในไดเรกทอรีข้อมูล และแสดงบันทึกข้อความธรรมดาเมื่อไม่มีเทอร์มินัลเชื่อมต่อ ตัวจัดการบริการจึงรันได้
บนเดสก์ท็อป seine ถามที่อยู่และพูลในการรันครั้งแรก บนเซิร์ฟเวอร์ที่ไม่มีเทอร์มินัลเชื่อมต่อ ให้ระบุทั้งคู่ล่วงหน้า:
./seine --address '@yourname' \
--pool-url stratum+tcp://bntpool.com:3333 \
--pool-worker rack1-node04 \
--data-dir /var/lib/seine
ชื่อริก (rack1-node04 ในตัวอย่าง) คือชื่อที่เครื่องนี้แสดงบนพูล seine บันทึกที่อยู่ พูล และชื่อริกลง seine.config.json ในไดเรกทอรีข้อมูล (ค่าเริ่มต้น ./seine-data) การเริ่มครั้งต่อไปด้วยไดเรกทอรีเดิมจึงไม่ต้องมีแฟล็กอื่น ด้วยค่าเริ่มต้น --ui auto โปรแกรมแสดงแดชบอร์ด ในเทอร์มินัลและบันทึกข้อความธรรมดาที่อื่น ส่วน --ui plain บังคับผลลัพธ์เป็นข้อความธรรมดา ใส่เครื่องหมายอัญประกาศรอบ @name และ $name ในคำสั่งเชลล์
บน 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 แปลงชื่อสั้นเป็นที่อยู่ตอนเริ่มทำงาน ยูนิตจึงรอเครือข่าย แต่ละริกปรับจูนตัวเองระหว่างขุดและเก็บค่าที่เลือกในไดเรกทอรีข้อมูลของตัวเองสำหรับครั้งถัดไป
ควบคุม 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 และพักโปรแกรมขุดจนตัวควบคุมส่ง POST /v1/miner/start ซึ่งส่งที่อยู่ พูล จำนวนเธรด และการตั้งค่าอื่นสำหรับการรันนั้นมาได้ ตัวควบคุมของคุณกำหนดว่าแต่ละเครื่องขุดเมื่อไรและด้วยการตั้งค่าใด
โทเค็น API
ตั้งแต่ seine v0.2.23 ทุก endpoint ยกเว้น GET /v1/health ต้องใช้ Authorization: Bearer <token> seine เขียนโทเค็นสุ่มใหม่ลง 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 ความคืบหน้าและผลปรับจูนอัตโนมัติ คำตอบที่พบ และผลการส่งทันทีที่เกิดขึ้น แดชบอร์ดจึงแสดงทุกริกแบบสดได้ หลังเชื่อมต่อใหม่ 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 โดยเริ่ม 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']
รายการ endpoint สคีมาคำขอ และรายการอีเวนต์ทั้งหมดอยู่ในเอกสาร API ควบคุม ของ seine
เลือกเครื่องสำหรับริก
การจัดวาง การรันแบบ headless และ API ทำงานเหมือนกันทั้งเครื่องทาวเวอร์เดียวและแร็กเซิร์ฟเวอร์ หากต้องการทราบว่าโปรเซสเซอร์ใดขุดเร็วที่สุดและควรมี RAM เท่าไรต่อเธรด ดูคู่มือฮาร์ดแวร์ขุด Blocknet หากเพิ่งใช้ seine ให้เริ่มที่วิธีขุด Blocknet
คำถามที่พบบ่อย
seine รองรับเซิร์ฟเวอร์ NUMA หรือไม่?
รองรับ บน Linux การจัด affinity อัตโนมัติที่เป็นค่าเริ่มต้นของ seine กระจายเธรดขุดตามโหนด NUMA และกลุ่มแคช L3 ใช้หนึ่งเธรดต่อคอร์จริงก่อนเธรด SMT ร่วมคอร์ แต่ละเธรดผูกกับคอร์ก่อนจัดสรรหน่วยความจำ 2 GiB เพื่อให้หน่วยความจำอยู่ใกล้เธรด บนเครื่อง EPYC สองโหนด วิธีนี้เพิ่มแฮชเรต 73 เปอร์เซ็นต์ที่แปดเธรด
seine ทำงานเป็นบริการเบื้องหลังโดยไม่มีเทอร์มินัลได้หรือไม่?
ได้ ส่ง --address และ --pool-url ในการรันครั้งแรก แล้ว seine จะเริ่มโดยไม่ถามข้อมูล บันทึกทั้งคู่ใน seine.config.json ในไดเรกทอรีข้อมูล และเปลี่ยนเป็นบันทึกข้อความธรรมดาเมื่อไม่มีเทอร์มินัลเชื่อมต่อ จึงรันภายใต้ systemd หรือตัวจัดการบริการอื่นที่เริ่มโปรแกรมใหม่ให้อัตโนมัติได้ง่าย
seine ส่งออกเมตริก Prometheus หรือไม่?
ส่งออก เริ่ม seine ด้วย --api-server หรือ --service แล้วโปรแกรมให้เมตริก Prometheus ที่ /metrics ผ่าน API ควบคุมภายในเครื่อง ซึ่งฟังที่ 127.0.0.1 พอร์ต 9977 โดยค่าเริ่มต้น เมตริกครอบคลุมสถานะการทำงานของโปรแกรมขุด วงจรชีวิต คำตอบที่ส่งแล้ว ได้รับการยอมรับ และล้าสมัย รวมถึงการกักกัน backend การดึงเมตริกต้องส่ง bearer token ของ API
ทำไม API ควบคุมของ seine จึงขอโทเค็น?
ตั้งแต่ seine v0.2.23 ทุก endpoint ของ API ควบคุมยกเว้นตรวจสุขภาพต้องใช้ bearer token เพื่อป้องกันเว็บไซต์ที่คุณเข้าชมเปลี่ยนที่อยู่รับเงินหรือการตั้งค่า seine เขียนโทเค็นใหม่ลง control-api.cookie ในไดเรกทอรีข้อมูลทุกครั้งที่เริ่ม หรือคุณกำหนดค่าคงที่ด้วย --api-token ได้