2 giờ sáng và cơn ác mộng mang tên ‘Slow Query’
Điện thoại rung bần bật trên bàn. Alert từ hệ thống đổ về liên tục: Database CPU chạm ngưỡng 98%, latency nhảy vọt từ 50ms lên tận 3000ms. Mình bật dậy check log trong trạng thái mắt nhắm mắt mở. Traffic không hề tăng đột biến, nhưng con DB chính lại đang gồng mình gánh hàng nghìn query mỗi giây.
Câu hỏi đầu tiên xuất hiện: Memcached đang làm cái quái gì thế?
Bình thường Memcached chạy rất êm, giúp gánh tới 90% lượng read. Nhưng khi có sự cố, nếu không có số liệu cụ thể, bạn sẽ thấy mình như đang bơi trong bóng tối. Việc SSH vào server rồi gõ stats qua telnet chỉ cho thấy con số tức thời. Nó không thể giúp bạn thấy được xu hướng (trend) hay thời điểm chính xác mà mọi thứ bắt đầu tệ đi.
Đó là lý do bộ combo Prometheus + Memcached Exporter + Grafana trở thành cứu cánh. Tại hệ thống mình vận hành, setup này đã giúp team phát hiện RAM bị đầy dẫn đến Evictions tăng vọt trước khi user kịp phàn nàn web chậm.
Tại sao Memcached vẫn chạy nhưng hệ thống vẫn ì ạch?
Có 3 kịch bản phổ biến khiến Memcached trở nên vô dụng mà bạn cần lưu ý:
- Cache Hit Rate thấp: Data không nằm trong cache, mọi request đều chọc thẳng xuống Database.
- Evictions tăng cao: Memcached hết RAM. Nó buộc phải xóa các key cũ (ngay cả khi chưa hết hạn) để lấy chỗ cho data mới.
- Connection Limit: Số lượng kết nối từ Application đạt ngưỡng giới hạn, thường là 1024 theo mặc định.
Để không phải thức trắng đêm, bạn cần một dashboard trực quan để nhìn phát biết ngay lỗi nằm ở đâu.
Triển khai giám sát với Memcached Exporter
Thay vì gõ lệnh thủ công, chúng ta sử dụng Memcached Exporter. Đây là một sidecar nhỏ gọn viết bằng Go. Nó kết nối vào Memcached, lấy chỉ số stats và chuyển đổi sang định dạng Prometheus có thể đọc được.
Bước 1: Cài đặt Memcached Exporter
Với Docker, bạn chỉ cần một dòng lệnh duy nhất để khởi chạy:
docker run -d \
--name=memcached-exporter \
-p 9150:9150 \
prom/memcached-exporter:v0.13.0 \
--memcached.address=172.17.0.1:11211
Lưu ý: Thay IP 172.17.0.1 bằng địa chỉ thực tế của server Memcached.
Nếu dùng Linux (Binary), hãy tải bản phân phối mới nhất từ GitHub, giải nén và chạy như một systemd service để đảm bảo tính ổn định:
wget https://github.com/prometheus/memcached_exporter/releases/download/v0.13.0/memcached_exporter-0.13.0.linux-amd64.tar.gz
tar xvf memcached_exporter-0.13.0.linux-amd64.tar.gz
./memcached_exporter --memcached.address="localhost:11211"
Kiểm tra nhanh bằng cách truy cập http://localhost:9150/metrics. Nếu thấy các dòng memcached_up 1 là bạn đã thành công một nửa.
Bước 2: Cấu hình Scrape Job trên Prometheus
Mở file prometheus.yml và khai báo endpoint để Prometheus định kỳ qua lấy dữ liệu:
scrape_configs:
- job_name: 'memcached_prod'
static_configs:
- targets: ['<EXPORTER_IP>:9150']
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'memcached-01'
Sau khi reload Prometheus, dữ liệu sẽ bắt đầu được lưu trữ vào Time Series Database.
Bước 3: Thiết lập Dashboard Grafana
Đừng tốn công vẽ chart từ đầu. Cộng đồng đã tối ưu sẵn các template rất chuyên nghiệp. Bạn chỉ cần vào Grafana, chọn Import và nhập ID 74 hoặc 3932. Ngay lập tức, bạn sẽ có biểu đồ về Hit Rate, Memory và Network Traffic.
3 chỉ số “vàng” cần giám sát chặt chẽ
Khi nhìn vào Dashboard, hãy bỏ qua các thông số phụ và tập trung vào 3 chỉ số sinh tử này:
1. Cache Hit Rate (Tỉ lệ trúng cache)
Công thức: get_hits / (get_hits + get_misses).
Một hệ thống khỏe mạnh thường có Hit Rate trên 90%. Nếu con số này tụt xuống dưới 75%, đó là dấu hiệu cảnh báo. Có thể logic code đang đặt key không thống nhất, hoặc TTL (Time To Live) quá ngắn khiến data bị xóa trước khi kịp tái sử dụng.
2. Evictions (Số item bị đẩy ra ngoài)
Trong điều kiện lý tưởng, Evictions phải bằng 0. Nếu biểu đồ này bắt đầu xuất hiện các cột dựng đứng, nghĩa là RAM đã cạn. Memcached đang phải “hy sinh” dữ liệu cũ. Giải pháp lúc này là tăng RAM hoặc lọc bớt các object rác không cần thiết trong cache.
3. Memory Usage (Mức độ chiếm dụng bộ nhớ)
Đừng để Memcached chạy quá 80% dung lượng RAM được cấp phép. Cơ chế Slab Allocation của Memcached đôi khi khiến RAM ảo vẫn còn nhưng thực tế không thể lưu thêm object mới. Hãy đặt cảnh báo khi Memory chạm ngưỡng 85% để có phương án scale-up sớm.
Kinh nghiệm thực tế: Đừng đợi sự cố mới xem Dashboard
Dashboard đẹp chỉ để ngắm nếu bạn không có hệ thống cảnh báo (Alerting). Mình thường thiết lập Alert qua Telegram với các ngưỡng cụ thể:
- Critical:
memcached_up == 0(Server sập, cần xử lý ngay). - Warning:
rate(memcached_items_evicted_total[1m]) > 10(Dấu hiệu thiếu RAM rõ rệt). - Warning: Hit Rate < 70% kéo dài trong 10 phút.
Nhờ những rule này, mình từng phát hiện một đợt deploy lỗi làm thay đổi cấu trúc key, khiến Hit Rate rơi thẳng đứng. Team đã rollback kịp thời trong 5 phút, tránh được một đợt downtime nghiêm trọng.
Lời kết
Giám sát Memcached không chỉ là cài công cụ cho có, mà là hiểu hệ thống đang “thở” thế nào qua các con số. Việc kết hợp Prometheus và Grafana giúp bạn chủ động hơn, thay vì bị động chạy theo xử lý sự cố. Chúc các bạn có những đêm ngon giấc, không bị tiếng chuông alert dựng dậy!

