WordPress CPU 100% dù website không có nhiều khách thường không phải do lượng người truy cập thực tế. Nguyên nhân có thể nằm ở bot tự động, wp-cron, admin-ajax.php, plugin/theme chạy tác vụ nặng, truy vấn database, REST API hoặc website đã bị mã độc cài tiến trình ngầm. Muốn xử lý đúng cần xác định request hoặc process nào đang tiêu thụ CPU trước khi tăng cấu hình server.
Nếu bạn đăng nhập hosting hoặc VPS và thấy CPU liên tục 80–100%, phản xạ đầu tiên thường là:
“Website có nhiều người truy cập nên server quá tải.”
Nhưng nếu website chỉ có vài chục hoặc vài trăm lượt truy cập mỗi ngày mà CPU vẫn thường xuyên lên 100%, cách giải thích này chưa đủ.
Một website WordPress ít khách vẫn có thể sử dụng rất nhiều tài nguyên nếu phía sau đang có hàng nghìn request tự động, cron chạy liên tục, plugin thực hiện tác vụ nặng, database bị truy vấn bất thường hoặc mã độc đang chạy trên server.
Theo kinh nghiệm của hungwordpress: CPU 100% không phải là nguyên nhân mà đó là một triệu chứng cần điều tra.
WordPress CPU 100% nhưng ít khách có bình thường không?
Không nên mặc định rằng đây là tình trạng bình thường.
CPU cao trong thời gian ngắn có thể xảy ra khi website thực hiện một tác vụ nặng như:
- Backup.
- Import/export sản phẩm.
- Tạo thumbnail.
- Cập nhật plugin/theme.
- WooCommerce xử lý dữ liệu.
- Chạy cron.
- Scan bảo mật.
- Xử lý hình ảnh.
- Tác vụ database lớn.
Nhưng nếu CPU thường xuyên đạt 100%, đặc biệt khi website gần như không có người dùng thực tế, cần tìm nguyên nhân.
WordPress có thể tự tạo các request nội bộ. Ví dụ, WordPress sử dụng loopback request để tự gọi lại website cho một số tác vụ như WP-Cron và kiểm tra khả năng hoạt động của plugin/theme.
Do đó:
Ít khách ≠ ít request đến server.
Đây là điểm rất nhiều chủ website bỏ qua.
Vì sao WordPress ít khách nhưng CPU vẫn 100%?
Có thể chia nguyên nhân thành 7 nhóm chính:
| Nguyên nhân | Khả năng gây CPU cao | Cần kiểm tra |
|---|---|---|
| Bot/crawler tự động | Cao | Access log, IP, User-Agent |
wp-cron.php |
Cao | Cron schedule, action |
admin-ajax.php |
Cao | Request AJAX |
| Plugin/theme lỗi hoặc nặng | Cao | PHP process, plugin |
| Database/query nặng | Cao | MySQL/MariaDB |
| REST API/request bất thường | Trung bình–cao | Access log/API |
| Malware/backdoor | Rất cao | File, process, request, database |
Điểm quan trọng là không nên xử lý tất cả trường hợp bằng cách nâng RAM hoặc CPU.
Nếu nguyên nhân là bot, bạn nâng CPU nhưng bot vẫn tiếp tục gửi request.
Nếu nguyên nhân là plugin lỗi, nâng CPU chỉ làm website chịu tải lâu hơn.
Nếu nguyên nhân là malware, nâng server không giải quyết được mã độc.
Phương án xử lý WordPress CPU 100% nhưng không có nhiều khách
Khi WordPress CPU 100% nhưng website không có nhiều khách, không nên nâng cấu hình server ngay. Hãy xác định thành phần nào đang tạo tải trước, sau đó xử lý theo đúng nguyên nhân. Dưới đây là quy trình thực tế có thể áp dụng từ mức đơn giản đến chuyên sâu.
1. Xử lý nhanh khi CPU đang 100%
Nếu website đang chậm hoặc không truy cập được, trước tiên cần giảm tải để website hoạt động trở lại, sau đó mới điều tra nguyên nhân.
Việc đầu tiên: kiểm tra process đang ăn CPU
Trên VPS Linux có thể kiểm tra:
top
hoặc:
htop
Nếu thấy nhiều process như:
php-fpm
php
mysqld
mariadbd
lsphp
đang chiếm CPU, chưa nên kết luận ngay.
Cần xác định process đó thuộc website nào và đang xử lý request gì.
Nếu server chạy nhiều website, đây là bước đặc biệt quan trọng vì một website có thể làm ảnh hưởng toàn bộ VPS.
2. Nếu bot đang gửi quá nhiều request: chặn ở lớp server/CDN
Nếu access log cho thấy một hoặc nhiều IP liên tục gọi:
/wp-login.php
/xmlrpc.php
/wp-cron.php
/wp-json/
/wp-admin/admin-ajax.php
thì không nên để toàn bộ request đi vào WordPress.
*Phương án xử lý:
Có thể triển khai theo thứ tự:
Cloudflare
↓
WAF / Rate Limit
↓
Web Server
↓
PHP
↓
WordPress
Mục tiêu là chặn request càng sớm càng tốt.
Ví dụ:
Bot
↓
Cloudflare chặn
↓
Không tới VPS
↓
PHP không phải xử lý
↓
CPU giảm
Đây hiệu quả hơn việc để bot đi xuyên qua Cloudflare rồi mới tìm cách xử lý trong WordPress.
*Không nên:
Không nên đưa IP vào blacklist hàng loạt mà không kiểm tra.
Bot có thể sử dụng rất nhiều IP khác nhau.
Trong trường hợp này nên kết hợp:
- Rate limiting.
- WAF.
- Bot detection.
- Challenge.
- Giới hạn request theo URL.
- Giới hạn request theo IP.
3. Nếu wp-login.php bị brute-force
Nếu log cho thấy:
POST /wp-login.php
POST /wp-login.php
POST /wp-login.php
liên tục, đây là trường hợp rất dễ gây tải PHP.
*Phương án xử lý:
Có thể áp dụng rate limit cho:
/wp-login.php
Ví dụ logic:
1 IP
↓
10–20 request/phút
↓
vượt ngưỡng
↓
Challenge / Block
Ngưỡng thực tế cần điều chỉnh theo website.
Nếu website chỉ có vài quản trị viên, có thể giới hạn mạnh hơn.
Có thể bổ sung
- 2FA cho tài khoản quản trị.
- Giới hạn quyền truy cập
/wp-admin. - Đổi URL đăng nhập không phải là biện pháp bảo mật chính.
- Kiểm tra tài khoản admin bất thường.
- Kiểm tra log đăng nhập.
Quan trọng: rate limit giúp giảm request nhưng không thay thế việc bảo vệ tài khoản.
4. Nếu xmlrpc.php bị abuse
Nếu website không sử dụng XML-RPC nhưng log cho thấy:
POST /xmlrpc.php
xuất hiện với tần suất cao, có thể cân nhắc vô hiệu hóa XML-RPC.
Trong WordPress có thể xử lý bằng filter:
add_filter( 'xmlrpc_enabled', '__return_false' );
Tuy nhiên, không nên áp dụng nếu website hoặc hệ thống bên ngoài thực sự cần XML-RPC.
Nếu vẫn cần XML-RPC
Không nên tắt hoàn toàn.
Thay vào đó có thể:
- Rate limit.
- WAF.
- Giới hạn IP.
- Theo dõi request.
- Chặn các pattern abuse.
5. Nếu wp-cron.php chạy quá nhiều
Nếu xác định CPU cao liên quan tới WP-Cron, hãy kiểm tra cron trước khi tắt.
Có thể dùng WP-CLI:
wp cron event list
Để xem danh sách scheduled events.
Tìm các event:
failed
pending
recurring
hoặc một event xuất hiện với tần suất bất thường.
Nếu website có WP-Cron hoạt động quá thường xuyên
Một phương án phổ biến là chuyển sang system cron.
Trong wp-config.php:
define( 'DISABLE_WP_CRON', true );
Sau đó cấu hình cron hệ thống gọi:
wp cron event run --due-now
hoặc cơ chế cron phù hợp với server.
Nhưng đừng làm kiểu này
Tắt WP-Cron
↓
Không cấu hình system cron
↓
Xong
WooCommerce và các plugin có scheduled task có thể bị ảnh hưởng.
6. WooCommerce Scheduled Actions
WooCommerce có hệ thống Scheduled Actions để xử lý các tác vụ nền.
Nếu có hàng nghìn action pending hoặc failed, cần tìm nguyên nhân.
Có thể kiểm tra bằng WP-CLI:
wp action-scheduler list --status=pending
và:
wp action-scheduler list --status=failed
Nếu có một loại action xuất hiện với số lượng rất lớn, cần xác định plugin nào tạo ra nó.
Không nên chỉ xóa hàng loạt
Ví dụ:
10.000 pending actions
↓
DELETE ALL
có thể làm mất các tác vụ thực sự cần thiết.
Tốt hơn là:
Action
↓
Plugin tạo action
↓
Kiểm tra nguyên nhân
↓
Sửa plugin/configuration
↓
Xử lý backlog
7. Nếu admin-ajax.php gây CPU cao
Đây là trường hợp cần điều tra kỹ.
Không nên chặn:
/wp-admin/admin-ajax.php
toàn bộ.
Hãy tìm action đang được gọi.
Có thể xem request trong:
- Browser DevTools.
- Access log.
- Query Monitor.
- Application log.
Ví dụ:
admin-ajax.php?action=product_filter
Nếu request này xuất hiện hàng nghìn lần, hãy tìm plugin/theme tạo action đó.
Các hướng xử lý:
Trường hợp 1: request quá thường xuyên
Giảm tần suất JavaScript gọi AJAX.
Trường hợp 2: query quá nặng
Tối ưu query/database.
Trường hợp 3: bot gọi AJAX
Chặn bot/rate limit.
Trường hợp 4: plugin lỗi
Cập nhật hoặc thay thế plugin.
Trường hợp 5: chức năng không cần thiết
Tắt chức năng đó thay vì tắt toàn bộ AJAX.
8. Nếu plugin gây CPU cao: khoanh vùng thay vì tắt bừa
Một trong những cách nhanh nhất để tìm plugin gây tải là so sánh trước và sau khi vô hiệu hóa plugin nghi ngờ.
Nhưng với website production, không nên:
Tắt 30 plugin cùng lúc
vì sau đó không biết plugin nào gây vấn đề.
Nên làm:
Xác định request
↓
Xác định hook/action
↓
Xác định plugin
↓
Test plugin
↓
Đo CPU
Có thể sử dụng Query Monitor:
Query Monitor giúp kiểm tra:
- Database queries.
- Slow queries.
- HTTP API calls.
- Hooks/actions.
- PHP errors.
- Scripts/styles.
Nếu phát hiện một plugin tạo rất nhiều query hoặc HTTP request, đó là dấu hiệu cần điều tra tiếp.
9. Nếu database là nguyên nhân
Nếu CPU MySQL/MariaDB cao, cần kiểm tra query.
Có thể sử dụng:
SHOW FULL PROCESSLIST;
để xem các query đang chạy.
Nếu server có slow query log, nên bật và phân tích các query chạy lâu.
Một số dấu hiệu đáng chú ý
SELECT ...
FROM wp_postmeta
với lượng dữ liệu lớn.
Hoặc:
ORDER BY
LIKE '%keyword%'
trên bảng lớn.
Hoặc query được thực hiện hàng trăm lần trong một request.
Hướng xử lý
Tùy nguyên nhân:
- Thêm index phù hợp.
- Giảm số query.
- Sửa WP_Query.
- Cache dữ liệu.
- Loại bỏ query dư thừa.
- Dọn dữ liệu không cần thiết.
- Tối ưu bảng.
- Thay plugin.
- Tách tác vụ nặng sang background job.
Không nên tự thêm index hàng loạt nếu chưa phân tích query và execution plan.
10. Nếu website có hàng nghìn sản phẩm
Với WooCommerce lớn, cần đặc biệt chú ý:
wp_posts
wp_postmeta
wp_wc_orders
wp_wc_product_meta_lookup
và các bảng liên quan tới plugin đang sử dụng.
Một chức năng tìm kiếm/lọc sản phẩm có thể tạo tải lớn nếu mỗi request phải:
Load WordPress
↓
Query hàng nghìn sản phẩm
↓
Query metadata
↓
Query taxonomy
↓
Sort
↓
Render
Hướng xử lý:
Có thể xem xét:
- Tối ưu product lookup.
- Tối ưu query filter.
- Giảm số query.
- Cache kết quả.
- Sử dụng object cache.
- Redis nếu kiến trúc phù hợp.
- Tối ưu search/filter.
- Tách các tác vụ import/export khỏi request của người dùng.
11. Nếu PHP-FPM bị đầy worker
Nếu PHP-FPM có quá nhiều process, cần kiểm tra pool configuration.
Một số tham số quan trọng:
pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
Nhưng không nên tăng pm.max_children một cách máy móc.
Ví dụ:
CPU yếu
↓
PHP worker tăng
↓
Concurrent request tăng
↓
CPU tiếp tục 100%
Bạn có thể biến một vấn đề nhỏ thành tình trạng server quá tải nghiêm trọng hơn.
Cách tiếp cận tốt hơn
Xác định:
PHP worker đầy vì sao?
Có thể là:
- Request quá nhiều.
- Query quá chậm.
- External API chậm.
- Plugin chạy lâu.
- Bot.
- Malware.
Sau đó mới điều chỉnh PHP-FPM.
12. Nếu có HTTP API bên ngoài gây treo PHP
Một plugin có thể gọi API:
Website
↓
PHP
↓
External API
↓
Chờ response
Nếu API bên ngoài chậm, PHP worker có thể bị giữ lâu.
Cần kiểm tra:
- HTTP API calls.
- Timeout.
- Retry.
- Số lần gọi.
- Plugin thực hiện request.
Cách xử lý
Thiết lập timeout hợp lý:
connect timeout
request timeout
retry limit
và tránh gọi API bên ngoài trong mỗi page request nếu không cần thiết.
Có thể chuyển tác vụ sang:
Cron
Queue
Background process
13. Nếu nghi ngờ malware: dừng tối ưu và chuyển sang xử lý bảo mật
Đây là tình huống không nên dùng cache để “che” vấn đề.
Nếu phát hiện:
PHP file lạ
Cron lạ
Admin user lạ
Redirect
SEO spam
Link cá độ
Backdoor
Shell
hãy ưu tiên điều tra bảo mật.
Quy trình nên làm:
Backup / Snapshot
↓
Bảo toàn log
↓
Kiểm tra user
↓
Kiểm tra file thay đổi
↓
Kiểm tra plugin/theme
↓
Kiểm tra wp-config.php
↓
Kiểm tra database
↓
Kiểm tra cron
↓
Kiểm tra process
↓
Tìm backdoor
↓
Loại bỏ mã độc
↓
Đổi credentials
↓
Cập nhật hệ thống
↓
Kiểm tra lại
Đặc biệt không nên:
Chỉ chạy một plugin scan malware rồi kết luận:
“Website sạch.”
Scanner có thể bỏ sót backdoor được ngụy trang hoặc mã độc nằm trong database.
Nếu website từng bị cài link spam, cần kiểm tra cả:
- Database.
wp_options.- Post content.
- Widget.
- Custom fields.
- User metadata.
- Plugin settings.
- Theme files.
- Cron.
=> Xem thêm: Làm sao để bảo mật website WordPress hiệu quả? Hướng dẫn chi tiết từ A đến Z
14. Nếu phát hiện bot nhưng không muốn dùng Cloudflare
Vẫn có thể xử lý tại web server.
Ví dụ có thể:
- Rate limit.
- Giới hạn connection.
- Chặn User-Agent rõ ràng là spam.
- Giới hạn request vào login.
- Giới hạn XML-RPC.
- Chặn các pattern URL rõ ràng bất thường.
Nhưng cần hiểu:
Chặn ở web server vẫn tốt hơn để request đi vào PHP.
Ví dụ:
Bot
↓
Nginx/Apache/LSWS
↓
BLOCK
tốt hơn:
Bot
↓
WordPress
↓
PHP
↓
Plugin
↓
Database
↓
BLOCK
Vì ở cách thứ hai, CPU đã bị tiêu tốn trước khi request bị từ chối.
15. Nếu website đang dùng LiteSpeed
Với LiteSpeed/OpenLiteSpeed, cần kiểm tra:
- PHP process.
- External app.
- Request.
- Cache hit/miss.
- Error log.
- Access log.
- Connection.
- Worker.
Nếu website dùng LiteSpeed Cache, không nên chỉ nhìn vào việc:
“Cache đã bật.”
Mà cần kiểm tra cache có thực sự HIT hay không.
Nếu phần lớn request vẫn:
MISS
↓
PHP
↓
WordPress
thì việc bật cache chưa chắc giải quyết được CPU.
16. Nếu website dùng Cloudflare
Có thể kiểm tra:
Traffic
Bot
Firewall Events
Rate Limiting
Origin requests
Mục tiêu là xác định:
Bao nhiêu request bị chặn ở Cloudflare?
Bao nhiêu request vẫn tới origin?
URL nào bị gọi nhiều?
IP nào bất thường?
Sau đó tạo rule phù hợp.
Ví dụ:
/wp-login.php
có thể áp dụng rate limit.
Hoặc các URL không tồn tại liên tục:
/random-url-1
/random-url-2
/random-url-3
có thể điều tra bot/scraper trước khi quyết định chặn.
17. Nếu CPU chỉ cao vào một thời điểm cố định
Trường hợp này rất đáng chú ý.
Ví dụ:
02:00 → CPU 100%
03:00 → bình thường
hoặc:
12:00 → CPU 100%
13:00 → bình thường
Hãy tìm cron hoặc scheduled task.
Ví dụ:
02:00 Backup
02:05 Image optimization
02:10 Database cleanup
02:20 WooCommerce action
Nhiều tác vụ nặng chạy cùng lúc có thể tạo CPU spike.
Phương án
Thay vì:
02:00
Backup
Import
Scan
Optimize
Cleanup
có thể phân tán:
01:00 Backup
02:00 Scan
03:00 Cleanup
04:00 Optimization
Mục tiêu là tránh nhiều tác vụ nặng chạy đồng thời.
18. Khi nào nên nâng CPU/RAM?
Sau khi đã kiểm tra root cause.
Ví dụ:
Bot đã kiểm soát
Plugin đã tối ưu
Cron đã xử lý
Query đã tối ưu
Cache đã hoạt động
Malware không có
nhưng:
Traffic thật tăng
Concurrent request tăng
CPU vẫn cao
RAM gần đầy
thì lúc này nâng tài nguyên là hợp lý.
Có thể cân nhắc:
- Tăng vCPU.
- Tăng RAM.
- Chuyển VPS mạnh hơn.
- Tối ưu PHP-FPM.
- Redis/Object Cache.
- Database server tốt hơn.
- Tách database.
- CDN.
- Load balancing với hệ thống lớn.
Nâng server nên là bước tăng capacity sau tối ưu, không phải bước đầu tiên để đoán nguyên nhân.
19. Quy trình xử lý CPU 100% thực tế
Tôi khuyên dùng quy trình sau:
CPU 100%
↓
Kiểm tra top/htop
↓
PHP hay MySQL?
↓
Kiểm tra access log
↓
URL nào nhiều nhất?
↓
IP/User-Agent nào?
↓
Có bot?
↓ ↓
Có Không
↓ ↓
WAF/Rate PHP-FPM
Limit ↓
AJAX/API/Cron
↓
Plugin/Theme
↓
Database
↓
Malware
↓
Root Cause
↓
Fix
↓
Theo dõi CPU
↓
Tối ưu tiếp nếu cần
Đây là điểm quan trọng nhất:
Đừng hỏi “làm sao để CPU xuống 50%?” trước khi biết “thứ gì đang làm CPU lên 100%?”.
20. Sau khi xử lý phải đo lại
Một lỗi phổ biến là sửa xong rồi kết luận:
“Đã tối ưu.”
Cần đo lại.
Ví dụ:
| Chỉ số | Trước xử lý | Sau xử lý |
|---|---|---|
| CPU | 100% | 35% |
| PHP worker | 30 | 8 |
| Requests/phút | 1.500 | 250 |
| TTFB | 3,2s | 0,7s |
| MySQL CPU | 80% | 25% |
| 5xx | 15/phút | 0 |
Không nhất thiết mọi website đều đạt các con số trên. Điều quan trọng là có số liệu trước và sau để chứng minh thay đổi.
Plugin hỗ trợ kiểm tra và xử lý WordPress CPU 100%
Plugin không thể thay thế việc kiểm tra server, access log hoặc PHP-FPM. Tuy nhiên, với website WordPress, một số công cụ có thể giúp xác định plugin nào tạo query nặng, cron nào chạy bất thường, request nào gây tải hoặc database đang có vấn đề.
Nên chọn công cụ dựa trên nguyên nhân thay vì cài tất cả plugin cùng lúc.
| Công cụ | Dùng để làm gì? | Khi nào nên dùng? |
|---|---|---|
| Query Monitor | Phân tích PHP, database query, hooks, HTTP API | Khi nghi plugin/theme gây tải |
| WP Crontrol | Kiểm tra WP-Cron | Khi CPU tăng liên quan cron |
| Health Check & Troubleshooting | Kiểm tra lỗi và test plugin/theme | Khi cần khoanh vùng plugin |
| Wordfence | Kiểm tra bảo mật, malware, login | Khi CPU cao kèm dấu hiệu bị hack |
| WP-CLI | Quản trị và kiểm tra WordPress bằng command line | Khi có SSH/VPS |
| Redis Object Cache | Object caching | Khi database/query là bottleneck và server phù hợp |
WordPress CPU 100% không phải lúc nào cũng cần nâng server
Nếu WordPress ít khách nhưng CPU liên tục 100%, hãy xử lý theo thứ tự:
1. Xác định process → 2. Xác định request → 3. Xác định plugin/task → 4. Kiểm tra database → 5. Kiểm tra bảo mật → 6. Sửa root cause → 7. Đo lại → 8. Cuối cùng mới cân nhắc nâng server.
Trong thực tế, một website có thể giảm tải đáng kể chỉ bằng cách:
- Chặn bot ở lớp WAF.
- Rate limit login/XML-RPC.
- Sửa cron chạy lặp.
- Xử lý scheduled actions.
- Sửa AJAX request.
- Tối ưu query.
- Thay plugin gây tải.
- Xử lý malware.
Vì vậy, WordPress CPU 100% không nên được xử lý bằng một công thức duy nhất.
Mỗi website cần dựa trên log và số liệu để xác định nguyên nhân.
Khi nào nên kiểm tra chuyên sâu?
Nếu bạn đã:
- Bật cache.
- Tắt bớt plugin.
- Tối ưu hình ảnh.
- Nâng PHP.
- Tăng CPU.
nhưng CPU vẫn 100%, thì vấn đề có thể không nằm ở tốc độ frontend.
Lúc này cần kiểm tra server + PHP + database + request + cron + bảo mật.
HungWordPress có thể xử lý theo hướng:
Phân tích nguyên nhân → truy vết request → xử lý bottleneck → kiểm tra malware nếu cần → tối ưu WordPress → theo dõi lại tài nguyên.
Mục tiêu không phải đơn giản là làm CPU giảm trong vài phút, mà là xử lý nguyên nhân khiến CPU tăng trở lại.
Liên hệ ngay với chúng tôi qua các kênh dưới đây, đội ngũ sẽ phản hồi nhanh nhất có thể.
