问题排查
问题分类
一般问题分类:
- CPU
- 磁盘
- 内存
- 网络
- 数据库问题
- 其他问题
1. CPU问题
- top
- top -Hp pid
- jstack
- 可以使用在线网站例如:https://fastthread.io/、perfma(https://thread.console.perfma.com/)
频繁GC
- jstat 查看gc情况
XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps- jcmd
上下文切换
- vmstat 通过
cs这一列代表上下文切换的次数 - pidstat -w pid 对特定pid进行监控,cswch,nvcswch分别表示自愿和非自愿切换
2. 磁盘
- df -hl 查看文件系统情况
- iostat -d -k -x io情况
- lsof -p pid 查看pid使用的文件情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
- du 查看文件大小,如果显示的层级过深,可以使用
d(depth)制定深度。
1
2
3
4
5
6
df -hl:查看磁盘剩余空间
df -h:查看每个根路径的分区大小
du -sh [目录名]:返回该目录的大小
du -sm [文件夹]:返回该文件夹总M数
du -h [目录名]:查看指定文件夹下的所有文件大小(包含子文件夹)
内存
- free 查看内存使用情况
1
2
3
4
5
6
7
total - 这个数字表示应用程序可以使用的内存总量。
used - 已使用的内存。它的计算方法是: used = total - free - buffers - cache。
free - 空闲/未使用的内存。
shared - 这一列可以忽略,因为它没有任何意义。它在这里只是为了向后兼容。
buff/cache - 内核缓冲区、页面缓存和板块使用的内存组合。如果应用程序需要,这个内存可以在任何时候被回收。如果你想让缓冲区和缓存显示在两列中,使用-w选项。
available - 估计可用于启动新应用程序的内存量,不需要交换。
3. 网络问题
https://cloud.tencent.com/developer/article/1630364
- 汇总:
- 网络配置相关:ifconfig、ip
- 路由相关:route、netstat、ip
- 查看端口工具:netstat、lsof、ss、nc、telnet
- 下载工具:curl、wget、axel
- 防火墙:iptables、ipset
- 流量相关:iftop、nethogs
- 连通性及响应速度:ping、traceroute、mtr、tracepath
- 域名相关:nslookup、dig、whois
- web服务器:python、nginx
- 抓包相关:tcpdump
- 网桥相关:ip、brctl、ifconfig、ovs
ping
判断网络的连通性以及网速,偶尔还顺带当做域名解析使用
ping google.com
netstat
查看当前建立的网络连接。最经典的案例就是查看本地系统打开了哪些端口
netstat能够查看所有的网络连接,包括unix socket连接
lsof
查看打开的文件(list open files),由于在Linux中一切皆文件,那socket、pipe等也是文件,因此能够查看网络连接以及网络设备
iftop
查看网络流量的工具
nc
常常作为网络应用的Debug分析器,可以根据需要创建各种不同类型的网络连接
一个经典的用法是端口扫描 。比如我要扫描192.168.56.2主机1~100端口,探测哪些端口开放的:
1
2
3
~$ nc -zv 192.168.56.2 1-100 |& grep 'succeeded!'
Connection to 192.168.56.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.56.2 80 port [tcp/http] succeeded!
tcpdump
命令行抓包工具
telnet
并不仅仅限于telnet协议,有时也用来探测端口
ifconfig
网卡配置工具(configure a network interface),我们经常使用它来查看网卡信息(比如IP地址、发送包的个数、接收包的个数、丢包个数等)以及配置网卡(开启关闭网卡、修改网络mtu、修改ip地址等)
nslookup && dig
nslookup用于交互式域名解析
dig命令也是域名解析工具(DNS lookup utility),不过提供的信息更全面
whois
查看域名所有者的信息
route
route命令用于查看和修改路由表
ip
它完全可以替换ifconfig、netstat、route、arp等命令
brcctl
brctl是linux网桥管理工具,可用于查看网桥、创建网桥、把网卡加入网桥等。
traceroute
ping命令用于探测两个主机间连通性以及响应速度,而traceroute会统计到目标主机的每一跳的网络状态(print the route packets trace to network host),这个命令常常用于判断网络故障,比如本地不通,可使用该命令探测出是哪个路由出问题了
mtr
mtr是常用的网络诊断工具(a network diagnostic tool),它把ping和traceroute并入一个程序的网络诊断工具中并实时刷新。
ss
ss命令也是一个查看网络连接的工具(another utility to investigate sockets),用来显示处于活动状态的套接字信息。
curl
curl是强大的URL传输工具,支持FILE, FTP, HTTP, HTTPS, IMAP, LDAP, POP3,RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET以及TFTP等协议。
wget
wget是一个强大的非交互网络下载工具(The non-interactive network downloader),虽然curl也支持文件下载,不过wget更强大,比如支持断点下载等。
axel
axel是一个多线程下载工具(A light download accelerator for Linux),通过建立多连接,能够大幅度提高下载速度
nethogs
我们前面介绍的iftop工具能够根据主机查看流量(by host),而nethogs则可以根据进程查看流量信息
iptables
强大的包过滤工具 ,Docker、Neutron都网络配置都离不开iptables。iptables通过一系列规则来实现数据包过滤、处理,能够实现防火墙、NAT等功能
ipset
以上我们通过iptables封IP,如果IP地址非常多,我们就需要加入很多的规则,这些规则需要一一判断,性能会下降(线性的)。ipset能够把多个主机放入一个集合,iptables能够针对这个集合设置规则,既方便操作,又提高了执行效率。注意ipset并不是只能把ip放入集合,还能把网络地址、mac地址、端口等也放入到集合中。
OOM问题
- 使用jmap进行堆转储
jmap -dump:format=b,file=filename pid XX:+HeapDumpOnOutOfMemoryError- 使用jcmd也可以进行堆转储
4. 数据库问题
查看锁超时时间
show variables like ‘innodb_lock_wait_timeout’;
查看锁情况
使用information_schema数据库中的表查看
正在执行的事务,事务的状态
select * from information_schema.innodb_trx\G
查看锁信息
mysql8.0.1之前
select * from information_schema.innodb_locks\G
mysql8.0.1之后
SELECT * FROM performance_schema.data_locks;
查看哪个事务因为获取不到锁而阻塞
mysql8之前版本
select * from information_schema.innodb_locks\G
8之后版本
SELECT * FROM performance_schema.data_lock_waits\G
借助引擎状态查询事务情况
show engine innodb status\G
表空间id查询表
select * from information_schema.INNODB_SYS_DATAFILES where space=3431;
使用information_schema数据库下与事务相关的几个系统表关联查询
参考文章:https://www.cnblogs.com/kerrycode/p/8948335.html
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT b.trx_mysql_thread_id AS 'blocked_thread_id'
,b.trx_query AS 'blocked_sql_text'
,c.trx_mysql_thread_id AS 'blocker_thread_id'
,c.trx_query AS 'blocker_sql_text'
,( Unix_timestamp() - Unix_timestamp(c.trx_started) )
AS 'blocked_time'
FROM information_schema.innodb_lock_waits a
INNER JOIN information_schema.innodb_trx b
ON a.requesting_trx_id = b.trx_id
INNER JOIN information_schema.innodb_trx c
ON a.blocking_trx_id = c.trx_id
WHERE ( Unix_timestamp() - Unix_timestamp(c.trx_started) ) > 4;
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.sql_text,
c.id,
d.trx_started
FROM performance_schema.events_statements_current a
join performance_schema.threads b
ON a.thread_id = b.thread_id
join information_schema.processlist c
ON b.processlist_id = c.id
join information_schema.innodb_trx d
ON c.id = d.trx_mysql_thread_id
where c.id=17
ORDER BY d.trx_started\\G;
慢查询日志
是否开启慢查询日志
show variables like 'slow_query_log%';
默认的超时时间
show variables like 'long_query_time%';