架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 21940|回复: 6

[资料] MySQL 在高并发情况下CPU占用过高分析

[复制链接]
发表于 2017-9-5 20:23:59 | 显示全部楼层 |阅读模式
QQ截图20170905201242.png

最近,因为某些原因,网站访问量急剧增高,从图上面,可以看到,并发连接数1200多

因为服务器配置很低1核2g的内存吧,然后,网站在人多的时候访问非常的慢

QQ截图20170905195554.png
我们用top命令查看,mysql非常占用cpu和内存,其他进程都是php-fpm占用cpu和内存,都不是很高

如果mysql运行正常,那就是php的一些sql语句导致问题发现,用root用户进入mysql管理
mysql -u root -p
输入密码,然后输入以下命令




通过这个命令我们可以看到,数据库在不停的执行带where条件的删除操作。

QQ截图20170905200228.png

pre_k_spider这个表是记录蜘蛛访问的一个表,估计是安装的一个插件引起的

我们可以看到pre_k_spider这个表有10万多条记录,查询耗时33秒

QQ截图20170905200841.png

果断把这个表清空,然后,去管理后台把该表的相关插件关闭后,恢复正常!









上一篇:阿里云云市场验证码识别服务
下一篇:mysql 5.6.21 查看my.cnf配置文件
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-9-6 09:32:56 | 显示全部楼层
QQ截图20170906090331.jpg

今天网站又卡死了,发现大量的sleep

造成sleep的原因:

1 The client program did not call mysql_close() before exiting.

2 The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server.

3 The client program ended abruptly in the middle of a data transfer

如果你的sleep进程数在同一时间内过多,再加上其他状态的连接,总数超过了max_connection的值,那mysql除了root用户外,就无法再继续处理任何请求无法与任何请求建立连接或者直接挂了

解决方式:

1.先要先检查你的程序是否使用的是pconnect的方式,其次,检查在页面执行完毕前是否及时调用了mysql_close()。尽量不要使用pconnect的方式,即使用mysql_connect。程序执行完毕,应该显式调用mysql_close

2.在my.cnf里面加上wait_timeout和interactive_timeout,把值设的小一些,默认情况下wait_timeout的值是8小时的时间,你可以改成1个小时,或半个小时。这样mysql会更快的杀死死连接。防止连接总数超过max_connection的值。

  wait_timeout 过大,会导致MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过设置的过小,可能会遇到“MySQL has gone away”之类的问题

  把max_connection的值设置的更大,不过这样显然不妥,连接的数量越多,对你服务器的压力越大。实际上那些连接都是冗余的,把它们尽快杀死才是上策。

3.逐步分析系统的SQL查询,找到查询过慢的SQL,优化之



1)interactive_timeout:
参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)

(2)wait_timeout:
参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)

MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。


sql命令:



这种修改方式在重启mysql服务后,会失效,所以最好还是把这两个属性配置到mysql配置文件中。

linux 下修改my.cnf 文件:




码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-9-6 11:15:15 | 显示全部楼层
得弄个主从服务器了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-9-6 11:15:49 | 显示全部楼层
vrchary 发表于 2017-9-6 11:15
得弄个主从服务器了

服务器配置原因  配置很低   
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-9-6 13:47:56 | 显示全部楼层
解决"mysql-bin.000001"占用超大空间的问题
http://www.itsvse.com/thread-2694-1-1.html
(出处: 架构师)

用ports安装了MySQL以后,过一段时间发现/var空间不足了,查一下,会发现是mysql-bin.000001、mysql-bin.000002等文件占用了空间,那么这些文件是干吗的?这是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。

这样做主要有以下两个目的:
1:数据恢复
如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
2:主从服务器之间同步数据
主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。

关闭日志即可


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-10-9 14:33:30 | 显示全部楼层
mysqld在Windows下面cpu占用过高

QQ截图20171009142038.jpg QQ截图20171009142620.jpg

解决办法:优化sql语句
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-12-30 23:15:36 | 显示全部楼层
支持一下吧!!!!!!!!!!!!!!!!!!
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-3-29 16:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表