我偶尔会遇到 mysql 导致机器负载过高,导致 Web 应用程序不可用的情况。我使用 monit 来监控它,但它没有发现问题,显然是因为它仍然可以连接到 mysql。这是我的 mysql monit 脚本:
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
group database
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed port 3306 protocol mysql then restart
if failed unixsocket /var/run/mysqld/mysqld.sock protocol mysql then restart
if 5 restarts within 5 cycles then timeout
发生问题时,机器负载很高,mysql 几乎占用了所有的 CPU。您仍然可以使用mysql
命令行工具“登录”mysql,但任何选择/更新都没有响应。
当这个问题出现时我应该用什么来捕获?
答案1
通过 MySQL 客户端检查进程列表。(show full processlist;
)从那时起,您可以隔离查询的运行位置以及是否需要优化或是否应该停止。
从那时起,您可以kill $NUMBER;
终止问题连接,而不是重新启动 MySQL。
由于意外操作而重新启动已在运行的程序应该是最后的手段,而且通常不是一个好主意。尤其是对于数据库,因为这样会危及数据安全。
当然,具体情况需要采取不同的措施。例如,如果您知道某个软件中存在失控内存泄漏,并且没有正在运行的操作,而恢复资源的唯一方法是重新启动:那么就重新启动吧。
此外,如果您每分钟都在损失大量资金,重启可能是合理的。例如,如果您看不到快速恢复的途径,并且您认为重启将恢复服务,那么如果数据或应用程序的风险小于您实际损失的资金,则重启是合理的。此原则适用,但可能因您的行业、服务和 SLA 而略有不同。
答案2
可能是表被锁定或服务器过载。尝试慢查询日志记录,以及 Warner 建议的 processlist(提示:mytop 将在方便的界面中执行此操作)。还可以尝试(常规)top 来查看哪些程序与数据库争夺 CPU。
如果您看到高“负载”(运行队列),而没有进程消耗(太多)CPU 能力,则可能与存储有关。(IOPS/吞吐量不足)