在我重新启动服务器之前,我网站上访问 mysql 数据库的页面的性能会随着时间的推移而变慢。(静态页面不受影响。)重新启动 mysqld 本身没有帮助,但重新启动整个服务器会有所帮助。我尝试了各种 MySQL 性能调整并启用了缓存,但都无济于事。
一开始它非常快,但几天后就变得慢很多,最终变得慢得令人无法忍受。我从命令行运行的任何 mysql 操作都完全正常,包括连接到 mysql、连接到数据库和运行查询。慢查询日志没有显示任何异常。但我的网站上任何与 mysql 连接的页面运行都非常慢。
如果我重新启动服务器,一切都会再次快速运行,直到再次变慢。
我的.cnf:
max_connections = 500
query_cache_size = 10M
tmp_table_size = 16M
max_heap_table_size = 16M
thread_cache_size = 4
innodb_buffer_pool_size = 7G
symbolic-links=0
顶部,服务器正常运行 3 天:
顶部,服务器重启 5 分钟后启动:
我应该采取哪些步骤来隔离并解决这个问题?
答案1
听起来你交换得很糟糕。
您的问题可能是双缓冲。尝试将其添加到您的 my.cnf(当然,还要重新启动 mysql 服务器):
innodb_flush_method = O_DIRECT
并在操作系统级别降低 swapiness,如下所示:
echo 0 > /proc/sys/vm/swappiness
答案2
您的系统等待时间为 76%,很可能是由于频繁交换造成的。
- 用来
mysqltuner.pl
查找影响内存使用量的变量 - 在 top 中按“m”查看哪些占用了内存
- 用于
free -m
查看缓存量 - 用来
iotop
查看谁在消耗 IO
答案3
看起来 OSSEC 防火墙进程是罪魁祸首 - 它占用了太多 CPU 并使一切都陷入困境。重新配置后,一切都恢复正常。
答案4
在您的网页中,您是否关闭了数据库连接并释放了使用的内存?如果没有,您应该这样做。
看看 3 天后的系统规格 - 您的系统和内存使用率已上升,但可用资源有限。由于您的命令行查询运行良好且没有延迟,但您的网页速度很慢,因此存在内存泄漏,可能位于您的 Web 服务器内存空间中(由于命令行运行良好,因此不在 mySQL 中)。
马克·H