Giám sát WordPress với InitTop: Từ MySQL monitoring đến full-stack observability

InitTop là công cụ giám sát cơ sở dữ liệu MySQL/MariaDB chạy trực tiếp trên Terminal, giúp nhìn thấy chính xác câu lệnh SQL nào đang làm nghẽn hệ thống — thứ mà htop chỉ cho biết CPU 100% nhưng không bao giờ nói rõ nguyên nhân.

Giám sát WordPress với InitTop: Từ MySQL monitoring đến full-stack observability

Ở bài giới thiệu trước, chỉ nói về cách cài đặt và các tính năng cơ bản. Trong bài này, sẽ đi sâu vào v1.1.0 — phiên bản mang InitTop từ một “công cụ nhìn” lên thành một profiler và action center thực sự cho WordPress. Nội dung bao gồm Query History, Export Slow Log, JSON mode, và cách biến InitTop thành một mảnh ghép trong hệ thống giám sát full-stack.

WordPress + MySQL: Cặp bài trùng và điểm nghẽn ẩn

WordPress là CMS chiếm hơn 40% web toàn cầu, và hầu hết đều chạy trên MySQL hoặc MariaDB. Vấn đề là: khi plugin bị lỗi, transient cache bị bloat, hoặc một cron job nào đó chạy query không tối ưu, sẽ không bao giờ biết chính xác điều gì đang xảy ra chỉ bằng htop hay mysql -e "SHOW PROCESSLIST".

InitTop v1.1.0 giải quyết bài toán này bằng cách cung cấp:

  • Processlist real-time với phân loại màu theo mức độ nguy hiểm.
  • Query History — phát hiện query lặp lại ngay trong session.
  • EXPLAIN inline — tối ưu query ngay trên terminal.
  • Kill query — giải cứu site đang đơ mà không cần restart MySQL.
  • Export slow log — ghi nhận bằng chứng để phân tích sau.
  • JSON mode — tích hợp với cron, log parser, hoặc monitoring stack.

InitTop v1.1.0 có gì mới?

Trước khi đi vào use case WordPress, đây là danh sách tính năng mới trong v1.1.0:

Phím / Flag Tính năng Ý nghĩa với WordPress
W Export slow queries ra file log Lưu lại query chậm để phân tích sau, hoặc gửi cho developer plugin
H Query History overlay Phát hiện query lặp lại — thường là dấu hiệu plugin bị lỗi vòng lặp
C Clear query history Reset session khi bắt đầu debug một tình huống mới
Mouse click Select row trực tiếp Không cần nhớ PID, click đúng query muốn kill
Mouse dblclick Auto EXPLAIN Nhanh chóng xem execution plan của query đang chọn
--json Non-interactive JSON output Tích hợp với cron, script, hoặc log aggregator
--no-color Monochrome mode Chạy trên terminal cơ bản hoặc khi pipe output
Sparkline QPS Biểu đồ QPS 30 giây gần nhất Nhìn ra pattern traffic spike hoặc DDoS nhỏ

Scenario thực tế: WordPress đột ngột chậm

Hãy tưởng tượng website đột nhiên đơ, không vào được admin. SSH vào VPS, chạy InitTop.

Bước 1: Quan sát tổng quan

Ngay dòng đầu tiên, sẽ thấy:

MySQL 8.0.36  |  Uptime 12:34:56  |  MaxConn 151  |  SlowAt >=1.0s  |  QPS  245.3  ▁▂▃▄▅▆▇█

QPS đột ngột từ 15 lên 245? Sparkline hiển thị một cột “█” cuối cùng — đây là dấu hiệu traffic spike hoặc một process nào đó đang bombard database.

Bước 2: Phát hiện thủ phạm bằng màu sắc

Trong danh sách processlist, sẽ thấy một dòng RED bold:

PID     USER    DB              CMD     TIME    STATE           QUERY
48291   wp_user wp_database     Query   8.2     Sending data    SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_type = 'product' AND ...

TIME = 8.2 giây, màu đỏ. Đây là query đang làm nghẽn hệ thống. Nhưng đó chỉ là một query. Nhấn HQuery History — sẽ thấy:

 COUNT   SLOW   QUERY
   147     12   SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_type = 'product' AND ...

Query này đã xuất hiện 147 lần trong session, 12 lần bị đánh dấu slow. Đây không phải lỗi một lần — đây là một plugin WooCommerce hoặc một đoạn code trong theme đang chạy trong vòng lặp. Query lặp lại liên tục là dấu hiệu điển hình của N+1 query problem trong WordPress.

Bước 3: EXPLAIN ngay trên terminal

Di chuyển xuống query đó, nhấn e. InitTop hiển thị overlay:

 EXPLAIN output - any key to close
  select_type=SIMPLE  type=ALL  possible_keys=NULL  key=NULL  key_len=NULL  ref=NULL  rows=45231  Extra=Using where

type=ALLkey=NULL — đây là full table scan trên bảng wp_posts với 45,231 rows. Plugin đang query mà không dùng index. Cần thêm composite index trên (post_type, post_status), hoặc tối ưu lại logic query.

Bước 4: Giải cứu tạm thời bằng Kill Query

Trong lúc chờ fix code, không muốn site tiếp tục đơ. Chọn query, nhấn K (chữ hoa). InitTop gửi lệnh KILL QUERY 48291. Query bị dừng ngay lập tức, CPU giảm, site thở được.

Bước 5: Export bằng chứng để phân tích sau

Nhấn W để export toàn bộ slow queries hiện tại ra file:

# InitTop export — 2026-07-01 14:32:15  QPS=245.3
# Slow threshold: 3s
# Processes: 47  Slow: 12
# PID=48291  USER=wp_user  DB=wp_database  TIME=8.2s  STATE=Sending data
SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_type = 'product' AND ...

File này được append vào inittop_slow.log (hoặc path chỉ định qua --log-file). Có thể dùng nó để:

  • Gửi cho developer/theme support.
  • Phân tích bằng pt-query-digest nếu cần.
  • Lưu vào ticket để theo dõi regression sau khi fix.

Giám sát định kỳ với JSON Mode

Tính năng interactive TUI của InitTop rất mạnh khi đang online. Nhưng để biến InitTop thành một phần của hệ thống giám sát, cần JSON mode.

Chạy snapshot định kỳ qua cron

# Mỗi 5 phút, ghi snapshot JSON vào log
*/5 * * * * MYSQL_PWD=your_password /usr/local/bin/inittop -u root -S /run/mysqld/mysqld.sock --json --json-count=1 --interval=2 >> /var/log/inittop.jsonl 2>/dev/null

Output mỗi dòng là một object JSON hoàn chỉnh:

{
  "ts": "2026-07-01T14:35:22",
  "version": "8.0.36",
  "uptime_sec": 45231,
  "qps": 245.3,
  "connections": {
    "connected": 47,
    "running": 12,
    "slow": 3,
    "locked": 0
  },
  "buffer_pool": {
    "size_mb": 1024,
    "hit_pct": 98.5,
    "used_pct": 82.3
  },
  "processes": [...]
}

Với dữ liệu này, có thể:

  • Parse bằng Python/Node để gửi alert qua Telegram/Slack khi slow > 5 hoặc hit_pct < 90.
  • Đẩy vào Loki hoặc Elasticsearch nếu đã có log stack.
  • Vẽ biểu đồ đơn giản bằng script Python với matplotlib — không cần Prometheus phức tạp.

Script alert đơn giản

#!/bin/bash
# /usr/local/bin/inittop-alert.sh
export MYSQL_PWD="your_password"
/usr/local/bin/inittop -u root -S /run/mysqld/mysqld.sock --json --json-count=1 | python3 -c "
import sys, json
data = json.loads(sys.stdin.readline())
slow = data['connections']['slow']
locked = data['connections']['locked']
hit = data['buffer_pool']['hit_pct']
if slow > 3 or locked > 0 or hit < 90:
    print(f'[ALERT] InitTop: slow={slow}, locked={locked}, buffer_hit={hit}%')
"

Chạy script này qua cron mỗi phút — vừa có một hệ thống alerting tự động mà không cần cài thêm bất kỳ agent nào khác.

Full-stack observability: InitTop là mảnh ghép nào?

“Full-stack observability” nghe sang chảnh, nhưng với WordPress self-hosted, nó chỉ đơn giản là có thể nhìn thấy toàn bộ chuỗi từ request đến phản hồi. InitTop chiếm vị trí ở tầng database.

Mô hình 3 tầng giám sát cho WordPress

Tầng Công cụ InitTop đóng vai trò gì?
Web Server Nginx/Apache access log, goaccess Biết request nào đến, nhưng không biết query nào chậm
Application PHP-FPM status, Query Monitor (WP plugin) Query Monitor rất tốt, nhưng cần WP admin load được. Khi site đơ, không vào được admin.
Database InitTop Chạy độc lập, không phụ thuộc WordPress, giám sát real-time ngay cả khi site đã chết.

Khi kết hợp cả ba, có thể trace một vấn đề như sau:

  1. Goaccess cho thấy spike 500 errors từ IP X.
  2. PHP-FPM log cho thấy request timeout sau 30 giây.
  3. InitTop cho thấy query từ user wp_user đang Sending data 28 giây trên bảng wp_postmeta — full table scan.
  4. EXPLAIN xác nhận thiếu index trên meta_key.
  5. Kill query để site sống lại, export log để fix sau.

Đó là full-stack observability thực sự — không cần Datadog, không cần New Relic, chỉ cần terminal và log.

Buffer Pool và Connections: Đọc đúng để hành động đúng

Ngoài processlist, InitTop v1.1.0 hiển thị hai chỉ số quan trọng mà mọi admin WordPress nên hiểu:

Buffer Pool Hit Rate

Tỷ lệ này cho biết MySQL đọc dữ liệu từ RAM (buffer pool) thay vì đọc từ disk. Với WordPress:

  • ≥ 99%: Tuyệt vời. Buffer pool đủ lớn cho toàn bộ dataset.
  • 95–98%: Tạm ổn. Có thể cần tăng innodb_buffer_pool_size nếu site lớn.
  • < 95%: Cảnh báo. Disk I/O đang là bottleneck. WooCommerce với hàng nghìn sản phẩm sẽ rất chậm.

InitTop hiển thị hit rate bằng thanh tiến trình màu: xanh → vàng → đỏ. Không cần nhớ số, nhìn màu là biết.

Buffer Pool Used %

Nếu thanh này đầy (>90%), MySQL sẽ bắt đầu đuổi dữ liệu cũ ra khỏi RAM. Với WordPress có nhiều plugin, bảng wp_optionswp_postmeta thường rất lớn — dễ làm đầy buffer pool.

Connections

  • Connected: Số kết nối hiện tại. Nếu gần max_connections (thường 151), WordPress sẽ báo lỗi “Error establishing a database connection”.
  • Running: Số query đang thực thi. Nếu Running cao nhưng QPS thấp, có nghĩa là các query đang bị treo.
  • Slow: Số query vượt ngưỡng. Chỉ số này nhấp nháy đỏ là lúc cần hành động ngay.
  • Locked: Số query đang bị khóa bảng. MyISAM hoặc các operation ALTER TABLE không tối ưu sẽ gây ra lock cascade.

Mouse Support: Terminal cũng có thể “click”

Một điểm nhỏ nhưng rất thực dụng trong v1.1.0: InitTop hỗ trợ chuột trên các terminal như iTerm2, GNOME Terminal, và cả Windows Terminal qua SSH.

  • Click vào một dòng để select query đó — không cần dùng phím mũi tên.
  • Double-click để auto EXPLAIN query đang chọn.

Điều này đặc biệt hữu ích khi đang screen-share với khách hàng hoặc đồng nghiệp. Họ thấy click đúng query, double-click xem EXPLAIN — rất trực quan.

InitTop so với các công cụ khác: Góc nhìn WordPress

Công cụ Điểm mạnh Điểm yếu với WordPress
Query Monitor (WP Plugin) Chi tiết, hiển thị hook, query, HTTP API Chỉ chạy khi WP load được. Khi site đơ vì MySQL nghẽn, plugin này không giúp được.
mytop / innotop Quen thuộc với DBA Perl-based, cài đặt phức tạp, giao diện lỗi thời, không có query history hay export.
Percona Toolkit Rất mạnh cho DBA chuyên nghiệp Quá nặng, quá nhiều tool, learning curve cao. Không phù hợp cho admin WordPress cần giải quyết nhanh.
InitTop v1.1.0 Zero dependency, Python 3, TUI hiện đại, có action (kill, explain, export, history) Chỉ giám sát MySQL/MariaDB, không can thiệp PHP hay Nginx.

InitTop không thay thế Query Monitor — nó bổ sung cho Query Monitor. Khi WordPress còn sống, Query Monitor giúp debug theme/plugin. Khi WordPress đã chết vì database, InitTop là công cụ duy nhất cần mở.

Workflow khuyến nghị cho admin WordPress

Đây là quy trình áp dụng cho các site Init Manga và WordPress khách hàng:

  1. Cài đặt InitTop ngay khi triển khai server (đã tích hợp trong InitOps).
  2. Để TUI chạy trong tmux/screen khi đang bảo trì hoặc deploy update lớn.
  3. Setup cron với --json để ghi snapshot mỗi 5 phút.
  4. Viết script parser đơn giản để alert khi slow query > 3 hoặc buffer hit < 95%.
  5. Khi incident xảy ra:
    • Mở InitTop → quan sát màu sắc.
    • Nhấn H để xem query lặp lại.
    • e để EXPLAIN query nghi ngờ.
    • K để kill nếu cần giải cứu ngay.
    • W để export log trước khi thoát.
  6. Sau incident: dùng slow log để thêm index, tối ưu plugin, hoặc liên hệ developer.

Kết luận

InitTop v1.1.0 không chỉ là một công cụ “nhìn” MySQL nữa. Với Query History, Export Slow Log, EXPLAIN inline, Kill query, và JSON mode, nó đã trở thành một profiler và action center thực sự cho WordPress.

Điều quan trọng nhất: nó vẫn giữ nguyên triết lý của Init HTML — self-contained, minimal dependency, chạy trên mọi terminal. Không cần cài đặt một stack monitoring phức tạp chỉ để biết tại sao website WordPress đang đơ.

Nếu đã dùng InitOps để deploy server, InitTop đã sẵn sàng. Nếu chưa, một dòng lệnh là đủ.

Lệnh cài đặt nhanh

curl -sSL https://inithtml.com/inittop/install.sh | bash

Tham khảo nhanh phím tắt v1.1.0

  • ↑ / ↓ — Di chuyển giữa các process.
  • K — Kill query đang chọn.
  • e — EXPLAIN query đang chọn (chỉ SELECT).
  • / — Lọc processlist.
  • ESC — Xóa bộ lọc hoặc đóng overlay.
  • s — Chuyển đổi cột sắp xếp.
  • p — Tạm dừng / tiếp tục auto-refresh.
  • r — Refresh ngay lập tức.
  • W — Export slow queries ra file log.
  • H — Xem Query History overlay.
  • C — Xóa Query History.
  • ? — Mở màn hình trợ giúp.
  • q — Thoát InitTop.

Bình luận


  • Không có bình luận.

Công cụ trực tuyến

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...