Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Mem Guardian: bảo vệ RAM và CPU trên Linux

Mem Guardian là watchdog tùy biến cho máy Linux phát triển: theo dõi áp lực bộ nhớ, giảm tải ứng dụng khi máy sắp hết RAM và xử lý indexer gây bão CPU. Đây là lớp can thiệp bổ sung; vẫn cần kiểm giới hạn container, số tab, workload và dung lượng RAM của máy.

Trang này giải thích chính sách và vận hành. Mem Guardian không phải gói mặc định của Ubuntu; các lệnh quản lý service dưới đây chỉ dùng khi bạn đã cài daemon và systemd unit được rà soát. Không chạy lệnh đóng ứng dụng trên máy đang có dữ liệu chưa lưu để thử ngưỡng.

1. Đo tín hiệu trước khi can thiệp

free -h
grep -E '^(MemTotal|MemAvailable|SwapTotal|SwapFree):' /proc/meminfo
cat /proc/pressure/memory
cat /proc/pressure/cpu
ps -eo pid,comm,%cpu,%mem --sort=-%mem | head -n 15

MemAvailable ước lượng RAM có thể cấp phát; không chỉ nhìn cột RAM trống. PSI đo phần thời gian tác vụ bị chặn vì thiếu tài nguyên: some là có tác vụ bị chặn, full là mọi tác vụ không nhàn rỗi cùng bị chặn. avg10 là xu hướng trong cửa sổ 10 giây, biểu diễn bằng phần trăm. Nếu không có file pressure, kiểm hỗ trợ PSI của kernel trước khi dùng watchdog phụ thuộc tín hiệu này. Nguồn: Linux PSI.

2. Ngưỡng RAM và swap

Trạng tháiĐiều kiện tham chiếuCách hiểu
OVERLOADMemAvailable < 12% hoặc memory PSI full avg10 > 40Thiếu RAM hoặc stall bộ nhớ kéo dài
CRITICALMemAvailable < 6% hoặc memory PSI full avg10 > 60Cần kiểm lại sau mỗi bước giảm tải
Editor hard limitMemAvailable < 3% sau thời gian chờ editorChỉ dùng cho bước nâng mức can thiệp cuối
Swap/zRAMTỷ lệ tổng swap đã dùngTelemetry; không phải trigger độc lập để đóng ứng dụng

Swap đã dùng cao có thể phản ánh các page ít hoạt động; riêng tỷ lệ swap hoặc mức nén zRAM cao không đủ lý do kill tiến trình. Điều kiện RAM dùng hoặc, khác với điều kiện CPU cần cả hai tín hiệu và duy trì nhiều chu kỳ. Ngưỡng là chính sách watchdog tham chiếu, không phải mặc định kernel hay giá trị phù hợp mọi máy.

3. Can thiệp theo cấp độ

Trong profile AGGRESSIVE, khi đạt OVERLOAD và qua cooldown:

  1. Đóng nhóm trình duyệt Chrome, Edge/Teams bằng SIGKILL để thu hồi RAM nhanh.
  2. Chờ RECLAIM_WAIT=2 giây, đọc lại telemetry; chỉ chuyển bước tiếp nếu còn CRITICAL.
  3. Nếu cho phép đóng editor, gửi SIGTERM cho Cursor và VS Code như hai phương án cuối có cùng mức ưu tiên. Chờ EDITOR_TERM_GRACE=6 giây.
  4. Chỉ nâng lên SIGKILL editor khi RAM sau thời gian chờ vẫn dưới EDITOR_HARD_MEM_AVAIL_PCT=3.

SIGKILL không cho ứng dụng lưu hoặc dọn dẹp. Trình duyệt có thể khôi phục tab nhưng form, phiên đăng nhập và nội dung chưa lưu vẫn có thể mất; SIGTERM cũng không bảo đảm editor lưu dữ liệu. Chọn chính sách phù hợp công việc, bật autosave và kiểm backup trước khi cho phép watchdog đóng ứng dụng. KILL_EDITORS_ON_CRITICAL=0 tắt bước đóng editor, nhưng không tắt hành động lên trình duyệt của profile AGGRESSIVE.

4. Bảo vệ tiến trình và watchdog

PROTECT_PATTERN loại khỏi danh sách mục tiêu các thành phần desktop/session, Xorg/ Xwayland, systemd, D-Bus, audio, SSH, terminal, agent và runtime Docker/containerd. Kiểm tên tiến trình thực tế bằng ps; tên hoặc cách đóng gói thay đổi có thể khiến regex không còn khớp. Bảo vệ runtime container không thay cho giới hạn bộ nhớ của workload.

Watchdog dùng oom_score_adj=-1000; systemd unit tham chiếu có OOMScoreAdjust=-900, Nice=-5 và MemorySwapMax=0. Các thiết lập này giảm nguy cơ watchdog bị OOM chọn hoặc bị swap, tùy quyền và hỗ trợ cgroup. Không xem chúng là bảo đảm daemon luôn sống khi kernel, service hoặc máy gặp lỗi.

5. Bão CPU và allowlist

Hành động CPU cần đồng thời CPU bận >= 95% và CPU PSI some avg10 >= 20, duy trì qua CPU_SUSTAINED_CYCLES=3 chu kỳ poll. Một spike ngắn, một mình CPU bận hoặc một mình PSI cao không đủ kích hoạt hành động.

CPU_ACTION_PATTERN chỉ cho phép gửi SIGTERM tới Tracker extract/miner. Tiến trình lạ, editor và agent chỉ nhận cảnh báo ở nhánh CPU; nhánh RAM vẫn có chính sách riêng. Cooldown CPU tham chiếu là 60 giây. Log chứa quyết định để audit; thông báo desktop cần ngắn và không đưa chi tiết kiểm toán vào nội dung người dùng đọc thường xuyên.

6. Cấu hình và kiểm tra service đã cài

Cấu hình daemon đặt ở /etc/mem-guardian.conf, binary ở /usr/local/sbin/mem-guardian. Sao lưu cấu hình đang dùng trước khi chỉnh. Đây là các khóa tham chiếu, không phải file cấu hình hoàn chỉnh để ghi đè máy đang hoạt động:

MEM_AVAIL_PCT=12
PSI_FULL_AVG10=40
CRIT_MEM_AVAIL_PCT=6
CRIT_PSI_FULL_AVG10=60
RECLAIM_WAIT=2
KILL_EDITORS_ON_CRITICAL=0
EDITOR_TERM_GRACE=6
EDITOR_HARD_MEM_AVAIL_PCT=3
CPU_BUSY_PCT=95
CPU_PSI_SOME_AVG10=20
CPU_SUSTAINED_CYCLES=3
CPU_ACTION_COOLDOWN=60
systemctl status mem-guardian.service --no-pager
systemctl cat mem-guardian.service
journalctl -u mem-guardian.service -b --no-pager -n 100

Kiểm startup log có ngưỡng và target đúng. Sau khi đã rà soát thay đổi cấu hình, dùng sudo systemctl restart mem-guardian.service rồi đọc log lại. Khi cần dừng can thiệp, sudo systemctl stop mem-guardian.service; kiểm service đã dừng trước khi điều tra tiếp.

7. Thông báo desktop và AppArmor

Thông báo dùng notify-send trong session người dùng; service chạy qua runuser cần đúng user và môi trường D-Bus. Nếu thông báo thất bại, kiểm session và log audit trước khi thay chính sách bảo vệ.

NOTIFY_AA_UNCONFINED=1 là tùy chọn tương thích dùng aa-exec -p unconfined cho lệnh thông báo khi gặp lỗi AppArmor disconnected path. Nó thay đổi confinement của lệnh đó; không phải bước setup bắt buộc và không phải lý do tắt AppArmor toàn máy. Chỉ dùng sau khi xác định đúng lỗi và rà soát phạm vi; giữ chế độ confined khi không cần workaround.

8. Sysctl và indexer

Thiết lập tham chiếuMục đích và điều cần kiểm
vm.swappiness=10Thay cân bằng reclaim swap/file-backed page; đo lại với zRAM và workload thực tế
vm.vfs_cache_pressure=50Thay mức ưu tiên reclaim dentry/inode; giữ cache hơn có thể tốn RAM hơn
vm.dirty_ratio=15Ngưỡng dirty memory khiến tiến trình ghi tham gia writeback
vm.dirty_background_ratio=5Ngưỡng bắt đầu background writeback
vm.min_free_kbytes=131072Mức dự trữ tham chiếu 128 MiB; cần cân đối với tổng RAM

Đọc giá trị hiện tại bằng sysctl và lưu lại trước khi thử. Không áp toàn bộ preset chỉ vì máy có cùng distro; dirty ratio còn liên quan workload và thiết lập dirty bytes. Nguồn: Linux VM sysctl.

Với Tracker, ưu tiên chế độ throttle: quota CPU tham chiếu 50% và I/O scheduling idle. Xác định user unit đang có bằng systemctl --user list-unit-files trước khi tạo override; tên service khác nhau theo bản desktop. Chế độ disable có thể mask service và reset database index, làm mất kết quả tìm kiếm cho tới khi index được dựng lại. Khi restore, chỉ bỏ mask/override do bạn đã tạo; không xóa cấu hình quản trị khác.

9. Nghiệm thu và hoàn tác

  • Dùng telemetry giả lập hoặc VM để kiểm ngưỡng; không tạo OOM trên workstation có công việc chưa lưu. Swap cao đơn lẻ, spike CPU và tiến trình ngoài allowlist phải không bị kill.
  • Kiểm OVERLOAD/CRITICAL đọc lại RAM, thời gian chờ, editor opt-out, protected process và cooldown. Kiểm log đúng quyết định và notification tới đúng session.
  • Nếu cần gỡ, dừng và disable service, lưu config/log, rồi gỡ các file đúng với bản cài đã được kiểm kê. Khôi phục sysctl đã lưu và Tracker override/mask do bạn đã thay đổi.
  • Theo dõi sau hoàn tác bằng free -h, PSI và journal. Chỉ tăng mức can thiệp khi đã có bằng chứng workload, thay vì kết luận swap cao đồng nghĩa máy sắp OOM.

Quay lại hướng dẫn setup Linux.