文章目录
- 问题排查
-
- 1 服务器信息查看
-
- top命令使用
- 显示信息详解
-
- top命令第一行
- top命令第二行--进程状态
- top命令第三行--CPU状态
- top命令第四行--内存状态
- top命令第五行--swap交换分区
- top命令第七行--进程监控
- 2 数据库分析
- 3 慢查询分析
- 问题解决
- mysql索引相关传送门
问题排查
1 服务器信息查看
top命令使用
使用top命令进行服务器相关信息查看,查看是内存不够、CPU处理能力不够、IO读写过高….等。
服务器为多核,因此需要按下按键“1”查看全部CPU具体信息。
显示信息详解
top命令第一行
top - 11:01:20 up 486 days, 19:31, 1 user, load average: 0.21, 0.28, 0.30
依次对应:系统当前时间 up 系统到目前为止i运行的时间, 当前登陆系统的用户数量, load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。
这行信息与命令uptime显示的信息相同
注意:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
top命令第二行–进程状态
Tasks: 183 total, 1 running, 182 sleeping, 0 stopped, 0 zombie
依次对应:tasks表示任务(进程),183 total则表示现在有183个进程,其中处于运行中的有1个,182个在休眠(挂起),stopped状态即停止的进程数为0,zombie状态即僵尸的进程数为0个。
top命令第三行–CPU状态
%Cpu(s): 0.6 us, 0.2 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 4.1 st
依次对应:
us:user 用户空间占用cpu的百分比
sy:system 内核空间占用cpu的百分比
ni:niced 改变过优先级的进程占用cpu的百分比
空闲cpu百分比
wa:IO wait IO等待占用cpu的百分比
hi:Hardware IRQ 硬中断 占用cpu的百分比
si:software 软中断 占用cpu的百分比
st:被hypervisor偷去的时间
多核服务器需要展开查看具体CPU状态
top命令第四行–内存状态
KiB Mem : 32753588 total, 1142352 free, 25133012 used, 6478224 buff/cache
依次对应:物理内存总量;空闲内存总量;使用中的内存总量;缓冲内存量;
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心
top命令第五行–swap交换分区
KiB Swap: 4194300 total, 2880252 free, 1314048 used. 6677308 avail Mem
依次对应:交换区总量;空闲交换区总量;使用的交换区总量;在不交换的情况下,对启动新应用程序可用内存的估计
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
top命令第七行–进程监控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 1
依次对应:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
2 数据库分析
show PROCESSLIST
查看数据库进程信息,从执行及等待时间查找慢语句
有时info的sql语句过长无法全部显示,则需要使用下面命令
select * from information_schema.processlist;
show OPEN TABLES where In_use > 0;
查询是否锁表 ,使用下面命令可进行锁表进程kill
SELECT CONCAT(‘kill ‘,trx_mysql_thread_id,’;’) FROM INFORMATION_SCHEMA.INNODB_TRX;
反复执行该语句查看是否存在同一进程或进程过多,直接执行“kill 4147”则可杀死该进程
3 慢查询分析
开启并配置完慢查询日志后,超过配置阀值的查询时间语句会写入slow.log中。【如何开启及配置不做描述,可查阅相关资料】
使用tail命令动态阅读慢查询日志看是否存在长时间查询语句,如下。
若日志刷新过快可使用日志截取语句进行截取:
先进入log所在文件夹下:
sed -n "/16:40:00/,/16:53:00/p" slow.log >2021slow.log
问题解决
由于大量访问造成的数据库查询压力,排查慢查得知查询过慢语句,添加索引进行优化处理。
mysql索引相关传送门
MySQL索引的创建与使用
mysql 如何添加索引
USING BTREE 是什么意思 有什么作用 Mysql