1 điểm bởi GN⁺ 2025-02-18 | 1 bình luận | Chia sẻ qua WhatsApp
  • Sự cố phát sinh: Trên máy desktop dual-boot Windows và Linux, khi dùng nhiều RAM trong Linux rồi chuyển sang chế độ ngủ, hệ thống bị treo. Khi đánh thức máy, màn hình đen xuất hiện hoặc hệ thống rơi vào trạng thái không phản hồi. Vấn đề này bắt nguồn từ lỗi quản lý nguồn/bộ nhớ của driver amdgpu.

  • Chẩn đoán vấn đề: Hệ thống chạy Arch Linux với bo mạch chủ Gigabyte B550M DS3H và GPU AMD RX 570. Sau khi hệ thống bị treo, tác giả kiểm tra log bằng journalctl và phát hiện lỗi hết bộ nhớ (OOM) xảy ra trong amdgpu_device_suspend. Driver NVMe không khởi tạo lại được khi hệ thống resume, khiến máy bị treo và không ghi được log.

  • Các lần thử khắc phục: Tác giả thay đổi thiết lập systemd để thử nhiều chế độ ngủ khác nhau và tắt chế độ ngủ bất đồng bộ nhằm đơn giản hóa vấn đề, nhưng không xử lý được nguyên nhân gốc. Sau đó xác nhận xung đột xảy ra trong quá trình amdgpu loại bỏ bộ đệm TTM.

  • Nguyên nhân: Khi hệ thống vào chế độ ngủ S3, nguồn của GPU PCIe bị ngắt nên dữ liệu trong VRAM bị mất. Để tránh điều này, driver GPU phải sao lưu VRAM sang RAM hệ thống, nhưng driver amdgpu trên Linux có thể làm hệ thống treo do hết bộ nhớ nếu không đủ RAM trống.

  • Giải pháp: Mario Limonciello đã viết một bản vá kernel để sao lưu VRAM trước khi bộ nhớ lưu trữ dựa trên đĩa bị dừng. Bản vá này chuyển việc sao lưu VRAM từ giai đoạn dpm_suspend() sang dpm_prepare(), để có thể hủy quá trình sleep nếu xảy ra thiếu bộ nhớ.

  • Xử lý thêm các vấn đề phát sinh: Tác giả viết một script để cho phép sao lưu VRAM từ user space, chuyển VRAM sang RAM hệ thống trước khi máy sleep. Tuy nhiên, khi nhiều ứng dụng 3D đang chạy, VRAM vẫn có thể tiếp tục bị chuyển sang GPU và gây treo.

  • Cách khắc phục cuối cùng: Tác giả thay đổi để dùng API thông báo quản lý nguồn, sao lưu VRAM ở giai đoạn PM_SUSPEND_PREPARE. Nhờ đó, VRAM có thể được chuyển sang RAM hệ thống trước khi swap bị vô hiệu hóa, qua đó giải quyết vấn đề.

  • Kết luận: Vấn đề này đã được giải quyết nhờ nỗ lực của nhiều người và nhiều lần thử nghiệm khác nhau, và dự kiến sẽ được đưa vào Linux kernel 6.14.

1 bình luận

 
GN⁺ 2025-02-18
Ý kiến Hacker News
  • Có ý kiến nghi ngờ giả định rằng khi máy bàn vào chế độ ngủ S3 thì hệ thống sẽ cắt nguồn GPU PCIe

    • Về lý thuyết, S3 phải cắt nguồn mọi thứ ngoại trừ RAM, nhưng bo mạch chủ Gigabyte Aorus gặp lỗi ngủ của SSD NVMe nên không thể ngủ hoặc thức dậy đúng cách
    • Để khắc phục, cần thêm quy tắc udev
    • Cũng có cách ngăn việc đánh thức từ một số cổng PCIe nhất định
    • Có phương pháp tìm thiết bị đánh thức PCIe gây lỗi
    • Có thể dùng lệnh udevadm để lấy thông tin thiết bị
    • Cũng có thể dùng shell script để xử lý vấn đề
  • Tác giả của memreserver chia sẻ trải nghiệm từng gỡ lỗi để xử lý sự cố ngủ trên Linux

    • Chỉ ra vấn đề là Linux đã không thể chạy hook tạm dừng đáng tin cậy trước khi các hệ thống con đĩa và bộ nhớ bị đóng băng
    • Khó tìm được thông tin liên quan trên Freedesktop Gitlab
  • Có người giải thích vì sao việc triển khai tính năng ngủ trên Linux lại khó và việc gỡ lỗi cũng khó khăn

    • Đang gặp lỗi quạt trên ThinkPad P1G4 không tự tắt
    • Từng gặp vấn đề âm thanh bị vỡ trên tai nghe Bluetooth sau khi máy ngủ
  • Một người dùng ThinkPad dùng Ryzen cho biết đang gặp lỗi ngủ trên Linux và kỳ vọng vào phiên bản 6.14

  • Có ý kiến nói rằng họ đã nhận ra vấn đề "sleep/wake" là một bài toán NP-đầy đủ

  • Có người cho rằng bài viết này sẽ hữu ích với người dùng laptop Framework AMD có GPU mở rộng và chạy dual-boot Linux/Windows

    • Đồng thời bày tỏ muốn quyên góp
  • Một người dùng đang cố khắc phục lỗi PC gần như bị treo sau khi ngủ trên GPU AMD

    • Vấn đề xuất hiện sau khi đổi từ RX 5700 XT sang RX 7900 XTX
    • Hy vọng phiên bản 6.14 có thể giải quyết được sự cố
  • Có ý kiến chia sẻ rằng từ trước đến nay họ luôn gặp vấn đề với tính năng ngủ khi dùng Linux

    • Dù dùng phần cứng Intel, AMD, ATI hay NVIDIA thì sleep hoặc hibernate nhiều khi vẫn không hoạt động đúng
  • Có người chia sẻ kinh nghiệm từng gỡ lỗi vấn đề ngủ trên phần cứng IoT

    • Trên Linux, hibernate toàn hệ thống đáng tin cậy hơn sleep
    • Nếu SSD đủ nhanh thì nên dùng hibernate toàn hệ thống
  • Có ý kiến giải thích rằng quản lý bộ nhớ và điều kiện OOM vẫn là những vấn đề khó trên Linux

    • Việc thêm RAM để xử lý vấn đề OOM là không hiệu quả
    • Tính năng debug shell của systemd được cho là hữu ích
    • Có các bài nói chuyện hữu ích về các hệ thống con của kernel Linux được cung cấp trực tuyến