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ếu | Cách hiểu |
|---|---|---|
| OVERLOAD | MemAvailable < 12% hoặc memory PSI full avg10 > 40 | Thiếu RAM hoặc stall bộ nhớ kéo dài |
| CRITICAL | MemAvailable < 6% hoặc memory PSI full avg10 > 60 | Cần kiểm lại sau mỗi bước giảm tải |
| Editor hard limit | MemAvailable < 3% sau thời gian chờ editor | Chỉ dùng cho bước nâng mức can thiệp cuối |
| Swap/zRAM | Tỷ lệ tổng swap đã dùng | Telemetry; 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:
- Đóng nhóm trình duyệt Chrome, Edge/Teams bằng
SIGKILLđể thu hồi RAM nhanh. - Chờ
RECLAIM_WAIT=2giây, đọc lại telemetry; chỉ chuyển bước tiếp nếu còn CRITICAL. - Nếu cho phép đóng editor, gửi
SIGTERMcho Cursor và VS Code như hai phương án cuối có cùng mức ưu tiên. ChờEDITOR_TERM_GRACE=6giây. - Chỉ nâng lên
SIGKILLeditor khi RAM sau thời gian chờ vẫn dướiEDITOR_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ếu | Mục đích và điều cần kiểm |
|---|---|
vm.swappiness=10 | Thay cân bằng reclaim swap/file-backed page; đo lại với zRAM và workload thực tế |
vm.vfs_cache_pressure=50 | Thay mức ưu tiên reclaim dentry/inode; giữ cache hơn có thể tốn RAM hơn |
vm.dirty_ratio=15 | Ngưỡng dirty memory khiến tiến trình ghi tham gia writeback |
vm.dirty_background_ratio=5 | Ngưỡng bắt đầu background writeback |
vm.min_free_kbytes=131072 | Mứ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.