0

Giải quyết vấn đề OOM Killer bằng Swap

1. Vấn đề mình gặp phải

Dạo gần đây khi deploy dự án lên server production, mình liên tục gặp tình trạng server bị chết đột ngột mỗi khi chạy npm run build hoặc thực hiện CI/CD. Sau khi vào xem observability thì thấy CPU chỉ sử dụng khoảng 80% — hoàn toàn bình thường, không đáng lo.

Nhưng server vẫn cứ crash và phải restart liên tục.

Sau khi đào sâu hơn, mình nhận ra thủ phạm chính là RAM. Server chỉ còn 1GB RAM, và mỗi lần build là OS kích hoạt OOM Killer (Out-Of-Memory Killer) — một cơ chế của OS tự động kill process khi RAM cạn kiệt để bảo vệ hệ thống.

Với chi phí hạn chế, mình không thể scale up server ngay lập tức, mình quyết định dùng Swap để giải quyết tạm thời. Kết quả? Cực kỳ nhanh chóng và hiệu quả.

Trước tiên thì chúng ta phải biết Swap là gì đã !!!


2. Swap là gì và tại sao nó giải quyết được OOM?

2.1 Swap là gì?

Swap có thể hiểu đơn giản là RAM ảo — một vùng không gian được cấp phát trên ổ cứng (SSD/HDD). Khi RAM vật lý bị đầy, OS sẽ tự động chuyển bớt dữ liệu (các memory page ít được dùng nhất) xuống vùng Swap để giải phóng RAM cho các process đang hoạt động.

2.2 Cơ chế hoạt động của Swap

Swap In và Swap Out

Swap hoạt động theo hai chiều:

  • Swap Out: Khi RAM bị đầy, OS sẽ chọn ra các memory page ít được sử dụng nhất và đẩy chúng xuống vùng Swap Space trên ổ cứng để giải phóng RAM cho các process khác đang cần.
  • Swap In: Khi process cần lại dữ liệu đã bị swap out, OS sẽ đọc ngược dữ liệu từ ổ cứng lên RAM để tiếp tục xử lý.

Quá trình này được điều phối bởi Medium Term Scheduler (MTS) của OS. Với các hệ thống có nhiều process cạnh tranh RAM, OS sẽ ưu tiên swap out các process có độ ưu tiên thấp hơn để nhường chỗ cho process quan trọng hơn.

Các bạn có thể xem thêm cơ chế Scheduler Process của OS để hiểu thêm nha !!!

https://data-flair.training/blogs/process-scheduling-in-operating-system/

Lưu ý: Tốc độ đọc/ghi của Swap chậm hơn RAM rất nhiều (hàng chục đến hàng trăm lần). Vì vậy Swap chỉ nên là "bộ đệm tạm thời", không phải giải pháp thay thế RAM.

2.3 OOM Killer là gì và tại sao Swap giải quyết được nó?

Khi RAM cạn kiệt và không có Swap, OS Kernel sẽ kích hoạt OOM Killer. Cơ chế này hoạt động như sau:

  1. Kernel tính toán OOM Score cho từng process đang chạy — process nào dùng nhiều RAM và ít quan trọng hơn sẽ có score cao hơn.
  2. OOM Killer sẽ kill process có OOM Score cao nhất để giải phóng RAM.
  3. Quá trình này hoàn toàn tự động, không báo trước — đó là lý do server của mình cứ crash đột ngột.

Cơ chế OOM Killer và vai trò của Swap

Khi có Swap, vấn đề được giải quyết hoàn toàn:

  • Thay vì Kill Process ngay khi RAM cạn, OS có thể đẩy bớt dữ liệu xuống Swap để tiếp tục chạy.
  • Kernel cũng có thể kết hợp với OOMD (OOM Daemon ở user space) để quản lý memory theo Policy linh hoạt hơn, thay vì chỉ kill thẳng từ Kernel.
  • Các tác vụ như build code hay chạy CI/CD — vốn không yêu cầu real-time response — sẽ chạy chậm hơn một chút nhưng không bị crash đột ngột nữa.

3. Cách setup Swap trên server Linux

Trước khi tạo swap, chúng ta nên kiểm tra dung lượng ổ cứng hiện tại để phân bổ Swap cho phù hợp:

df -h

Tạo swap file và phân quyền:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
ls -lh /swapfile

Kích hoạt swap:

sudo mkswap /swapfile
sudo swapon /swapfile

Để swap tự động được apply mỗi khi reboot, thêm dòng sau vào file /etc/fstab:

/swapfile none swap sw 0 0

Vậy là xong! Setup chưa đến 5 phút.


4. Swap bao nhiêu là đủ?

Đôi lúc chúng ta nghĩ cứ Swap lên nhiều thì performance sẽ tốt hơn — điều đó không đúng. Nếu OS phải liên tục dùng Swap thay vì RAM thì hệ thống sẽ bị chậm đáng kể, vì RAM nhanh hơn SSD đến 1.000 lần, và nhanh hơn HDD thông thường đến 100.000 lần. Tình trạng app phụ thuộc quá nhiều vào Swap còn có tên riêng là thrashing — lúc đó app gần như không dùng được nữa.

Mình có tham khảo bài viết từ It's FOSS (https://itsfoss.com/swap-size/) và nhận ra thực ra không có một con số chuẩn nào cho swap size cả — mỗi distro lại có recommendation khác nhau. Có quy tắc kinh điển là dùng 2x RAM cho Swap, nhưng với các server hiện đại RAM lên đến 32GB, 64GB thì cấp 64GB hay 128GB Swap rõ ràng là lãng phí ổ cứng không cần thiết.

Ví dụ cụ thể:

  • Red Hat recommend Swap bằng 20% RAM với các hệ thống RAM từ 4GB trở lên.

  • CentOS recommend 2x RAM nếu RAM < 2GB, hoặc RAM + 2GB nếu RAM > 2GB.

  • Ubuntu thì tính theo căn bậc hai của RAM, cụ thể theo bảng dưới đây:

    RAM Swap (không hibernate) Swap (có hibernate)
    2GB 1GB 3GB
    4GB 2GB 6GB
    8GB 3GB 11GB
    16GB 4GB 20GB
    32GB 6GB 38GB
    64GB 8GB 72GB

Với server 8GB RAM của mình, dùng khoảng 3–4GB Swap là hợp lý — vừa đủ làm "vùng đệm" cho các tác vụ build nặng mà không lãng phí ổ cứng.

Lưu ý thêm: Nếu server của bạn cần dùng hibernation thì Swap tối thiểu phải bằng với dung lượng RAM, vì toàn bộ nội dung RAM sẽ được ghi xuống Swap khi hibernate.


Đây là cách mình giải quyết tạm thời vấn đề OOM Killer khi chưa có điều kiện scale up hệ thống. Nếu bạn đang gặp tình trạng tương tự với server nhỏ, hãy thử nhé 😄

Cảm ơn mọi người đã đọc bài viết này !!!


Nguồn tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí