ขุด Blocknet เร็วขึ้นด้วย huge pages

· อ่าน 6 นาที

การจอง huge pages ช่วยให้ seine รองรับหน่วยความจำของแต่ละเธรดขุดด้วยหน้าขนาดใหญ่เพียงไม่กี่หน้า แทนหน้าขนาดเล็กหลายแสนหน้า คู่มือนี้อธิบายว่าทำไมจึงทำให้ Proof of Work แบบ Argon2id ของ Blocknet เร็วขึ้น ต้องจองกี่หน้า และใช้คำสั่งอะไรบน Linux, WSL2 และ Windows

ทำไม huge pages จึงทำให้ขุด Blocknet เร็วขึ้น?

คำตอบสั้นๆ

แต่ละเธรดของ seine คำนวณแฮชในบล็อกหน่วยความจำ Argon2id 2 GiB และอ่านข้อมูลจากตำแหน่งที่คาดเดาไม่ได้ หากใช้หน้าปกติ 4 KiB จะครอบคลุมถึง 524,288 หน้า ซึ่งมีรายการแปลงที่อยู่มากเกินกว่า TLB ของ CPU จะเก็บได้ huge pages ครอบคลุมหน่วยความจำนี้ด้วย 1,024 หน้า หรือเพียง 2 หน้า จึงมีการอ่านน้อยลงที่ต้องรอไล่ตารางหน้า

การเข้าถึงหน่วยความจำทุกครั้งเริ่มจากที่อยู่เสมือนที่ CPU ต้องแปลงเป็นที่อยู่จริง รายการแปลงล่าสุดอยู่ใน translation lookaside buffer (TLB) ซึ่งเอกสารเคอร์เนล Linux อธิบายว่าเป็น “แคชของการแปลงที่อยู่เสมือนเป็นที่อยู่จริง” และเป็น “ทรัพยากรที่มีจำกัดมากในโปรเซสเซอร์” เมื่อที่อยู่ไม่อยู่ใน TLB นั้น CPU ต้องไล่ตารางหน้าในหน่วยความจำก่อนที่จะเริ่มดึงข้อมูลได้

Proof of Work ของ Blocknet ทำให้ต้องไล่ตารางบ่อย แต่ละแฮชเติมหน่วยความจำ 2 GiB ด้วยบล็อกขนาด 1 KiB และในครึ่งหลังของรอบ แต่ละบล็อกใหม่อ่านบล็อกก่อนหน้าซึ่งตำแหน่งขึ้นอยู่กับข้อมูลที่เพิ่งคำนวณ ดังที่บทความอธิบาย Argon2id แสดงไว้ นั่นรวมเป็นการอ่านแบบกระจายประมาณ 2 GiB ต่อแฮช ขนาดหน้ากำหนดว่าการอ่านเหล่านี้ต้องใช้รายการแปลงกี่รายการ:

ขนาดหน้า จำนวนหน้าต่อหน่วยความจำ 2 GiB
4 KiB (ปกติ) 524,288
2 MiB 1,024
1 GiB 2

เมื่อใช้ huge pages รายการ TLB หนึ่งรายการครอบคลุมหน่วยความจำมากขึ้น 512 หรือ 262,144 เท่า หน่วยความจำส่วนใหญ่จึงอยู่ในขอบเขตที่ TLB เข้าถึงได้ และแต่ละเธรดใช้เวลากับการคำนวณแฮชมากขึ้น

ขุดด้วย huge pages เร็วขึ้นเท่าไร?

คู่มือ huge pages ของ seine ระบุว่าเป็นตัวปรับจูนที่ให้ผลมากที่สุดสำหรับการขุดด้วย CPU บน Linux บนเครื่องทดสอบ หน้า 2 MiB ที่จองไว้เพิ่มความเร็วประมาณ 4–6% และหน้า 1 GiB เพิ่มได้อีกประมาณ 2% คู่มือยังระบุว่าเมื่อใช้หลายเธรด การครอบคลุมของ huge pages มักสำคัญกว่าการปรับชุดคำสั่ง

ผลของเซิร์ฟเวอร์ในตารางประสิทธิภาพ ของ seine วัดด้วย huge pages ขนาด 2 MiB ที่จองไว้อย่างชัดเจน ผล 49.4 H/s จาก AMD EPYC Zen 5 (EPYC 9R45) ที่ 32 เธรด วัดในเดือนตุลาคม 2026 โดยจองไว้ 34,407 หน้า ตรงกับแถว 32 เธรดในตารางด้านล่าง คู่มือฮาร์ดแวร์ขุด มีผลครบแยกตามรุ่น

แม้ไม่จองไว้ seine ก็ร้องขอ transparent huge pages จากเคอร์เนลบน Linux พูลที่จองไว้ช่วยเพิ่มความแน่นอน เพราะกันหน้าไว้ล่วงหน้า ทุกเธรดจึงได้รับหน้าเหล่านี้ไม่ว่าหน่วยความจำจะกระจัดกระจายเพียงใด

seine ต้องใช้ huge pages กี่หน้า?

คำตอบสั้นๆ

แต่ละเธรดของ seine ต้องใช้ huge pages ขนาด 2 MiB จำนวน 1,024 หน้าเพื่อรองรับหน่วยความจำ 2 GiB หรือหน้า 1 GiB สองหน้า สำหรับหน้า 2 MiB ให้จองจำนวนเธรด × 1,024 × 1.05 แล้วปัดขึ้นเพื่อเผื่อ 5% แปดเธรดต้องใช้ 8,602 หน้า หรือประมาณ 16.8 GiB เมื่อจองไม่พอ seine จะแสดงจำนวนที่ต้องการตอนเริ่มทำงาน

จำนวนเธรดคือค่า Threads บนแดชบอร์ดของ seine โปรแกรมเลือกจาก RAM และจำนวนคอร์ ดังนั้นให้เปิด seine โดยยังไม่ใช้ huge pages หนึ่งครั้งแล้วจดไว้ หากจองน้อยเกินไป บันทึกตอนเริ่มทำงานจะแสดงบรรทัด 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

หน้าที่จองไว้ถูกกันสำหรับโปรแกรมที่ร้องขอ huge pages จึงควรจองให้ตรงกับจำนวนเธรดที่ใช้ขุดจริง seine นับพูลที่จองไว้เป็นหน่วยความจำที่ใช้ได้ตอนกำหนดจำนวนเธรด การจองจึงไม่ทำให้จำนวนเธรดลดลง

ตั้งค่า huge pages ขนาด 2 MiB บน Linux อย่างไร?

จองหน้าตามจำนวนเธรดของคุณ ตัวอย่างนี้สำหรับ 4 เธรด:

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 x86_64 และ WSL

จองตอนบูตด้วยพารามิเตอร์เคอร์เนล ซึ่งเป็นวิธีที่แน่นอนที่สุดสำหรับหน้าขนาดใหญ่นี้ สำหรับ 9 เธรด:

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

จอง huge pages บน WSL2 อย่างไร?

WSL2 ใช้เคอร์เนล Linux จริง จึงใช้คำสั่ง Linux ด้านบนภายใน WSL2 ได้ สำหรับหน้า 1 GiB ให้ส่งพารามิเตอร์บูตผ่าน %UserProfile%\.wslconfig ฝั่ง Windows เครื่องเสมือนต้องมีหน่วยความจำพอสำหรับการจอง รวมถึง Windows และบริการ WSL เครื่องทดสอบ 64 GiB ของ seine ใช้ค่านี้:

[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 (ค่าเริ่มต้น) ใช้ huge pages ที่จองไว้หรือ large pages ของ Windows แล้วจึงใช้ transparent huge pages และหน้าปกติตามลำดับ
--cpu-page-mode large ต้องมี huge pages ที่จองไว้หรือ large pages ของ Windows สำหรับทุกเธรด และหยุดตอนเริ่มทำงานหากไม่มี
--cpu-page-mode large-1g ต้องมีหน้า 1 GiB สำหรับทุกเธรด (Linux x86_64 และ WSL)
--cpu-page-mode regular ใช้หน้าปกติเท่านั้น สำหรับ benchmark เปรียบเทียบก่อนและหลัง

หากต้องการวัดผลบนเครื่องของคุณ ให้ขุดสักพักด้วย --cpu-page-mode regular แล้วเปลี่ยนเป็น auto หรือ large-1g และเปรียบเทียบแฮชเรตบนแดชบอร์ด สำหรับเซิร์ฟเวอร์ที่มีหลายโหนด NUMA หน้าที่จองไว้ต้องอยู่บนโหนดที่รันเธรดด้วย คู่มือขุดบนเซิร์ฟเวอร์ อธิบายเรื่องนี้

คำถามที่พบบ่อย

ต้องใช้ huge pages เพื่อขุด Blocknet ด้วย seine หรือไม่?

ไม่จำเป็น seine ขุดด้วยหน่วยความจำปกติได้ทันทีที่เริ่มทำงาน และร้องขอ transparent huge pages จาก Linux เอง การจอง huge pages เป็นตัวเลือกเสริมเพื่อเพิ่มความเร็วอีกไม่กี่เปอร์เซ็นต์ โดยหน้า 2 MiB เพิ่มได้ประมาณ 4 ถึง 6% บนเครื่องทดสอบ และหน้า 1 GiB เพิ่มได้อีกประมาณ 2%

แต่ละเธรดของ seine ต้องใช้ huge pages กี่หน้า?

แต่ละเธรดต้องใช้หน้า 2 MiB จำนวน 1,024 หน้า ซึ่งบรรจุหน่วยความจำ Argon2id 2 GiB ได้พอดี หรือหน้า 1 GiB สองหน้า สำหรับหน้า 2 MiB ให้คูณจำนวนเธรดด้วย 1,024 บวกส่วนเผื่อ 5% แล้วปัดขึ้น แปดเธรดต้องใช้ 8,602 หน้า จอง RAM ประมาณ 16.8 GiB

seine ใช้ huge pages ขนาด 1 GiB โดยอัตโนมัติหรือไม่?

โหมดหน้าหน่วยความจำเริ่มต้นของ seine ใช้พูลหน้า 2 MiB ที่จองไว้ แล้วจึงใช้ transparent huge pages หากต้องการหน้า 1 GiB ให้จองสองหน้าต่อเธรด โดยควรจองตอนบูตด้วย hugepagesz=1G hugepages=N และเริ่ม seine ด้วย --cpu-page-mode large-1g โหมดนี้ใช้ได้บน Linux x86_64 และ WSL และเพิ่มความเร็วประมาณ 2% จากหน้า 2 MiB

เปิด large pages ให้ seine บน Windows อย่างไร?

ให้สิทธิ์ Lock pages in memory แก่บัญชี Windows ของคุณใน secpol.msc ที่ Local Policies และ User Rights Assignment แล้วออกจากระบบและเข้าสู่ระบบอีกครั้ง seine เปิดใช้สิทธิ์นี้เองตอนเริ่มทำงานและจัดสรรหน่วยความจำ 2 GiB ของแต่ละเธรดด้วย large pages ในรุ่น Home ให้มอบสิทธิ์ด้วยเครื่องมืออย่าง ntrights