MySQL 占用 CPU 过高问题定位及优化( 二 )

通过 top 我们发现有一个 32232 的进程使得 CPU 使用率已经超过了 100% 。
接下来我们具体分析分析,究竟是什么导致 CPU 使用率达到 100%以上的 。
检查内存使用情况[root@localhost ~]# free -mtotalusedfreesharedbuff/cacheavailableMem:7982103328014041476604Swap:204702047内存使用率还可以,应该不是内存影响导致的问题 。
检查服务器线程方法一:
top -H -p <mysqld 进程 id>先通过 top 找出占用 CPU 使用率 100% 的 MySQL 进程 32232,在具体查看该进程下的线程情况 。
[root@localhost ~]# top -H -p 32232top - 15:30:32 up 33 days, 23:20,3 users,load average: 0.18, 0.15, 0.18Threads:28 total,1 running,27 sleeping,0 stopped,0 zombie%Cpu(s): 24.4 us,3.2 sy,0.0 ni, 72.4 id,0.0 wa,0.0 hi,0.0 si,0.0 stKiB Mem :8173716 total,2867420 free,1059520 used,4246776 buff/cacheKiB Swap:2097148 total,2097140 free,8 used.6761668 avail MemPID USERPRNIVIRTRESSHR S %CPU %MEMTIME+ COMMAND32272 root200 1443252 35668811748 R 99.74.42:25.74 mysqld32244 root0 -20 1443252 35668811748 S3.74.40:08.68 mysqld32236 root200 1443252 35668811748 S1.74.40:01.45 mysqld32237 root200 1443252 35668811748 S1.74.40:01.43 mysqld32238 root200 1443252 35668811748 S1.34.40:01.43 mysqld32239 root200 1443252 35668811748 S1.34.40:01.42 mysqld32241 root200 1443252 35668811748 S0.34.40:00.75 mysqld32250 root200 1443252 35668811748 S0.34.40:00.98 mysqld32232 root200 1443252 35668811748 S0.04.40:00.31 mysqld32233 root200 1443252 35668811748 S0.04.40:00.00 mysqld32234 root200 1443252 35668811748 S0.04.40:00.23 mysqld32235 root200 1443252 35668811748 S0.04.40:00.31 mysqld32240 root200 1443252 35668811748 S0.04.40:00.74 mysqld32242 root200 1443252 35668811748 S0.04.40:00.72 mysqld32243 root200 1443252 35668811748 S0.04.40:00.69 mysqld32247 root200 1443252 35668811748 S0.04.40:00.16 mysqld32248 root200 1443252 35668811748 S0.04.40:00.23 mysqld32249 root200 1443252 35668811748 S0.04.40:00.02 mysqld32251 root200 1443252 35668811748 S0.04.40:08.04 mysqld32252 root200 1443252 35668811748 S0.04.40:00.00 mysqld32253 root200 1443252 35668811748 S0.04.40:00.00 mysqld32254 root200 1443252 35668811748 S0.04.40:00.00 mysqld32255 root200 1443252 35668811748 S0.04.40:00.00 mysqld32256 root200 1443252 35668811748 S0.04.40:00.18 mysqld32257 root200 1443252 35668811748 S0.04.40:00.03 mysqld32258 root200 1443252 35668811748 S0.04.40:00.00 mysqld32259 root200 1443252 35668811748 S0.04.40:00.00 mysqld32260 root200 1443252 35668811748 S0.04.40:00.00 mysqld结果可以明显的看到 32272 这个线程的 CPU 使用率异常 。
方法二:
pidstat -t -p <mysqld 进程 id> 1 5先通过 top 找出占用 CPU 使用率 100% 的 MySQL 进程 32232,使用 pidstat 工具在具体查看该进程下的线程情况 。
pidstat -t -p 32232 1 5Average:UIDTGIDTID%usr %system%guest%CPUCPUCommandAverage:032232-85.0012.600.0097.60-mysqldAverage:0-322320.000.000.000.00-|__mysqldAverage:0-322330.000.000.000.00-|__mysqldAverage:0-322340.000.000.000.00-|__mysqldAverage:0-322350.000.000.000.00-|__mysqldAverage:0-322361.000.400.001.40-|__mysqldAverage:0-322370.800.400.001.20-|__mysqldAverage:0-322380.800.400.001.20-|__mysqldAverage:0-322391.000.200.001.20-|__mysqldAverage:0-322400.200.000.000.20-|__mysqldAverage:0-322410.000.200.000.20-|__mysqldAverage:0-322420.000.000.000.00-|__mysqldAverage:0-322430.000.000.000.00-|__mysqldAverage:0-322441.201.800.003.00-|__mysqldAverage:0-322470.000.000.000.00-|__mysqldAverage:0-322480.000.000.000.00-|__mysqldAverage:0-322490.000.000.000.00-|__mysqldAverage:0-322500.000.000.000.00-|__mysqldAverage:0-322510.000.000.000.00-|__mysqldAverage:0-322520.000.000.000.00-|__mysqldAverage:0-322530.000.000.000.00-|__mysqldAverage:0-322540.000.000.000.00-|__mysqldAverage:0-322550.000.000.000.00-|__mysqldAverage:0-322560.000.000.000.00-|__mysqldAverage:0-322570.000.000.000.00-|__mysqldAverage:0-322580.000.000.000.00-|__mysqldAverage:0-322590.000.000.000.00-|__mysqldAverage:0-322600.000.000.000.00-|__mysqldAverage:0-3227280.009.800.0089.80-|__mysqld结果可以明显的看到 32272 这个线程的 CPU 使用率异常 。
查看 MySQL 进程在 MySQL 中看看当前连接是否有什么异常 。
方法一:
mysql [localhost:5727] {msandbox} ((none)) > show full processlist;+----+----------+-----------+------+---------+------+---------------------+---------------------------------------------+| Id | User| Host| db| Command | Time | State| Info|+----+----------+-----------+------+---------+------+---------------------+---------------------------------------------+|3 | msandbox | localhost | test | Query|7 | Creating sort index | select * from t_cpu order by rand() limit 1 ||4 | msandbox | localhost | NULL | Query|0 | starting| show full processlist|+----+----------+-----------+------+---------+------+---------------------+---------------------------------------------+2 rows in set (0.00 sec)方法二:


推荐阅读