Search
Categories
CASE STUDY: QUÁ TRÌNH PHÂN TÍCH VÀ TỐI ƯU WEBSITE WORDPRESS BỊ CHẬM
Trước tiên, cần đo lường thời gian xử lý trang index.php trước đã. Lưu lại để làm xong còn đối chiếu xem mình tối ưu wordpress có hiệu quả hay không.
Áp dụng phương pháp tương tự đã trình bày trong bài: “Tôi đã tối ưu WordPress nhanh hơn 18 lần như thế nào”, mình check xử lý PHP trực tiếp không đi qua Web Server bằng lệnh:
—–
time php index.php
—–
Thời gian xử lý dao động vào khoảng 30s-40s. Quá chậm, như này mà không xử lý được thì toang thật.
-
RAM: còn dư nhiều.
-
Load Average: Load cao hơn số core của VPS hiện có => đang bị quá tải (thiếu CPU)
-
IO ổ cứng thì ổn, đạt chuẩn tốc độ SSD.
-
VPS chạy mô hình Reverse Proxy (nginx + apache), trong đó sử dụng Apache chạy mod_php để xử lý PHP. Lệnh “top” cho thấy process httpd thường xuyên chiếm 100% CPU.
-
Kết quả thống kê CPU của lệnh top cho thấy CPU được phân bổ vào %us (user) và %sy (system) => Có thể loại bỏ nguyên nhân chậm do IO (vì %iowait không cao) và các vấn đề khác liên quan interrupt (do %si thấp).
Sau 30s làm quen, nắm tình hình tổng quan hệ thống cần tối ưu wordpress của khách hàng như sau:
-
Hệ thống đang bị qúa tải CPU, chủ yếu là ở phần xử lý ở user space và các system call của hệ thống. Nhiệm vụ ta cần phải phân tích và tìm cách tối ưu chỗ này.
-
Hệ thống sử dụng mod_php (Apache2Handler), mỗi request đến file PHP sẽ được handle bởi 1 process httpd. Trường hợp nếu chạy chiến dịch marketing, traffic đổ về nhiều và CÙNG LÚC thì sẽ có nhiều process httpd được sinh ra => dẫn đến tình trạng hết RAM => server xử lý chậm => task dồn vào queue nhiều => load cao, delay cao.
-
Process httpd khi handle request của người dùng cắn 100% CPU và thời gian xử lý khá lâu. Đây có lẽ là nút thắt quan trọng nhất cần phải gỡ. Vì khi httpd handle request người dùng nhanh sẽ giúp hạn chế số lượng process httpd được sinh ra. Điều này giúp giảm lượng RAM, CPU sử dụng và giảm delay của người dùng.
Sau khi khoanh vùng, mình tiến hành xem chi tiết cách hệ thống đang xử lý 1 file PHP. Kiểm tra mặt system call trước, chạy strace để thống kê sơ bộ khi xử lý 1 file PHP thì các system call được gọi như thế nào:
—-
strace -c php index.php
—-
Theo man page của Linux thì “gettimeofday” sẽ trả về: “number of seconds and microseconds since the Epoch”
Có lẽ nào “W3 Total Cache” gọi hàm này để check xem các file cache có hết hạn hay chưa để update file mới, site to thế này nên việc có nhiều file cache sẽ khiến system call này được gọi nhiều lần, hợp lý quá mà.
Nhảy ngay vào source code grep “gettimeofday” xác nhận lại xem sao. Kết qủa trả về chỉ có plugins “w3total_cache” sử dụng hàm này. (Hình 2)
Quá rõ ràng, game hôm nay dễ thế, end game thôi! Vào wp-admin tắt debug của w3total cache là xong!
Tại sao lại như vậy nhỉ?
Nghi ngờ khách hàng tắt chưa đúng, mình xin account admin vào để tự tay mình tắt cho chắc chắn rồi thử lại. Kết quả vẫn như cũ: system call “gettimeofday” vẫn được gọi 1,3tr lần khi xử lý PHP, performance không được cải thiện và delay vẫn như cũ.
Điên máu, mìn move luôn thư mục w3total cache ra khỏi plugins để tạm thời disable nó. Kết quả vẫn không thay đổi! Tại sao?
Mình đã quá vội vàng và xử lý theo suy nghĩ cảm tính trong khi chưa xem xét kỹ các bằng chứng kỹ thuật khác.
Quay lại strace process PHP và xem xét kỹ kết quả, mình chợt nhận ra:
—–
strace -o output.txt php index.php
—–
Đặc điểm này giống hệt với cách ghi debug log, kiên nhẫn xem kỹ hơn tôi thấy sự xuất hiện của một nhân tố mới: “NewRelic”.
Điểm này rất đáng để xem xét, vì theo những thông tin thu thập được, tôi khá chắc chắn rằng “gettimeofday” có liên quan mật thiết đến tính năng debug nào đó.
Tìm thêm thông tin về Xdebug
Mình đã nhìn thấy hình ảnh hệ thống hiện tại trong đấy rồi :)). Tắt extension này và thử lại (Hình 7)
Thời gian xử lý đã rút ngắn xuống chỉ còn vài giây.
Tuy nhiên, kết quả trên vẫn chưa cho phép mình dừng lại khi thấy strace thống kê “lstat”, “open” và “fstat” là những system call top đầu được gọi.
Vì điều này cho thấy việc truy cập file của hệ thống chưa được tối ưu. Tình huống lúc này tương tự như bài “Tôi đã tối ưu WordPress nhanh hơn 18 lần như thế nào”
Mình tiến hành nâng cấp lên PHP 7.2 kèm theo Opcache cho họ. Kết quả (Hình 
-
Giảm thời gian xử lý từ 40s xuống 0.5s
-
Giảm được “1,351,675” lệnh thừa khi xử lý PHP (Hình 9)
-
Hệ thống đã ổn định và tin cậy, tự tin phục vụ cho các chiến dịch marketing.
Case của: Nguyễn Hưng – Bo Vietnix
01.
