تعدين Blocknet على الخوادم وأجهزة التعدين

· مدة القراءة: 5 د

يتناول هذا الدليل تشغيل seine على الأجهزة الكبيرة وعلى رف من أجهزة التعدين: كيف يوزع الخيوط على الخوادم كثيرة الأنوية، وكيف تشغّله دون واجهة تحت مدير خدمات، وكيف تبدأ كل جهاز وتوقفه وتراقبه عبر واجهة API المحلية للتحكم وتدفق الأحداث المباشر ومقاييس Prometheus.

كيف يستفيد seine من خادم كبير؟

إجابة مختصرة

على Linux، يوزع seine خيوط التعدين على عقد NUMA وعلى مجموعات ذاكرة L3 المؤقتة داخل كل عقدة، مستخدمًا خيطًا واحدًا لكل نواة فعلية قبل أي شقيق SMT. ويثبّت كل خيط نفسه على نواته قبل تخصيص ساحته البالغة 2 GiB، فتقع الذاكرة قريبة منه. هذا هو الوضع الافتراضي، فلا شيء تحتاج إلى ضبطه.

إثبات العمل Argon2id في Blocknet هو في معظمه حركة بيانات في الذاكرة. فكل خيط يملأ ساحته الخاصة البالغة 2 GiB ويعيد قراءتها لكل تجزئة، لذا يعتمد معدل التجزئة على عدد وحدات التحكم بالذاكرة ومجموعات الذاكرة المؤقتة التي تُبقيها خيوطك مشغولة في الوقت نفسه. ويشرح شرح Argon2id السبب.

إذا اتبعت الخيوط ببساطة ترتيب المعالجات في نظام التشغيل، فإنها تملأ الأنوية الأولى في القائمة، وكلها تقع على العقدة نفسها وعلى المجموعات القليلة نفسها من الذاكرة المؤقتة. على جهاز EPYC بعقدتين، وقعت ثمانية خيوط بترتيب نظام التشغيل كلها على العقدة 0، مع وجود الساحات البالغة 16 GiB كلها تقريبًا في ذاكرة تلك العقدة. أما التوزيع التلقائي في seine فوضع أربعة خيوط على كل عقدة ونحو 8 GiB من الساحات على كل منها، فاستُخدمت ذاكرة العقدتين معًا. وعلى EPYC 8434P بعقدة واحدة وثماني مجموعات L3، تكدّست 24 خيطًا بترتيب نظام التشغيل بواقع ستة في كل مجموعة ضمن أربع مجموعات، بينما استخدم seine المجموعات الثماني كلها بواقع ثلاثة في كل منها.

يتبع التوزيع الحدود التي تمنحها للعملية. فهو يحترم أقنعة المعالجات والذاكرة الخاصة بالعملية، لذا يعمل داخل taskset وcgroups والحاويات، ولا يستخدم إلا الأنوية التي تسمح بها. وعلى 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 صفحات كبيرة 2 MiB +108%
خادم AMD EPYC (EPYC 8434P، 48 نواة، ثماني مجموعات L3) 24 عادية +16.7%

رجح كل زوج متناوب كفة التوزيع التلقائي، والطريقة الكاملة والنتائج الخام موجودة في دليل الخوادم الكبيرة وسجل تحسين المعالج الخاصين بـ seine.

يظهر المكسب عندما يشغّل seine خيوطًا أقل من عدد أنوية الجهاز. ويحدث ذلك كلما كانت ذاكرة RAM، لا عدد الأنوية، هي التي تحدد عدد الخيوط: يحتاج كل خيط إلى نحو 2 GB، لذا يتطلب ملء خادم بـ 48 نواة نحو 96 GB للساحات وحدها. ويضمن التوزيع أن تنتشر الخيوط التي تستطيع تحمّلها على كل عقد NUMA ومجموعات الذاكرة المؤقتة.

يجتمع أثر التوزيع والصفحات الكبيرة، كما يُظهر الصف الثاني. وإذا حجزت صفحات كبيرة، فاحجزها على كل عقدة تستضيف خيوطًا، لأن كفاية العدد الإجمالي لا تضمن وجود صفحات محلية. ويتناول دليل الصفحات الكبيرة إعداد الصفحات، وعلى Linux تُضبط مجموعة صفحات 2 MiB لكل عقدة في /sys/devices/system/node/node<N>/hugepages/hugepages-2048kB/nr_hugepages.

للتحقق من الأثر على جهازك، قارن auto مع os بعدد الخيوط نفسه وإعداد الصفحات نفسه. أما --cpu-affinity off فيترك التوزيع بالكامل لمجدول النظام.

هامش الذاكرة على الخوادم المشتركة

يُبقي التحديد التلقائي لعدد الخيوط 5% من إجمالي ذاكرة RAM حرة، إضافة إلى أي حجز للبطاقة الرسومية. غيّر ذلك عبر --cpu-memory-reserve-percent. وإذا بدأت خدمات أخرى باستخدام الذاكرة، تحرر خيوط seine التلقائية ساحاتها وتعود بمجرد أن تتحرر الذاكرة، فيتكيف التعدين مع بقية عمل الجهاز. وتُخزَّن نتائج الضبط مؤقتًا لكل جهاز، وتُعاد هذه الذاكرة المؤقتة عند تغيّر مجموعة المعالجات المسموح بها أو تخطيط NUMA وL3، كما بعد تغيير حجم جهاز افتراضي.

كيف تشغّل seine دون واجهة؟

إجابة مختصرة

مرّر عنوان الدفع ومجمع التعدين في سطر الأوامر، مثلًا --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 المميز

منذ الإصدار v0.2.23 من seine، تحتاج كل نقاط النهاية باستثناء 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). يبلّغ عن تغيّرات الحالة، ومراحل الواجهات الخلفية، وتقدم الضبط التلقائي ونتائجه، والحلول التي يُعثر عليها، ونتائج الإرسال لحظة حدوثها، فتستطيع لوحة المراقبة عرض كل جهاز مباشرة. وبعد إعادة الاتصال، يعيد 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_configs:
  - job_name: seine
    authorization:
      type: Bearer
      credentials_file: /etc/prometheus/seine-token
    static_configs:
      - targets: ['127.0.0.1:9977']

القائمة الكاملة لنقاط النهاية ومخططات الطلبات وفهرس الأحداث موجودة في وثائق واجهة API للتحكم الخاصة بـ seine.

اختيار الأجهزة لمنصة التعدين

يعمل التوزيع والتشغيل دون واجهة وواجهة API بالطريقة نفسها على جهاز مكتبي واحد وعلى رف من الخوادم. لمعرفة المعالجات الأسرع في التعدين وكم ذاكرة RAM تركّب لكل خيط، راجع دليل عتاد تعدين Blocknet. جديد على seine؟ ابدأ بـ كيف تعدّن Blocknet.

الأسئلة الشائعة

هل يدعم seine خوادم NUMA؟

نعم. على Linux، يوزع التوزيع التلقائي الافتراضي في 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. تغطي المقاييس ما إذا كان برنامج التعدين يعمل، وحالة دورة حياته، والحلول المرسلة والمقبولة والمتقادمة، وحالات عزل الواجهات الخلفية. وترسل عمليات الجمع رمز API المميز.

لماذا تطلب واجهة API للتحكم في seine رمزًا مميزًا؟

منذ الإصدار v0.2.23 من seine، تحتاج كل نقاط النهاية في واجهة API للتحكم، باستثناء فحص الحالة، إلى رمز Bearer مميز، مما يمنع المواقع التي تزورها من تغيير عنوان الدفع أو الإعدادات. يكتب seine رمزًا جديدًا في control-api.cookie داخل مجلد بياناته عند كل تشغيل، أو يمكنك ضبط رمز ثابت عبر --api-token.