WordPress Performance Observability: Giám Sát TTFB, Query, Cache Và PHP-FPM Cho Production

WordPress performance observability là cách biến cảm giác “site chậm” thành số liệu vận hành cụ thể: TTFB, latency PHP-FPM, slow query MySQL, cache hit ratio, lỗi 5xx, cron backlog và thời gian phản hồi theo từng URL. Với website production, tối ưu hiệu năng không nên bắt đầu bằng cài thêm plugin cache, mà bằng đo đúng điểm nghẽn.

Runbook này dành cho sysadmin/DevOps quản trị WordPress: baseline trước khi tối ưu, instrument Nginx/Apache, PHP-FPM, MySQL/MariaDB, Redis object cache, WordPress cron, plugin/theme và alert. Mục tiêu là biết bottleneck nằm ở network, web server, PHP worker, database, object cache hay code ứng dụng.

1. Các chỉ số cần đo trước tiên

  • TTFB theo percentile P50/P95/P99, không chỉ trung bình.
  • HTTP status 5xx/4xx theo endpoint và upstream.
  • PHP-FPM active/idle process, queue length và slowlog.
  • MySQL slow query, lock wait, buffer pool hit ratio và connection usage.
  • Object cache hit/miss, eviction, memory và latency.
  • WordPress cron backlog và job chạy quá lâu.
  • CPU, RAM, disk I/O, network và inode trên server.

2. Baseline nhanh từ bên ngoài

URL="https://example.com/"
for i in {1..10}; do
  curl -o /dev/null -s -w "time_namelookup=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total} status=%{http_code}\n" "$URL"
done
curl -I https://example.com/ | egrep -i 'cache|cf-cache|x-cache|server|vary|age'

Nếu DNS/TLS/connect nhanh nhưng TTFB cao, vấn đề thường nằm ở origin: PHP, database, object cache hoặc plugin. Nếu total time cao trong khi TTFB ổn, hãy kiểm tra asset, CDN, ảnh và frontend.

3. Log Nginx có request time và upstream time

log_format wp_timing '$remote_addr $host "$request" $status rt=$request_time uct=$upstream_connect_time uht=$upstream_header_time urt=$upstream_response_time bytes=$body_bytes_sent';
access_log /var/log/nginx/wordpress_timing.log wp_timing;
awk '{for(i=1;i<=NF;i++) if($i ~ /^urt=/) print $i, $0}' /var/log/nginx/wordpress_timing.log | sort -nr | head -20

Nếu upstream_response_time cao, PHP-FPM hoặc backend đang chậm. Nếu request_time cao nhưng upstream thấp, có thể là client chậm, upload/download lớn hoặc buffering.

4. PHP-FPM status và slowlog

; /etc/php/8.2/fpm/pool.d/www.conf
pm.status_path = /fpm-status
request_slowlog_timeout = 5s
slowlog = /var/log/php8.2-fpm-slow.log
pm.max_children = 20
pm.max_requests = 500
  • Nếu listen queue tăng: thiếu worker hoặc request quá lâu.
  • Nếu max children reached: tối ưu code/query/cache trước khi tăng tài nguyên.
  • Nếu slowlog trỏ vào plugin cụ thể: kiểm tra hook, external API call hoặc query nặng.

5. MySQL/MariaDB slow query

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'ON';
mysqldumpslow -s t -t 20 /var/log/mysql/mysql-slow.log
pt-query-digest /var/log/mysql/mysql-slow.log | head -80

Với WordPress, bảng wp_options, wp_postmeta và query meta phức tạp thường là điểm nóng. Không index bừa trên production; hãy đo query, thử trên staging, backup database và ghi lại kế hoạch rollback.

6. Redis object cache: đo hit ratio thay vì chỉ bật plugin

redis-cli INFO stats | egrep 'keyspace_hits|keyspace_misses|evicted_keys|expired_keys'
redis-cli INFO memory | egrep 'used_memory_human|maxmemory_human|mem_fragmentation_ratio'
wp redis status || true

Object cache có ích khi database bị đọc lặp lại. Nhưng nếu Redis eviction liên tục hoặc hit ratio thấp, bạn có thể đang cache sai key, thiếu memory, plugin không tương thích hoặc cache bị flush quá thường xuyên.

7. WordPress cron và external API

wp cron event list --fields=hook,next_run_relative,recurrence --format=table
wp cron test
wp option get cron | head -c 1000

Cron backlog có thể làm admin chậm, gửi mail trễ hoặc tạo spike CPU. Với site nhiều traffic hoặc WooCommerce, nên tắt pseudo-cron bằng DISABLE_WP_CRON và chạy cron thật từ systemd timer hoặc crontab.

8. Alert tối thiểu cho production

  • TTFB P95 vượt 1.5-2 giây trong 10 phút.
  • HTTP 5xx tăng bất thường.
  • PHP-FPM listen queue > 0 hoặc max children reached.
  • MySQL Threads_running cao, slow query tăng hoặc disk I/O bão hòa.
  • Redis evicted_keys tăng, memory gần maxmemory.
  • Disk usage > 80%, inode usage > 80%.
  • Certificate sắp hết hạn và backup gần nhất quá cũ.

9. Quy trình điều tra khi site chậm

  • Xác nhận chậm từ ngoài bằng curl và nhiều URL khác nhau.
  • Kiểm tra 5xx và URL chậm nhất trong access log.
  • Xem PHP-FPM status: queue, active process, slowlog.
  • Xem MySQL slow query và lock.
  • Kiểm tra Redis hit/miss/eviction.
  • Tạm tắt plugin nghi ngờ trên staging hoặc ngoài giờ thấp điểm nếu có rollback.
  • Ghi lại trước/sau bằng số liệu, không chỉ cảm nhận.

10. Checklist nghiệm thu

  • Có dashboard TTFB, status code, PHP-FPM, MySQL, Redis và tài nguyên hệ thống.
  • Access log có request_time/upstream_response_time.
  • PHP-FPM slowlog bật với ngưỡng hợp lý.
  • Slow query log có rotation và quy trình review.
  • Object cache được đo hit ratio và eviction.
  • Cron production chạy bằng lịch hệ thống nếu cần ổn định.
  • Có runbook rollback khi thay đổi cache/plugin/PHP/database.
  • Có baseline sau mỗi lần deploy lớn.

Kết luận

WordPress performance observability giúp đội vận hành tối ưu bằng bằng chứng. Khi có số liệu từ Nginx, PHP-FPM, MySQL, Redis và WordPress cron, bạn sẽ biết nên chỉnh cache, tăng worker, tối ưu query, sửa plugin hay mở rộng hạ tầng. Điều quan trọng nhất là đo trước, thay đổi nhỏ, xác minh sau và lưu lại runbook để lần incident tiếp theo được xử lý nhanh hơn.

Tác giả: Mạnh Hoàng

Tôi là Hoàng Mạnh, người sáng lập blog SysadminSkills.com. Tôi viết về quản trị hệ thống, bảo mật máy chủ, DevOps và cách ứng dụng AI để tự động hóa công việc IT. Blog này là nơi tôi chia sẻ những gì đã học được từ thực tế – đơn giản, ngắn gọn và áp dụng được ngay.