WordPress站点mysqld进程CPU占用过高问题求助
兄弟,2435%的MySQL CPU占用确实够吓人的——哪怕你有32线程的双Xeon,这也把绝大多数核心都吃满了。结合你这50万文章的WP大站配置,给你一步步捋排查和解决的思路:
第一步:先抓出MySQL里的“罪魁祸首”
首先得搞清楚到底是哪些查询在疯狂耗CPU:
- 直接登录MySQL,执行
SHOW FULL PROCESSLIST;,看有没有长时间运行的查询、锁等待或者重复刷出来的高频查询。如果列表刷得太快抓不住,就临时开慢查询日志:
等个5-10分钟,用SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; -- 把执行超过1秒的查询全记录下来 SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-queries.log';mysqldumpslow -s t /var/log/mysql/slow-queries.log分析慢查询,重点看那些执行时间长、调用次数多的SQL——大概率是WP插件/主题生成的低效查询,或者没加索引的表操作。
第二步:排查WordPress专属问题
50万文章的WP站,最容易出问题的就是插件和数据库索引:
- 低效插件/主题查询:很多统计、SEO类插件会反复查
wp_posts、wp_postmeta表,而且不带索引。比如用meta_key做筛选却没建索引,你可以先查下wp_postmeta的索引情况:
如果没有SHOW INDEX FROM wp_postmeta;meta_key+post_id的联合索引,赶紧补上:CREATE INDEX idx_postmeta_key_post ON wp_postmeta (meta_key, post_id); - 失控的WP Cron:有些插件的定时任务会批量跑全站点查询(比如全量索引、数据同步),用WP-CLI执行
wp cron event list看看有没有高频执行的可疑任务,先临时禁用试试。 - 缓存失效:如果WP缓存(比如WP Rocket、W3 Total Cache)没配置好,缓存过期太频繁,会导致MySQL反复处理相同请求。检查缓存规则,确保静态页、归档页都被正确缓存,尽量减少动态查询。
第三步:给MySQL配置“松绑”
你的服务器有128G内存,但当前MySQL实际只用了7.6G左右(68.666g是虚拟内存,实际驻留内存是7.596G),完全可以调整配置榨出性能:
- 编辑Debian 8的MySQL配置文件(一般是
/etc/mysql/mysql.conf.d/mysqld.cnf),调整这些关键参数:
改完重启MySQL:[mysqld] innodb_buffer_pool_size = 64G # 给InnoDB缓冲池分配一半内存,足够装下你的核心数据 innodb_log_file_size = 4G # 增大日志文件,减少频繁刷盘的开销 innodb_flush_log_at_trx_commit = 2 # 性能优先,牺牲一点事务安全性(非金融站点完全可用) query_cache_type = 0 # 关闭查询缓存,WP动态查询多,缓存反而拖慢速度 query_cache_size = 0 max_connections = 500 # 调大连接数,避免并发请求排队 table_open_cache = 2048 # 增大表缓存,减少反复打开表的开销systemctl restart mysql
第四步:系统层面的辅助排查
虽然硬件很强,但也得排除系统瓶颈:
- 用
iostat -x 1 5看磁盘IO,你的NVMe盘性能够强,但如果MySQL频繁刷盘也会拖CPU(不过你top里的wa是0%,暂时可以排除)。 - 检查Apache的并发设置,比如
MaxRequestWorkers,如果Apache开了太多进程,会导致MySQL连接数暴增。可以配合Nginx做反向代理,让Nginx处理静态请求,减轻Apache和MySQL的压力。
临时应急方案
如果CPU占用已经影响站点访问,先做这些救急:
- 用
mysqladmin processlist -u root -p | grep -v Sleep找出正在运行的长查询,用KILL [进程ID];杀掉最耗资源的那些。 - 临时开启WP维护模式,给你留足够时间排查问题。
内容的提问来源于stack exchange,提问作者Martin Smith
相关产品推荐
相关产品推荐

