系列文章目录
错误排查笔记(一)——客户反馈使用服务器突然出现明显延迟卡顿应该如何排查与解决方案
错误排查笔记(二)——服务器资源占用问题排查方法
错误排查笔记(三)——某个应用的CPU使用率过高
错误排查笔记(四)——linux定时任务无法正常运行shell脚本
前言
记录遇到的相关问题以及解决方案,旨在能够尽可能掌握排错思路与命令
问题:如果遇到客户反馈使用服务器突然出现明显延迟卡顿应该如何排查与解决
一、排查方法:
1.ping、Telnet、ssh
最简单的ping命令,用来测试网络是否处于连通状态。
Telnet与ssh相似,都是用于远程登录主机的命令。
2.tcpdump抓包
用tcpdump系统抓包工具,来查看网络数据报的内容
使用方法:
-i 指定网卡
-X -XX 打印十六进制的网络数据包
-S 以绝对值显示包的ISN号(包序列号)
例1: 截获本机收到与发出的所有数据包
tcpdump host 127.0.0.1
例2: 过滤的是源主机为127.0.0.1与目标网路为192.168.0.0的报头
tcpdump src host 127.0.0.1 and dst net 192.168.0.0/24
3.mtr命令查看丢包情况
第一列:host,显示IP地址或者主机名称
第二列:loss% 丢包率
第三列:Snt 发送包的数量
第四列:Last 最近一次发包的延迟 ms
第五列:Avg 平均延迟
第六列:Best 最低延迟
第七列:Wrst 最高延迟
第八列:StDev,标准偏差 值越小说明波动越小
一般查看mrt报告,主要观察丢包情况与延迟状况
主机名会显示为???,并且丢包率达到100%时,这可能为路由器的配置出现问题,但是因为Last的显示延迟为0,说明数据在正常进行传输。
导致丢包的因素大致为几种(待扩展):
1.发包速率过快,可能是由于访问服务器基数增加,如平常100人访问,突然10000人访问网站导致溢出。
2.ICMP速率被限制,导致ICMP包的优先级较低,出现被丢弃的情况
3.ICMP包在返回过程中出现丢包。数据正常送达,但返回路由与发出的路由不一致,导致返回过程中出现丢包的情况。这种情况需要再发送与接收两端都进行mrt的报告收集。
4.netstat命令
netstat是控制台命令,是监控TCP/IP网络的实用工具,它可以显示路由表、实际的网络连接以及每个网络接口设备的状态信息。
netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各个端口的网络连接情况。
图片来自网络:
如图,netstat输出结果可大致分为两部分:
- Active Internet connections 有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列与发送队列。数字一般为0,不是0则表示软件包正在队列中堆积。这种情况不常见。
- Active UNIX domain sockets 有源Unix域套接口。unix域套接字用于在同一台计算机上的进程间通信,虽然因特网域套接字可用于同一目的,但是unix域套接字的效率更高。unix域套接字并不进行协议处理,不需要添加或删除网络报头,无需计算校验和,不需要产生顺序号,无需发送确认报文。UNIX与套接字提供和数据报两种接口,UNIX域数据报服务是可靠的,就不会丢失消息也不会传递出错。UNIX域套接字是套接字和管道之间的混合物。为了创建一对非命名的,相互连接的UNXI域套接字,用户可以使用socketopair函数。创建一对互相连接的unix域套接字可以用socketpair函数:
其它列名解释:
- Proto:显示连接使用的协议
- RefCnt:表示连接到本套接口上的进程号
- Types:显示套接口的类型
- State:显示套接口当前的状态
- Path:表示连接到套接口的其它进程使用的路径名
5.pstack
(print stack)
pstack + PID
用来查看某个进程的线程数量和线程调用堆栈是否运行正常。运行pstack需要root运行,来确定进程挂起的位置。
这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;
使用方法:
获取进程的PID,通过pstack命令查看其中各个线程id以及对应的线程正在处理的事情,分析多组数据可获得哪些线程有慢操作影响了服务器的性能,从而得到解决方案
如:
ps -ef | grep bash #获取bash的PID
pstack <bash PID> #获取bash本地线程的堆栈
二、解决方案
blabla
总结
排查方式:
- ping、ssh、telnet
- tcpdump
- mtr
- netstack
- pstack
并不完善,旨在总结归纳