الصفحات الكبيرة (huge pages) لتعدين Blocknet بسرعة أعلى

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

يتيح حجز الصفحات الكبيرة (huge pages) لبرنامج seine أن يضع ذاكرة كل خيط تعدين على عدد قليل من الصفحات الكبيرة بدلًا من مئات الآلاف من الصفحات الصغيرة. يشرح هذا الدليل لماذا يسرّع ذلك خوارزمية إثبات العمل Argon2id في Blocknet، وكم صفحة تحجز، والأوامر الدقيقة لأنظمة Linux وWSL2 وWindows.

لماذا تسرّع الصفحات الكبيرة تعدين Blocknet؟

إجابة مختصرة

يحسب كل خيط في seine التجزئة داخل ساحة Argon2id بحجم 2 GiB، ويقرأ الكتل من مواضع غير متوقعة فيها. مع الصفحات العادية بحجم 4 KiB، تمتد هذه الساحة على 524,288 صفحة، أي ترجمات عناوين أكثر بكثير مما يستطيع TLB في المعالج تخزينه مؤقتًا. أما الصفحات الكبيرة فتغطيها بـ 1,024 صفحة أو بصفحتين فقط، فتتوقف قراءات أقل بانتظار المرور على جداول الصفحات.

يبدأ كل وصول إلى الذاكرة بعنوان افتراضي يجب على المعالج ترجمته إلى عنوان فعلي. تُحفظ الترجمات الحديثة في مخزن الترجمة الجانبي (TLB)، الذي تصفه وثائق نواة Linux بأنه “ذاكرة مؤقتة لترجمات العناوين الافتراضية إلى الفعلية” و“مورد نادر جدًا في المعالج”. وعندما لا يكون العنوان في TLB، يمر المعالج على جداول الصفحات في الذاكرة قبل أن يتمكن حتى من البدء بجلب البيانات.

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

حجم الصفحة عدد الصفحات لكل ساحة 2 GiB
4 KiB (عادية) 524,288
2 MiB 1,024
1 GiB 2

مع الصفحات الكبيرة، يغطي إدخال واحد في TLB ذاكرة أكبر بـ 512 أو 262,144 مرة، فيبقى جزء أكبر بكثير من الساحة في متناول TLB، ويذهب مزيد من وقت كل خيط إلى حساب التجزئة.

كم يصبح التعدين أسرع مع الصفحات الكبيرة؟

يصف دليل الصفحات الكبيرة في seine هذه الصفحات بأنها أكبر عامل ضبط منفرد لتعدين CPU على Linux. على جهاز التحقق، أضافت صفحات 2 MiB المحجوزة نحو 4–6%، وأضافت صفحات 1 GiB نحو 2% أخرى. ويشير الدليل أيضًا إلى أنه عند تشغيل خيوط كثيرة، تصبح تغطية الصفحات الكبيرة عادةً أهم من الضبط حسب مجموعة التعليمات.

قيست نتائج الخوادم في مخطط الأداء الخاص بـ seine باستخدام صفحات كبيرة صريحة بحجم 2 MiB. فمعدل 49.4 H/s من معالج AMD EPYC Zen 5 (EPYC 9R45) مع 32 خيطًا، الذي قيس في أكتوبر 2026، عمل مع حجز 34,407 صفحة، وهو الرقم نفسه في صف الـ 32 خيطًا في الجدول أدناه. ويعرض دليل عتاد التعدين النتائج الكاملة حسب الجيل.

وحتى دون حجز، يطلب seine من النواة الصفحات الكبيرة الشفافة على Linux. أما المجموعة المحجوزة فتذهب أبعد، لأن الصفحات تُخصص مسبقًا، فيحصل عليها كل خيط مهما كانت درجة تجزؤ الذاكرة.

كم صفحة كبيرة يحتاج seine؟

إجابة مختصرة

يحتاج كل خيط في seine إلى 1,024 صفحة كبيرة بحجم 2 MiB لاستيعاب ساحته البالغة 2 GiB، أو إلى صفحتين بحجم 1 GiB. مع صفحات 2 MiB، احجز عدد الخيوط × 1,024 × 1.05 وقرّب إلى الأعلى، فيبقى هامش بنسبة 5%. ثمانية خيوط تحتاج إلى 8,602 صفحة، أي نحو 16.8 GiB. ويطبع seine الرقم الدقيق عند التشغيل إذا كان الحجز غير كافٍ.

عدد الخيوط هو رقم Threads في لوحة تحكم seine. يختاره seine حسب ذاكرة RAM وعدد الأنوية، لذا شغّل seine مرة دون صفحات كبيرة ودوّن هذا الرقم. وإذا كان الحجز أصغر من اللازم، يطبع سجل تشغيل seine سطر hugepages | يتضمن عدد الصفحات المطلوبة وأمر sysctl لحجزها.

الخيوط صفحات 2 MiB (مع هامش 5%) الذاكرة المحجوزة صفحات 1 GiB
4 4,301 8.4 GiB 8
8 8,602 16.8 GiB 16
16 17,204 33.6 GiB 32
24 25,805 50.4 GiB 48
32 34,407 67.2 GiB 64

تُخصَّص الصفحات المحجوزة للبرامج التي تطلب صفحات كبيرة، لذا حدّد حجم الحجز حسب عدد الخيوط الذي تعدّن به فعلًا. ويحتسب seine المجموعة المحجوزة ضمن الذاكرة المتاحة عند تحديد عدد الخيوط، فيبقى عدد خيوطك كما كان بعد الحجز.

كيف تُعِدّ صفحات كبيرة بحجم 2 MiB على Linux؟

احجز الصفحات حسب عدد خيوطك. هذا المثال لأربعة خيوط:

sudo sysctl -w vm.nr_hugepages=4301

تحقق من أن النواة وجدتها كلها:

grep -E 'HugePages_Total|HugePages_Free|Hugepagesize' /proc/meminfo

إذا جاءت قيمة HugePages_Total أقل مما طلبت، فالذاكرة مجزأة. أفرغ الذاكرة المؤقتة واضغط الذاكرة ثم حاول مجددًا:

echo 3 | sudo tee /proc/sys/vm/drop_caches
echo 1 | sudo tee /proc/sys/vm/compact_memory
sudo sysctl -w vm.nr_hugepages=4301

اجعل الحجز دائمًا:

echo 'vm.nr_hugepages=4301' | sudo tee /etc/sysctl.d/99-seine-hugepages.conf
sudo sysctl --system

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

كيف تضيف صفحات 1 GiB؟

تتطلب صفحات 1 GiB إعدادًا أكثر قليلًا، وتضيف نحو 2% فوق صفحات 2 MiB. كل ساحة بحجم 2 GiB تحتاج إلى صفحتين منها بالضبط، فلا حاجة إلى حساب هامش. وهي تعمل على Linux وWSL بمعمارية x86_64.

احجزها عند الإقلاع عبر معاملات النواة، وهي أكثر طريقة موثوقة للحصول على صفحات بهذا الحجم. لتسعة خيوط:

hugepagesz=1G hugepages=18

على جهاز أُقلع للتو، يمكنك أيضًا تجربة الحجز أثناء التشغيل، ثم التحقق من عدد الصفحات الحرة:

echo 18 | sudo tee /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages

تغطي أسطر HugePages_* في /proc/meminfo الحجم الافتراضي 2 MiB فقط، لذا اقرأ مجموعة صفحات 1 GiB من /sys. ثم شغّل seine بوضع 1 GiB:

./seine --cpu-page-mode large-1g

في هذا الوضع يضع كل خيط ساحته على مجموعة صفحات 1 GiB، فتعرف أن التشغيل كله استخدم صفحات 1 GiB.

كيف تحجز الصفحات الكبيرة على WSL2؟

يشغّل WSL2 نواة Linux حقيقية، لذا تعمل أوامر Linux السابقة داخله. لصفحات 1 GiB، مرّر معاملات الإقلاع عبر %UserProfile%\.wslconfig من جهة Windows. ويحتاج الجهاز الافتراضي أيضًا إلى ذاكرة كافية للحجز إضافة إلى خدمات Windows وWSL. استخدم جهاز seine الذي جرى التحقق عليه بذاكرة 64 GiB هذا الإعداد:

[wsl2]
memory=48GB
processors=32
swap=8GB
kernelCommandLine = hugepagesz=1G hugepages=18

احفظ الملف، وشغّل wsl --shutdown من Windows، ثم افتح توزيعتك من جديد. تأكد من أن عدد الصفحات الحرة يغطي كل الخيوط قبل أن تبدأ التعدين.

كيف تفعّل large pages على Windows؟

التعدين المباشر على Windows أسرع عادةً من WSL على العتاد نفسه، ويستخدم seine هناك large pages الخاصة بـ Windows. ويحتاج ذلك إلى صلاحية واحدة، Lock pages in memory:

  1. افتح secpol.msc، ثم Local Policies ← User Rights Assignment.
  2. أضف مستخدمك إلى Lock pages in memory.
  3. سجّل الخروج وأعد تسجيل الدخول، لأن الصلاحية تسري على الجلسات الجديدة.

يأتي secpol.msc مع إصدارات Windows Pro وEnterprise وEducation. في إصدارات Home، امنح الصلاحية نفسها بأداة مثل ntrights.

هذا كل الإعداد. عند التشغيل يفعّل seine الصلاحية لنفسه ويخصص ساحة كل خيط بحجم 2 GiB باستخدام VirtualAlloc وMEM_LARGE_PAGES، وهي الطريقة التي توثّقها Microsoft لذاكرة large pages. وإذا لم تكن large pages متاحة، يعدّن seine على الصفحات العادية ويسجّل السبب مع طريقة الإصلاح الدقيقة. ولا يغيّر seine صلاحيات الحساب ولا يسجّل خروجك بنفسه أبدًا.

أي وضع صفحات تستخدم؟

يناسب الوضع الافتراضي الجميع تقريبًا. أما الأوضاع الأخرى فهي لصفحات 1 GiB وللقياس:

الوضع ما يفعله
--cpu-page-mode auto (افتراضي) يستخدم الصفحات الكبيرة المحجوزة أو large pages على Windows، ثم الصفحات الكبيرة الشفافة، ثم الصفحات العادية
--cpu-page-mode large يشترط صفحات كبيرة محجوزة أو large pages على Windows لكل خيط، ويتوقف عند التشغيل إذا لم تتوفر
--cpu-page-mode large-1g يشترط صفحات 1 GiB لكل خيط (Linux وWSL بمعمارية x86_64)
--cpu-page-mode regular صفحات عادية فقط، لقياس الأداء قبل وبعد

لقياس المكسب على جهازك، عدّن فترة مع --cpu-page-mode regular، ثم مع auto أو large-1g، وقارن معدل التجزئة في لوحة التحكم. وفي الخوادم التي تضم عدة عقد NUMA، يجب أيضًا أن تكون الصفحات المحجوزة على العقد التي تشغّل خيوطك؛ ويتناول ذلك دليل التعدين على الخوادم.

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

هل أحتاج إلى الصفحات الكبيرة لتعدين Blocknet باستخدام seine؟

لا. يبدأ seine التعدين على الذاكرة العادية فور تشغيله، ويطلب من Linux الصفحات الكبيرة الشفافة (transparent huge pages) بنفسه. حجز الصفحات الكبيرة إضافة اختيارية للحصول على آخر بضعة بالمئة، وقد أضاف نحو 4 إلى 6% مع صفحات 2 MiB على جهاز التحقق، ونحو 2% إضافية مع صفحات 1 GiB.

كم صفحة كبيرة يحتاج كل خيط من خيوط seine؟

يحتاج كل خيط إلى 1,024 صفحة بحجم 2 MiB تستوعب ساحة Argon2id الخاصة به بحجم 2 GiB بالضبط، أو إلى صفحتين بحجم 1 GiB. مع صفحات 2 MiB، اضرب عدد الخيوط في 1,024 وأضف هامشًا بنسبة 5% ثم قرّب إلى الأعلى. ثمانية خيوط تحتاج إلى 8,602 صفحة، أي حجز نحو 16.8 GiB من ذاكرة RAM.

هل يستخدم seine صفحات 1 GiB تلقائيًا؟

يستخدم وضع الصفحات الافتراضي في seine مجموعة صفحات 2 MiB المحجوزة أولًا، ثم الصفحات الكبيرة الشفافة. لاستخدام صفحات 1 GiB، احجز صفحتين لكل خيط، ويُفضَّل عند الإقلاع عبر hugepagesz=1G hugepages=N، ثم شغّل seine مع --cpu-page-mode large-1g. يعمل هذا الوضع على Linux وWSL بمعمارية x86_64 ويضيف نحو 2% فوق صفحات 2 MiB.

كيف أفعّل large pages لبرنامج seine على Windows؟

امنح حساب Windows الخاص بك صلاحية Lock pages in memory من secpol.msc ضمن Local Policies ثم User Rights Assignment، ثم سجّل الخروج وأعد تسجيل الدخول. يفعّل seine هذه الصلاحية لنفسه عند التشغيل ويخصص ساحة كل خيط بحجم 2 GiB باستخدام large pages. في إصدارات Home، امنح الصلاحية بأداة مثل ntrights.