Giám Sát Tài Nguyên Docker Container với `docker stats` và cAdvisor: Phát Hiện ‘Thủ Phạm’ Ngốn CPU, RAM

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Giới thiệu vấn đề

Bạn đang làm việc với Docker và bỗng nhận thấy ứng dụng chạy chậm bất thường? Hay cả máy chủ bỗng dưng ì ạch không rõ lý do? Trong môi trường nhiều Docker container hoạt động đồng thời, việc tìm ra ‘thủ phạm’ nào đang tiêu tốn tài nguyên hệ thống (CPU, RAM) là cực kỳ quan trọng. Không có giám sát, việc tối ưu hóa hay khắc phục sự cố sẽ rất khó khăn.

May mắn thay, Docker cung cấp sẵn công cụ mạnh mẽ docker stats. Cộng đồng cũng phát triển cAdvisor, một giải pháp chuyên nghiệp hơn. Bài viết này sẽ hướng dẫn chi tiết cách sử dụng cả hai. Bạn sẽ dễ dàng giám sát, phát hiện và xử lý các vấn đề hiệu suất của container.

Khái niệm cốt lõi

docker stats là gì?

docker stats là một lệnh tích hợp sẵn trong Docker CLI. Nó cho phép bạn xem thông tin sử dụng tài nguyên theo thời gian thực của các container đang chạy. Công cụ này cung cấp cái nhìn tổng quan nhanh về CPU, RAM, I/O mạng và I/O đĩa của từng container. Đây là lựa chọn lý tưởng để kiểm tra nhanh khi nghi ngờ có vấn đề hiệu suất.

cAdvisor là gì?

cAdvisor (Container Advisor) là công cụ mã nguồn mở từ Google. Nó được thiết kế để thu thập, tổng hợp, xử lý và xuất thông tin hiệu suất cùng tài nguyên từ các container đang chạy. Khác với docker stats chỉ hiển thị dữ liệu thời gian thực, cAdvisor vượt trội hơn. Nó cung cấp biểu đồ trực quan và lịch sử dữ liệu chi tiết. Điều này giúp bạn phân tích xu hướng, phát hiện các vấn đề tài nguyên lâu dài hoặc định kỳ.

Tại sao cần giám sát CPU và RAM?

CPU và RAM là hai tài nguyên cốt lõi quyết định hiệu suất ứng dụng. Điều này đúng ngay cả khi ứng dụng chạy trong container. Nếu một container tiêu thụ quá nhiều CPU, nó có thể làm chậm các tiến trình khác trên cùng máy chủ Docker. Tương tự, khi RAM bị ‘ngốn’ quá mức, hệ thống có thể buộc phải dùng swap (hoán đổi dữ liệu từ RAM sang đĩa). Hậu quả là hiệu suất giảm sút nghiêm trọng, thậm chí dẫn đến tình trạng ‘Out Of Memory’ (OOM) và khiến ứng dụng bị sập hoàn toàn.

Thực hành chi tiết

1. Giám sát nhanh với docker stats

docker stats là công cụ nhanh nhất để nắm bắt tổng quan tình trạng tài nguyên container. Cùng mở terminal và thực hành các lệnh sau đây nhé!

Lệnh cơ bản: Xem tất cả container

Chỉ cần gõ docker stats mà không cần thêm đối số nào, bạn sẽ thấy danh sách tất cả container đang chạy. Kèm theo đó là thông tin tài nguyên chi tiết của từng container.


docker stats

Kết quả trả về sẽ giống như sau:


CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT   MEM %     NET I/O      BLOCK I/O      PIDS
8e1d5a7d0c3b   my-nginx     0.00%     2.207MiB / 7.769GiB   0.03%     1.57kB / 0B    0B / 0B        2
4b2e1f9c8d7a   my-app       0.23%     125MiB / 7.769GiB   1.61%     6.74MB / 1.2MB   1.5MB / 564kB   15
  • CONTAINER ID / NAME: Mã ID và tên của container.
  • CPU %: Phần trăm CPU container đang sử dụng. Nếu giá trị này liên tục cao (ví dụ trên 80%), đó là dấu hiệu container đang làm việc quá tải hoặc gặp sự cố.
  • MEM USAGE / LIMIT: Lượng RAM container đang dùng so với giới hạn được cấp (nếu có).
  • MEM %: Phần trăm RAM đang sử dụng. Tương tự CPU, con số này cao (ví dụ trên 70-80%) cho thấy nguy cơ thiếu RAM.
  • NET I/O: Lượng dữ liệu mạng container đã gửi và nhận.
  • BLOCK I/O: Lượng dữ liệu đã đọc/ghi vào ổ đĩa.
  • PIDS: Tổng số tiến trình mà container đang chạy.

Giám sát container cụ thể

Để chỉ xem một hoặc vài container cụ thể, bạn chỉ cần thêm ID hoặc tên của chúng vào lệnh:


docker stats my-nginx my-app

Lấy dữ liệu không streaming (chỉ một lần)

Đôi lúc, bạn chỉ cần một ‘ảnh chụp nhanh’ tình trạng tài nguyên, không phải dòng dữ liệu liên tục. Khi đó, hãy sử dụng cờ --no-stream:


docker stats --no-stream my-nginx

Ví dụ thực tế với Nginx

Chúng ta hãy thử chạy một container Nginx đơn giản và kiểm tra tài nguyên của nó xem sao:


docker run -d --name my-nginx nginx

Sau đó, chạy lệnh docker stats my-nginx. Bạn sẽ nhận thấy CPU và RAM của Nginx thường ở mức rất thấp khi không có truy cập. Nếu thử truy cập Nginx qua trình duyệt, bạn có thể thấy CPU % tăng nhẹ một chút.

2. Giám sát chuyên sâu với cAdvisor

Để có cái nhìn sâu sắc hơn, theo dõi lịch sử và trực quan hóa dữ liệu, cAdvisor là lựa chọn hoàn hảo. Điều tiện lợi là cAdvisor cũng được chạy dưới dạng một Docker container.

Cài đặt cAdvisor (chạy trong Docker container)

Hãy chạy lệnh sau để khởi động cAdvisor. Lệnh này sẽ tải image cAdvisor từ Google Container Registry. Sau đó, nó sẽ chạy và cấp quyền truy cập vào các tài nguyên hệ thống Docker cần thiết.


docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  gcr.io/cadvisor/cadvisor:latest

Giải thích các đối số:

  • --volume=...:ro: Gắn các thư mục hệ thống ở chế độ chỉ đọc. Điều này cho phép cAdvisor thu thập thông tin về hệ thống và các container khác.
  • --volume=/var/run:/var/run:rw: Cấp quyền ghi vào thư mục /var/run để cAdvisor có thể tương tác với Docker daemon.
  • --publish=8080:8080: Mở cổng 8080 trên máy chủ. Nhờ đó, bạn có thể truy cập giao diện web của cAdvisor.
  • --detach=true: Chạy container ở chế độ nền.
  • --name=cadvisor: Đặt tên cho container là cadvisor giúp dễ dàng quản lý hơn.

Khi lệnh chạy thành công, cAdvisor sẽ bắt đầu thu thập dữ liệu ngay lập tức. Bạn có thể truy cập giao diện web của nó qua trình duyệt tại http://localhost:8080. Hoặc dùng http://<IP_SERVER_DOCKER>:8080 nếu đang chạy trên máy chủ từ xa.

Khám phá giao diện cAdvisor

Khi truy cập http://localhost:8080, giao diện cAdvisor sẽ hiện ra. Trang tổng quan (Overview) hiển thị thông tin chung về CPU và Memory của toàn bộ hệ thống. Để xem chi tiết từng container, bạn chỉ cần điều hướng đến tab “Containers” ở thanh bên trái.

Trong tab “Containers”, bạn sẽ thấy danh sách các container đang hoạt động. Nhấp vào bất kỳ container nào (ví dụ: my-nginx hoặc cadvisor) để xem biểu đồ tài nguyên chi tiết của nó:

  • CPU Usage: Biểu đồ hiển thị mức sử dụng CPU theo thời gian. Nó giúp bạn nhận diện các khoảng thời gian cao điểm hoặc bất thường.
  • Memory Usage: Biểu đồ RAM chỉ ra liệu container có đang vượt quá ngưỡng hay có dấu hiệu rò rỉ bộ nhớ hay không.
  • Network Traffic: Biểu đồ lưu lượng mạng. Đây là thông tin hữu ích khi debug các ứng dụng phụ thuộc nhiều vào I/O mạng.

Những biểu đồ này chính là điểm mạnh của cAdvisor so với docker stats. Bạn có thể dễ dàng nhìn thấy xu hướng, các đỉnh điểm tài nguyên. Từ đó, đưa ra quyết định tối ưu hóa dựa trên dữ liệu lịch sử một cách chính xác.

Phát hiện container “ngốn” tài nguyên

Với cAdvisor, việc phát hiện container ‘ngốn’ tài nguyên trở nên trực quan và dễ dàng hơn nhiều. Nếu biểu đồ CPU của một container liên tục ở mức cao (ví dụ: trên 80-90%) trong thời gian dài, đó là một dấu hiệu. Tương tự, biểu đồ Memory luôn tiến sát giới hạn (nếu có) cũng là cảnh báo rõ ràng. Lúc này, bạn có thể:

  • Kiểm tra log của container đó. Xem liệu có lỗi nào đang chạy vòng lặp vô hạn hay không.
  • Cân nhắc tăng giới hạn tài nguyên (CPU/RAM) cho container nếu nó thực sự cần nhiều hơn để hoạt động ổn định.
  • Tối ưu hóa code hoặc cấu hình ứng dụng bên trong container. Mục tiêu là giảm tải tài nguyên hiệu quả.

Khi debug vấn đề hiệu suất trên Docker, đặc biệt là khi cần phân tích phản hồi JSON từ API hoặc cấu hình container, mình thấy việc đọc raw JSON rất khó chịu. Mình thường xuyên dùng toolcraft.app/vi/tools/developer/json-formatter để định dạng lại. Công cụ này giúp mình đọc hiểu dữ liệu response từ API của cAdvisor hay các API khác nhanh hơn rất nhiều. Hơn nữa, nó không cần cài thêm extension, tiết kiệm đáng kể thời gian.

Kết luận

Giám sát tài nguyên Docker container là một kỹ năng thiết yếu cho bất kỳ ai làm việc với Docker. Với docker stats, bạn có thể nhanh chóng kiểm tra tình hình hiện tại của các container. Khi cần phân tích sâu, theo dõi xu hướng hay tìm kiếm vấn đề tiềm ẩn, cAdvisor là công cụ đắc lực mang đến cái nhìn trực quan và chi tiết.

Hãy tích hợp việc giám sát này vào quy trình làm việc hàng ngày của bạn. Sớm phát hiện và xử lý các container ‘ngốn’ tài nguyên không chỉ giúp ứng dụng ổn định hơn. Mà còn tối ưu hóa chi phí máy chủ đáng kể. Bắt đầu áp dụng ngay để làm chủ container và đảm bảo hệ thống luôn hoạt động trơn tru!

Share: