Skip to content

NVIDIA Hybrid + การ์ดหลับ (Runtime D3)

ติดตั้งไดรเวอร์ T2000 และทำให้การ์ด “หลับ” เมื่อไม่ใช้ (ประหยัด ~17W)
NVIDIA open kernel module on hybrid graphics with fine-grained RTD3

ใช้ทำอะไร (Purpose)

Hybrid = WAN สองเส้น
  Intel (เส้นเล็ก ประหยัด)   ──► ใช้เป็นหลัก ขับจอในเครื่อง
  NVIDIA (เส้นใหญ่ แรง)      ──► ตื่นเมื่อมีงาน (Ollama, prime-run) แล้วหลับ
  prime-run = policy-based routing ส่ง traffic ที่เลือกไปเส้นใหญ่

ตัวเลขจริงที่พิสูจน์ความสำคัญ: การ์ดตื่นแต่ว่าง = 17W → แบต 94Wh หมดใน ~5–6 ชม. จากการ์ดอย่างเดียว

ขั้นตอน (Setup)

1. ดูฮาร์ดแวร์ก่อนลง

lspci -k | grep -EA3 'VGA|3D'
ผลอ่านว่า
NVIDIA = VGA compatible controller (ไม่ใช่ 3D controller)การ์ดมีช่องต่อจอของตัวเอง → HDMI ต่อตรงเข้า NVIDIA (ไดรเวอร์ไม่ทำงาน = จอนอกไม่มีภาพ)
Kernel driver in use: nouveauudev โหลด nouveau จาก SSD หลังบูต (แม้ลบ kms ใน initramfs แล้ว)

2. ติดตั้ง (ต้องมี headers ก่อน)

sudo pacman -S nvidia-open-dkms nvidia-utils nvidia-prime
dkms status        # installed ทั้ง 2 kernel
sudo reboot
lspci -k | grep -EA3 'VGA|3D'    # Kernel driver in use: nvidia
แพ็กเกจหน้าที่
nvidia-open-dkmsไดรเวอร์ใน kernel, คอมไพล์ให้ทุก kernel อัตโนมัติ
nvidia-utilsOpenGL/Vulkan/CUDA lib, nvidia-smi, blacklist nouveau
nvidia-primeคำสั่ง prime-run

3. ตรวจว่าการ์ดหลับไหม (ห้ามรัน nvidia-smi ก่อน = ปลุกการ์ด)

cat /sys/bus/pci/devices/0000:01:00.0/power/{control,runtime_status}

ผลแรก: on / active → Turing ไม่ได้เปิดให้เอง (ไดรเวอร์เปิดอัตโนมัติเฉพาะ Ampere ขึ้นไป)

4. แก้ 2 จุด (เปิดทั้งสองฝั่ง เหมือน EEE ต้องเปิดทั้ง NIC และ switch)

อ่านค่าจริงจากเครื่องก่อน:

lspci -s 01:00
cat /sys/bus/pci/devices/0000:01:00.{0,1}/class
functionclassความหมาย
01:00.00x030000Display / VGA
01:00.10x040300HD Audio (HDMI)

จุดที่ 1 — ไดรเวอร์:

echo 'options nvidia "NVreg_DynamicPowerManagement=0x02"' | sudo tee /etc/modprobe.d/nvidia-pm.conf

จุดที่ 2 — kernel (udev):

sudo tee /etc/udev/rules.d/80-nvidia-pm.rules <<'EOF'
# P15 Gen 1: NVIDIA เป็น VGA (0x030000) ไม่ใช่ 3D (0x030200) ตามคู่มือทั่วไป
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", TEST=="power/control", ATTR{power/control}="on"
EOF
sudo reboot
  • == เปรียบเทียบ (เงื่อนไข) / = กำหนดค่า (การกระทำ) — อ่านเหมือน ACL
  • <<'EOF' มีเครื่องหมายคำพูด = shell ไม่แทนค่า (ต่างจากตอนเขียน boot entry)
  • ไม่ต้อง mkinitcpio เพราะ nvidia ไม่ได้อยู่ใน initramfs (ถ้าย้ายเข้าไปวันหน้า ต้องสร้างใหม่ทุกครั้งที่แก้ modprobe.d)

ทดสอบว่าใช้ได้ (Verification)

cat /sys/bus/pci/devices/0000:01:00.0/power/{control,runtime_status}; grep -i 'runtime d3' /proc/driver/nvidia/gpus/0000:01:00.0/power

ต้องได้ auto / suspended / Runtime D3 status: Enabled (fine-grained)

ทดสอบครบวงจร: nvidia-smi (ปลุก) → รอ 15–20 วินาที → runtime_status กลับเป็น suspended
ทดสอบตอนมี Xorg (i3): ยัง suspended ✓ ไม่ต้องตั้งค่า Xorg เพิ่ม

แล้วถ่าย snapshot ด้วยมือ (แก้ไฟล์เองนอก pacman)

ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)

เหตุการณ์บทเรียน
ทายว่า NVIDIA เป็น 3D controllerเป็น VGA → ลอก udev rule จากเน็ตที่ใช้ 0x030200 จะไม่ match เงียบๆ อ่านค่าจากเครื่องจริงเสมอ
sudo echo ... > /etc/...ไม่ได้: redirect ทำโดย shell ของ user → ใช้ | sudo tee
หัวตาราง nvidia-smi ต่างจากที่ทายรุ่นใหม่ใช้ KMD Version / CUDA UMD Version
สถานะแรก on/activeTuring ต้องเปิดเอง (Ampere+ เปิดอัตโนมัติ)
Ollama ในรายการเครื่องหลักคือ ollamaรันบน CPU อย่างเดียว ต้องใช้ ollama-cuda

คำถามชวนคิด

  1. ถ้าเสียบจอนอกผ่าน HDMI ค้างไว้ การ์ดจะยังหลับได้ไหม เพราะอะไร (เบาะแส: ใครขับช่องนั้น)
  2. ถ้าในอนาคตเปลี่ยนเครื่องเป็นรุ่นที่ NVIDIA เป็น “3D controller” ไฟล์ udev ต้องแก้ตรงไหนบ้าง และคุณจะตรวจอย่างไรก่อนแก้
  3. ทำไมการวัด runtime_status ต้องทำ ก่อน รัน nvidia-smi — หลักนี้ใช้กับการเก็บหลักฐานดิจิทัลอย่างไร