Mysql占用内存过高,cpu占用100%,服务器崩溃,试试调整php的参数memory_limit

最近在一个网站上更换 WordPress 主题,由于之前已经做好了更换主题的调研,也提前测试了一番,整个更换过程一切顺利,新主题非常漂亮。但是发生了一个问题困扰了我好多天,今天终于解决了,来记录一下。

这个问题就是,更换主题后,服务器资源占用提升了许多,操作 WordPress 后台时,时不时出现负载 100% 和 cpu 占用率 100% 的情况。而且内存占用率也比以前更高,以前通常是 50% 左右,现在是 70% 左右,后台有操作时会提升至 80% 左右。

结果导致服务器崩溃了好几次,特别是在 WordPress 后台的某些操作时,例如更新文章、打开 WordPress 新版小工具等。

首先我是怀疑新主题的问题,但是后来想想,我的 WordPress 已启用缓存插件,前台访问也不会耗费什么资源啊。接着我又想可能是缓存插件生成缓存文件时,新主题需要加载更多的 js 和 css,所以生成缓存时使得服务器资源耗费更多。

但是慢慢的我又发现除了生成缓存时,有一些需要比较大量读写数据库的操作也会导致服务器资源耗尽。我就想这应该不是新主题的问题。

然后我用 top 命令查看了一下进程,发现 mysqld 一直占用较多的内存,约 20% – 40%。当操作 WordPress 后台时,有时会出现大量 php-fpm 进程,此时服务器的负载和 cpu 占用率都会接近 100%。

我开始怀疑 php 和 mysql 的设置出了问题,因为更新主题后我又顺便把 php 的版本从 php7.1 升级到了 php7.4,mysql 也更新了一下,但是版本没变。

然后就各种调试参数,什么 max_children 、max_spare_servers 等调来调去,又各种查看日志找原因,但是却一直毫无结果。

在整个过程中,一直使用 Google 大法,发现原来 php 和 mysql 版本越高耗费的资源越多。php 升级版本对服务器资源的影响并不大,mysql 影响比较大,但是我并没有升级 mysql 的版本。

继续 Google 吧,出来了不少关于优化服务器性能的文章,其中看到了一句话:

把 php 的参数 memory_limit(脚本内存限制)调整为 256M,这样 WordPress 跑起来会更顺畅。

那就调一下吧,结果大喜过望,调整后内存使用率立马下降,变成和更新主题之前一样 50% 左右。然后我又尝试在 WordPress 后台操作了一下,貌似真的顺畅了许多。

估计升级前我的参数是 256M 的,或者原主题 128M 就够用了,升级后因为默认是 128M 的,所以就出问题了。

为什么会这样呢?memory_limit 这个参数的意思就是限制 php 脚本的最大运行内存,我的猜测是,如果某些 php 脚本需要使用的内存接近或超过限制,那么就会运行缓慢甚至出错。

反正问题解决了,就不深究了,做博客网站最重要还是输出有价值的内容。