我正在高端Centos 7 VPS(16 vCore / 128 GB RAM)上运行单个高访问量网站,并在其上运行Plesk Onyx Centos 7 / MariaDB 10.1 / PHP-FPM 5.6设置。
一切通常都很流畅,快速,但是一年下来,网站因MariaDB的消息“ Too Many Connections”关闭而发生了两次。
我急于恢复网站,但没有启动SHOW PROCESSLIST,就启动了“ service mariadb restart”。
此后,我检查了mariadb日志和Web服务器日志,但没有找到对解决该问题有用的任何东西。
请注意,当它第一次发生时,我在my.cnf中将max_connections值提高到300,并不断监视“ max_used_connections”变量,发现该值从未超过50,所以我猜想它是由于某些DDOS攻击或恶意尝试而发生的
问题:
有关如何解决此问题的任何建议?
如果max_used_connections值接近max_connections值,如何通知我?有什么工具吗?
我正在使用外部pingdom服务检查网站的正常运行时间,但未检测到此类问题(Web响应为200 OK),也未检测到服务器上的netdata实例(https://netdata.io/)帮助...
答案 0 :(得分:2)
通过打开慢速日志来解决问题,最好为long_query_time
设置一个较低的值(例如“ 1”)。可能会出现一些顽皮的查询。
是的,下次再执行SHOW FULL PROCESSLIST
。 (注意“ FULL”。)而不是重新启动mysqld,请查找有问题的查询。它在Time
中将是最高值之一,并且可能不在Sleep
模式下。可能很长,例如ALTER
或转储。杀死一个进程可能会解决问题,并且问题可能会在几秒钟内消失。
删除由进程(例如mysqld)“打开”的文件将无济于事-在所有进程都关闭文件之前,不会回收磁盘空间。终止进程将关闭所有打开的文件。某些日志可以使用FLUSH LOGS;
处理-尽管可能无济于事,这应该是无害的。
如果您的表是MyISAM,则切换到InnoDB可以避免很多情况下发生表锁定(如果您遇到的是这种情况)。
innodb_buffer_pool_size
的值是什么?对于该大小的RAM,大约80G是合理的。
GLOBAL STATUS
中可能有一些线索;请参见http://mysql.rjweb.org/doc.php/mysql_analysis#tuning进行分析。 (警告:重新启动后,它将立即失效。)