Đọc Hiểu Toàn Bộ Các Giá Trị Trong Lệnh free

Cẩm nang phân tích chuyên sâu từng con số trong lệnh free -v -h từ ảnh chụp thực tế: Phân biệt used vs available, buff/cache, Swap và dòng Comm (Committed Memory) nâng cao.

Trong bộ công cụ quản trị hệ điều hành Linux (procps-ng), free là câu lệnh đầu tiên và thông dụng nhất mà mọi kỹ sư SRE, DevOps hay Sysadmin đều gõ vào terminal mỗi khi cần kiểm tra tình trạng bộ nhớ RAM hoặc khi hệ thống phát cảnh báo tài nguyên.

Dưới đây là ảnh chụp màn hình terminal thực tế khi thực thi lệnh free -v -h trên một máy chủ Linux:

Giao diện kết quả thực thi lệnh free -v -h thực tế

Kết quả đầu ra dạng văn bản từ lệnh trên:

darktuan@DarkTuaz:~$ free -v -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.9Gi        11Gi        24Mi       2.2Gi        13Gi
Swap:         4.0Gi          0B       4.0Gi
Comm:          11Gi       4.6Gi       7.2Gi
darktuan@DarkTuaz:~$ 

Hãy cùng bóc tách và giải mã chi tiết từng hàng, từng cột và từng giá trị xuất hiện trong kết quả trên dưới góc nhìn của một kỹ sư Vận hành Hệ thống.


1. Dòng Mem: (Bộ Nhớ Vật Lý - Physical RAM)

Dòng Mem: thể hiện chi tiết trạng thái phân bổ của thanh RAM vật lý gắn trên máy chủ:

              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.9Gi        11Gi        24Mi       2.2Gi        13Gi
CộtGiá trị trong ảnhBản chất kỹ thuậtÝ nghĩa đối với SRE / Sysadmin
total15GiTổng dung lượng RAM vật lý mà Linux Kernel có thể quản lýBằng tổng RAM phần cứng trừ đi phần nhỏ dung lượng đã dành riêng (reserved) cho BIOS và nạp nhân Kernel
used1.9GiBộ nhớ RAM thực tế đang bị ứng dụng chiếm dụngĐược tính theo công thức: used = total - free - buff/cache. Đây là lượng RAM thực sự đang nuôi các tiến trình (User space processes)
free11GiBộ nhớ RAM hoàn toàn trống rỗngLượng RAM chưa có bất kỳ dữ liệu nào ghi vào và cũng chưa được dùng làm cache
shared24MiBộ nhớ chia sẻ (Shared Memory)Dung lượng RAM được dùng chung bởi nhiều tiến trình (chủ yếu là tmpfs, shmem, POSIX shared memory và /dev/shm)
buff/cache2.2GiTổng dung lượng của Buffers và Page Cache gộp lạiDữ liệu đệm từ ổ cứng được lưu tạm trên RAM để tăng tốc độ I/O. Vùng này sẽ được Kernel thu hồi tức thì khi có ứng dụng cần RAM
available13GiLượng RAM thực tế có thể sử dụng cho ứng dụng mớiCon số VÀNG quan trọng nhất! Kernel ước tính lượng RAM sẵn sàng cấp phát ngay lập tức mà không cần dùng đến Swap

1.1. Phân Biệt Buffers vs Page Cache Trong Cột buff/cache

Mặc định lệnh free gộp cả hai giá trị này thành một cột duy nhất buff/cache. Nếu thêm cờ --wide (free -w -h), Linux sẽ tách thành 2 cột độc lập:

  • Buffers (Bộ đệm khối):
    • Lưu trữ metadata của hệ thống tệp (directory structure, inode information, superblock) và các khối đọc/ghi thô (raw block device I/O).
    • Thường có dung lượng nhỏ (vài chục đến vài trăm MB).
  • Page Cache (Bộ đệm tệp):
    • Chứa nội dung thực tế của các file được đọc từ ổ cứng.
    • Khi ứng dụng đọc file lần đầu, Kernel nạp nội dung vào Page Cache. Các lần đọc tiếp theo diễn ra hoàn toàn trên RAM với tốc độ nhanh gấp hàng trăm lần ổ SSD/NVMe.

[!NOTE] 🧠 Triết lý thiết kế của Linux: "Unused RAM is wasted RAM" (RAM bỏ trống là RAM lãng phí). Nhân Linux sẽ chủ động tận dụng tối đa lượng RAM nhàn rỗi để làm buff/cache. Khi các tiến trình cần thêm bộ nhớ, Kernel sẽ lập tức hủy bỏ các trang cache này để cấp phát cho ứng dụng mà không gây nghẽn hay treo máy.


1.2. Sự Khác Biệt Giữa free và available (Hiểu Lầm Phổ Biến Nhất)

Nhiều người quản trị mới thường nhìn vào cột free và hoảng hốt khi thấy con số này chỉ còn vài trăm Megabyte, rồi cho rằng máy chủ sắp cạn RAM.

Hiểu lầm:  RAM còn lại = free (11Gi)
Thực tế:   RAM sẵn sàng cấp phát = available (13Gi)
  • free: Chỉ là lượng RAM "ngủ đông", hoàn toàn chưa chạm tới.
  • available: Bằng free cộng thêm phần dung lượng có thể thu hồi được (reclaimable memory) từ buff/cache (trừ đi một lượng nhỏ an toàn để duy trì hoạt động cơ bản của hệ thống).

[!TIP] 🎯 Quy tắc giám sát chuẩn Production: Khi viết rule cảnh báo (Alertmanager, Datadog, Zabbix), TUYỆT ĐỐI KHÔNG dùng free để tính phần trăm RAM trống. Hãy luôn dùng chỉ số available:

# Công thức tính tỷ lệ % RAM khả dụng trong Prometheus node_exporter:
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

2. Dòng Swap: (Bộ Nhớ Hoán Đổi Trên Ổ Đĩa)

Dòng Swap: thể hiện tình trạng của không gian hoán đổi (Swap partition hoặc Swap file):

              total        used        free      shared  buff/cache   available
Swap:         4.0Gi          0B       4.0Gi
  • total (4.0Gi): Kích thước phân vùng/file Swap được cấu hình trên hệ thống là 4GB.
  • used (0B): Hệ thống hiện tại đang sử dụng 0 Byte Swap.
  • free (4.0Gi): Toàn bộ 4GB Swap đang còn nguyên vẹn.

🎯 Góc Nhìn Thực Chiến Của SRE

  • Khi Swap used = 0B và available = 13Gi: Máy chủ đang ở trạng thái hiệu năng đỉnh cao nhất. Toàn bộ tác vụ đều chạy trực tiếp trên chip nhớ RAM vật lý.
  • Nếu Swap used tăng cao và đi kèm với hiện tượng I/O Wait tăng vọt: Hệ thống đang rơi vào tình trạng Swap Thrashing (Kernel liên tục hoán đổi dữ liệu giữa RAM và đĩa), làm suy giảm nghiêm trọng tốc độ phản hồi của ứng dụng.

3. Dòng Comm: (Committed Memory - Điểm Sáng Nâng Cao Từ Cờ -v)

Điểm đặc biệt và giá trị nhất trong ảnh chụp màn hình của bạn là có thêm dòng Comm:. Dòng này chỉ xuất hiện khi bạn thêm cờ -v (--committed) trong các phiên bản procps-ng mới:

              total        used        free      shared  buff/cache   available
Comm:          11Gi       4.6Gi       7.2Gi

Dữ liệu này được trích xuất trực tiếp từ file /proc/meminfo với hai trường: CommitLimit và Committed_AS.

3.1. Ý Nghĩa Của Từng Con Số

  1. total (11Gi) - Commit Limit:
    • Trần bộ nhớ ảo tối đa mà Linux Kernel cam kết có thể cấp phát cho các tiến trình nếu chính sách kiểm soát Overcommit (vm.overcommit_memory = 2) được kích hoạt.
    • Công thức tính:
      CommitLimit = SwapTotal + (RAM * vm.overcommit_ratio / 100)
      
    • Với cấu hình thực tế trong ảnh: RAM 15Gi, Swap 4Gi, với tỷ lệ mặc định overcommit_ratio = 50%:
      CommitLimit = 4Gi + (15Gi * 50%) = 4Gi + 7.5Gi = 11.5Gi (~11Gi)
      
  2. used (4.6Gi) - Committed_AS (Committed Address Space):
    • Tổng dung lượng bộ nhớ ảo mà tất cả các tiến trình trên máy chủ ĐÃ YÊU CẦU thông qua các hàm cấp phát bộ nhớ (malloc(), mmap()).
    • ⚠️ Điểm mấu chốt: Dù RAM thực tế (used) chỉ mới tốn 1.9Gi, nhưng tổng lượng bộ nhớ các tiến trình "đăng ký trước" đã lên tới 4.6Gi!
    • Đây là trường hợp xấu nhất: nếu tất cả các tiến trình cùng lúc ghi đầy đủ dữ liệu vào vùng nhớ ảo mà chúng đã xin, hệ thống sẽ cần 4.6Gi RAM thực tế.
  3. free (7.2Gi) - Commit Budget:
    • Lượng ngân sách commit còn lại mà các tiến trình có thể tiếp tục yêu cầu cấp phát trước khi chạm trần CommitLimit (11Gi - 4.6Gi = ~6.5 - 7.2Gi).

[!IMPORTANT] 🛡️ Ý nghĩa đối với việc phòng chống OOM Killer: Nhờ cơ chế Memory Overcommit, Linux cho phép các ứng dụng xin nhiều RAM hơn lượng RAM vật lý đang có. Tuy nhiên, nếu Committed_AS vượt quá xa khả năng chịu đựng của phần cứng và các ứng dụng đồng loạt ghi dữ liệu thật, Kernel sẽ buộc phải kích hoạt OOM Killer để tiêu diệt bớt tiến trình. Giám sát dòng Comm: giúp SRE phát hiện sớm nguy cơ này.


4. Bảng Tra Cứu Các Tham Số Lệnh free Thường Dùng

Lệnh free cung cấp rất nhiều cờ tùy biến phục vụ cho từng mục đích kiểm tra khác nhau:

Lệnh & Cờ tham sốMục đích sử dụngKhi nào nên dùng?
free -hHiển thị đơn vị dễ đọc (Human-readable: GiB, MiB, KiB)Dùng hàng ngày khi thao tác trực tiếp trên terminal
free -mHiển thị theo đơn vị Megabytes (MB)Dùng trong Bash script hoặc parse log giám sát
free -gHiển thị theo đơn vị Gigabytes (GB)Dùng trên các máy chủ có dung lượng RAM cực lớn (128GB - 1TB)
free -w (--wide)Tách riêng hai cột buffers và cacheKhi cần phân tích sâu mức tiêu hao giữa metadata đĩa và page cache
free -v (--committed)Bổ sung dòng Comm: phân tích bộ nhớ cam kếtKhi chẩn đoán lỗi OOM, cấu hình máy chủ Database, Redis
free -t (--total)Bổ sung dòng Total: cộng gộp cả RAM và SwapXem tổng năng lực lưu trữ bộ nhớ của toàn bộ hệ thống
free -s 1 (--seconds 1)Tự động làm mới kết quả sau mỗi 1 giâyGiám sát biến động RAM theo thời gian thực (tương tự live monitor)
free -c 5 (--count 5)Chạy làm mới đúng 5 lần rồi tự động dừng lạiKết hợp với cờ -s để thu thập mẫu dữ liệu đo lường

5. Tình Huống Sự Cố & Kịch Bản Phỏng Vấn SRE Thực Tế

Câu hỏi 1: "Server cảnh báo hết RAM vì free chỉ còn 150MB. Tôi có cần nâng cấp thêm RAM cho máy chủ ngay không?"

Trả lời: Chưa cần! Hãy kiểm tra ngay cột available và buff/cache.

  • Nếu buff/cache đang chiếm vài Gigabyte và available vẫn còn lớn (ví dụ 10GB như trong ảnh thực tế trên), hệ thống hoàn toàn bình thường. Đó chỉ là Page Cache đang làm nhiệm vụ tối ưu hóa tốc độ đọc file.
  • Chỉ khi nào available tiệm cận 0 và Swap used bắt đầu tăng liên tục, đó mới là lúc máy chủ thực sự thiếu RAM vật lý.

Câu hỏi 2: "Làm thế nào để giải phóng Page Cache tức thì để kiểm tra hiệu năng đĩa (Benchmark)?"

Nếu bạn muốn xóa sạch vùng nhớ buff/cache để đo lường tốc độ đọc đĩa thực tế của ổ cứng:

# Bước 1: Ghi toàn bộ dữ liệu đang chờ từ RAM xuống đĩa an toàn
sync

# Bước 2: Yêu cầu Kernel giải phóng PageCache, dentries và inodes
echo 3 | sudo tee /proc/sys/vm/drop_caches

# Bước 3: Chạy lại lệnh free để kiểm tra kết quả
free -h

📌 Tổng Kết & Mối Liên Hệ Với Lệnh htop

Hãy so sánh kết quả giữa lệnh free -v -h và công cụ htop trên cùng máy chủ này:

  • Trên thanh đo RAM của htop: Bạn thấy thanh Mem [ 1.99G/15.5G ] và Swp [ 0K/4.00G ].
  • Trên lệnh free: Bạn thấy used: 1.9Gi, total: 15Gi, Swap used: 0B, total: 4.0Gi.

Cả hai công cụ đều lấy dữ liệu nền tảng từ tập tin nhân hệ thống /proc/meminfo. Trong khi htop mang lại giao diện trực quan và phân tích chi tiết từng tiến trình (RES, VIRT, SHR), thì lệnh free -v -h là vũ khí kiểm tra nhanh gọn, chính xác và cung cấp cái nhìn tổng thể về ngân sách bộ nhớ của toàn bộ hệ điều hành.


Bài viết liên quan: