window服务器cpu过高的排查_mysql导致服务器CPU过高排查

本文记录了一次由于MySQL查询导致Windows服务器CPU达到100%的排查过程。通过`show processlist;`命令发现多个长时间运行的复制到临时表的查询,结合慢查询日志,定位到问题SQL并建议开发进行优化。此外,还提到`Copying to tmp table`状态可能意味着临时结果集超出了内存限制,检查`tmp_table_size`配置有助于理解问题原因。
摘要由CSDN通过智能技术生成

背景

服务器上安装mysql,收到cpu 100%报警,登上去查看top,很明显是mysql导致cpu达到100%

排查过程

1 但是因为有多个系统连接这个数据库,不知道是哪个数据库导致

一般来说都是因为慢查询,找到慢查询日志查看,看到一些慢查询但是并没有特别高的,怀疑一个程序导致,但是当发现cpu 100%的时候已经将tomcat的调用程序关闭,没有新的mysql进来了

2

mysql> show processlist;

---------------------------------------------------------------------------+

| Id | User | Host | db | Command | Time | State | Info |

+---------+-----------+------------------+---------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+

| 2517261 | testUser | 192.168.1.201:57308 | testt | Query | 3856 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517262 | testUser | 192.168.1.201:57312 | testt | Query | 3834 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517265 | testUser | 192.168.1.201:57336 | testt | Query | 3745 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517270 | testUser | 192.168.1.201:57438 | testt | Query | 3716 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517271 | testUser | 192.168.1.201:57470 | testt | Query | 3699 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517272 | testUser | 192.168.1.201:57490 | testt | Query | 3657 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517273 | testUser | 192.168.1.201:57538 | testt | Query | 3655 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517274 | testUser | 192.168.1.201:57542 | testt | Query | 3602 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517279 | testUser | 192.168.1.201:57686 | testt | Query | 3462 | Copying to tmp table | SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.um |

| 2517316 | testUser | 192.168.1.201:58604 | testt | Query | 0 | NULL | show processlist |

| 2517317 | testUser | 192.168.1.201:58610 | testt | Sleep | 2631 | | NULL |

+---------+-----------+------------------+---------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+

11 rows in set (0.14 sec)

执行 show processlist;

因为我的用户只有testt的权限,所以只能看到这个权限下的进程,如果你是root可以查看到所有用户的进程。

3 正好怀疑是这个用户连接导致的,所以把这些进程杀掉

mysql> kill 2517262;

Query OK, 0 rows affected (0.04 sec)

mysql> kill 2517265;

Query OK, 0 rows affected (0.04 sec)

mysql> kill 2517270;

Query OK, 0 rows affected (0.04 sec)

mysql> kill 2517271;

Query OK, 0 rows affected (0.04 sec)

mysql> kill 2517272;

Query OK, 0 rows affected (0.04 sec)

mysql> kill 2517273;

Query OK, 0 rows affected (0.04 sec)

mysql> kill 2517274;

Query OK, 0 rows affected (0.04 sec)

kill后慢查询日志中有多个输出

# User@Host: testUser[testUser] @ [192.168.1.201]

# Query_time: 3977.501006 Lock_time: 0.000203 Rows_sent: 0 Rows_examined: 0

use testt;

SET timestamp=1588142826;

SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.umobile, count(con.users_id) conCount, MAX(con.date) date FROM theuser.users users LEFT JOIN shopmm.consignee con ON (con.userName = users.userName OR con.suserName = users.userName) LEFT JOIN shopmm.consigneesub consub ON con.id = consub.con_id WHERE 1 = 1 AND con.static = 4 AND (con.isfrom = 1 OR (con.isfrom = 2 AND con.ishopfrom = 1)) GROUP BY users.loginName) table_count;

# Time: 200429 14:47:19

# User@Host: testUser[testUser] @ [192.168.1.201]

# Query_time: 3968.516205 Lock_time: 0.000118 Rows_sent: 0 Rows_examined: 0

SET timestamp=1588142839;

SELECT count(0) FROM (SELECT users.id users_id, users.userName, users.loginName, users.uqq, users.umobile, count(con.users_id) conCount, MAX(con.date) date FROM theuser.users users LEFT JOIN shopmm.consignee con ON (con.userName = users.userName OR con.suserName = users.userName) LEFT JOIN shopmm.consigneesub consub ON con.id = consub.con_id WHERE 1 = 1 AND con.static = 4 AND (con.isfrom = 1 OR (con.isfrom = 2 AND con.ishopfrom = 1)) GROUP BY users.loginName) table_count;

原来是这条语句导致,让开发优化语句即可

4 查看show processlist时的状态

Copying to tmp table代表临时结果集太大,超过数据库规定的临时内存大小,需要拷贝临时结果集到磁盘上

查看/etc/my.ini配置中tmp_table_size = 64M

所以判定应该时查询出来的数据过大导致消耗cpu过多,我这个都执行了1h还没执行完,后来还是kill进程,cpu才恢复了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用内容,你提到在启动运行Java的jar包的过程中,MySQL容器会停止,并且即使你手动重新启动MySQL容器,它也会在几分钟内再次停止。这个问题可能是由于阿里云轻量应用服务器的配置过低导致的。服务器采用了最便宜的一档,只有1核CPU和1G内存。在启动Jar文件时,由于内存不足,MySQL容器会停止工作。 根据你的问题描述,Windows MySQL老是断开的原因很可能是由于服务器内存不足导致MySQL容器频繁停止。解决这个问题的办法是提升服务器的配置,增加内存和CPU的资源,以确保MySQL容器能够正常运行而不会频繁断开。 另外,你还提到在本地的IDEA中测试启动时没有报错。这可能是因为本地的IDEA环境具有足够的内存和CPU资源,所以没有出现这个问题。 综上所述,你可以通过提升服务器的配置来解决Windows MySQL频繁断开的问题,确保服务器具有足够的内存和CPU资源以支持MySQL容器的正常运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [故障排查:阿里云轻量应用服务器中的MySQL容器自行停止](https://blog.csdn.net/monarch91/article/details/124970658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值