引言
在日常线上问题 troubleshooting 的过程中,经常会与到在没有一些 APM 工具加持的情况下需要人肉进行服务器相关异常的问题排查,本文从常见的服务器异常指标维度分析,总结了我们在无外部 APM 工具辅助的场景下怎么从服务器的各项性能指标维度排查故障问题,进而准确定位出具体的服务器资源瓶颈
操作系统相关
操作系统版本和 cpu 架构
#1操作系统查看
lsb_release -a
#2
cat /etc/os-release
#linux 内核查看
uname -a
复制代码
内存分配
tcp 网络相关参数设置
tcp 连接时序图
netstat
#过滤 Localaddress 中带有3308的端口连接列表
netstat -ano | awk '$4 ~ /:3308$/'
#打印第六列的tcp状态,并根据状态做统计
netstat -ntu | awk '$4 ~ /:3308$/ {print $6}' | sort | uniq -c
#统计本机所有对外被监听的,并且 tcp 状态是 ESTABLISHED 和 TIME_WAIT 的并且根据数量做降序排列取前20行,判断本机对外的连接是否有泄露
netstat -ntu | awk '($6 == "ESTABLISHED" || $6 == "TIME_WAIT") && $4 ~ /:[0-9]+$/ {split($4, a, ":"); print a[2]}' | sort | uniq -c | sort -nr | head -n 20
本机的tcp连接的连接数状态
netstat -nat|awk '{print $6}'|sort|uniq -c|sort -nr
每个主机到该主机的连接数,用于判断是否客户端有连接泄露
netstat -ntu|awk '{print $5}'|cut -d: -f1|sort|uniq -c |sort -nr
#查看某个进程的开放的监控端口
netstat -tunlp|grep pid|sort
复制代码
TCP 相关比较重要的参数
cat /proc/sys/net/ipv4/tcp_参数名
复制代码
#半连接队列。一般默认值是 512,不过这个设置有效的前提是系统的syncookies功能被禁用
# max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)
cat /proc/sys/net/ipv4/tcp_syncookies
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
#全连接队列 min(backlog, somaxconn) . backlog是在socket创建的时候传入的
#取二者的较小值
cat /proc/sys/net/core/somaxconn
#tcp_abort_on_overflow是0的话,
server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步),如果client超时等待比较短,client就很容易异常了
cat /proc/sys/net/ipv4/tcp_abort_on_overflow
#tcp_synack_retries 客户端发送syn 服务端未确认后的重试次数。默认5次
cat /proc/sys/net/ipv4/tcp_synack_retries
# tcp_keepalive_time TCP 连接的闲置关闭时间 默认7200s
cat /proc/sys/net/ipv4/tcp_keepalive_time
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1
#修改系默认的 挥手关闭 TIMEOUT 时间
net.ipv4.tcp_fin_timeout
复制代码
修改方式
永久生效
#修改
vi /etc/sysctl.conf
#添加参数
net.ipv4.tcp_syncookies = 1
#生效
sysctl -p
复制代码
临时生效
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
复制代码
tcp 连接溢出的指标检查项
负载相关的参数
TOP 相关命令
CPU 信息
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU 中的Core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep"processor"| wc -l
# 查看超线程数
lscpu
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
复制代码
全局 TOP 命令
关键参数描述和指标解析
关键快捷键
top
1: 显示每个核数的cpu使用
d+数字 :修改刷新频率
c: 显示进程启动命令
m: 显示内存使用详情
f: 自定义面板中显示的列 (方向键选择后 + d 选中,esc退出)
P:以占据CPU百分比排序
M:以占据内存百分比排序
T:以累积占用CPU时间排序
q:退出命令:按q键退出top查看页面
s:修改刷新时间间隔。按下s键,然后按下数字,即可修改刷新时间间隔为你输入的数字,单位为秒。例如:按下s键,在按数字1键,即可实现每秒刷新一次
k:终止指定的进程。按下k键-->再输入要杀死的进程的pid-->按enter键-->(选择信号类型,以数字标示,默认15为杀死)本步可省略按enter键(常用为-9)
复制代码
指标分析
:::infoLoadAverage/系统的 cpu 核数 >5 :系统超负荷工作 LoadAverage/系统的 cpu 核数 >1 :系统负载较高:::
磁盘 IO 指标检测
命令安装
iostat
yum install iostat
iostat 命令有几个选项,可以帮助您定制输出以适应您的需要:
-c:仅显示CPU使用率统计。
-d:仅显示磁盘I/O统计。
-x:显示扩展的统计信息。
-m:以MB为单位显示所有尺寸。
-t:包含各种统计的时间戳。
-V:显示工具的版本信息。
#显示扩展的磁盘I/O统计,单位为MB,每2秒更新一次,总共5次。
iostat -mdx 2 5
#扩展信息指标:
rrqm/s:每秒合并到设备队列的读请求的数量。这指的是逻辑合并的读取请求,以减少实际的物理磁盘读取。
wrqm/s:每秒合并到设备队列的写请求的数量。与读合并类似,写合并可以减少物理磁盘写操作。
r/s:每秒完成的读 I/O 设备次数。这是实际读取操作的次数,不包括合并的操作。
w/s:每秒完成的写 I/O 设备次数。这是实际写入操作的次数,不包括合并的操作。
rMB/s:每秒从设备读取的数据量(MB)。
wMB/s:每秒向设备写入的数据量(MB)。
avgrq-sz:平均请求大小(扇区)。它表示每次I/O操作的平均数据量。
avgqu-sz:平均I/O队列长度。这显示了在统计时间内,设备队列的平均长度。
await:平均I/O等待时间(毫秒)。这是一个请求的平均处理时间,包括排队和处理时间。
r_await:读请求的平均服务时间(毫秒),即从发出读取命令到完成数据传输的时间。
w_await:写请求的平均服务时间(毫秒),即从发出写入命令到完成数据传输的时间。
svctm:平均服务时间(毫秒)。这代表系统处理一个I/O请求的平均时间,不包括等待时间。
%util:设备利用率百分比。这表示在统计时间内,有I/O操作的时间百分比。接近100%表明设备可能正忙于处理I/O请求。
复制代码
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。>0.5表示io繁忙
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
备注:
如果%iowait的值过高,表示硬盘存在I/O瓶颈
如果%idle值高,表示CPU较空闲
如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU
cpu属性值说明:
tps:该设备每秒的传输次数
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read: 读取的总数据量;
kB_wrtn:写入的总数量数据量;
复制代码
iotop
Total DISK READ and Total DISK WRITE:
显示所有进程的磁盘读写总量,通常作为系统整体I/O性能的概览。
Actual DISK READ and Actual DISK WRITE:
显示在某个时刻实际的磁盘读写量,这有助于识别当前哪些操作最占用磁盘。
TID, PRIO, USER, DISK READ, DISK WRITE, SWAPIN, IO> and COMMAND:
进程ID、优先级、用户、磁盘读写量、交换使用量、I/O百分比以及命令名称。
特别是IO>列,
它显示了进程造成的I/O延迟。
进程的I/O百分比很高,这意味着它在大部分时间内都在等待I/O操作完成
如果磁盘本身的读写速度跟不上进程的请求速度,就会出现高I/O等待时间
SWAPIN:
这一列显示了进程从交换空间读取数据的量,这通常发生在物理内存不足时。
COMMAND:
正在执行的命令,可以帮助识别是哪个应用程序或服务正在使用磁盘。
复制代码
#根据读写或者io指标排序
方向键 上下左右 选择指定的指标 然后 通过 "<" ">" 来做升降序排序
#每一秒刷新一次
iotop -d 1
复制代码
# 测试写入性能
dd if=/dev/mapper/nfschina--server--4.0-root of=testfile bs=1M count=1000 conv=fdatasync
# 测试读的性能
dd if=/dev/mapper/nfschina--server--4.0-root of=/dev/null bs=1M count=1000
复制代码
机械盘的顺序写入和读取速度在 100-200M/s 固态硬盘的顺序读取速度在 300-550M/s,写入速度 200-520 MB/s 之间
sar
sar
areq-sz:areq-sz代表每个IO请求的平均大小(块大小),通常以扇区(Sector)为单位。它可以用于确定每个IO请求的数据传输量。较大的areq-sz通常表示较大的IO请求。
aqu-sz:aqu-sz代表在IO请求被排队等待服务时,IO请求的平均队列大小。这可以帮助您了解系统上IO请求队列的深度,较高的aqu-sz可能表示IO请求排队等待磁盘服务的时间较长。
await:await代表IO请求的平均等待时间,即从提交IO请求到完成IO请求的平均时间(通常以毫秒为单位)。较高的await值通常表示IO请求需要等待更长时间才能完成,这可能是磁盘性能问题的指标之一。
svctm:svctm代表IO请求的平均服务时间,即IO请求在磁盘上实际执行的平均时间(通常以毫秒为单位)。较高的svctm值可能表示磁盘响应时间较长。
%util:%util代表磁盘的利用率,即磁盘处于活动状态的百分比。较高的%util值表示磁盘正在忙于服务IO请求。当%util接近100%时,可能表明磁盘存在瓶颈。
复制代码
如果 areq-sz 显著增加,可能需要考虑优化 IO 请求的大小。如果 aqu-sz 持续增加,可能需要查看系统上的 IO 负载,以确定是否需要优化磁盘性能或进行负载均衡。高 await 和 svctm 值通常表示 IO 请求需要较长时间才能完成。这可能是由于磁盘性能问题导致的,可能需要进一步的诊断和优化。当 %util 接近 100%时,磁盘可能已经饱和,并且可能是系统瓶颈之一。您可以考虑通过升级硬件、使用 RAID 配置或优化磁盘性能来减轻磁盘的负载
dstat
sudo yum install dstat
dstat
-c 或 --cpu:显示CPU使用情况。
-m 或 --memory:显示内存使用情况。
-d 或 --disk:显示磁盘I/O使用情况。
-n 或 --net:显示网络使用情况。
-s 或 --swap:显示交换空间使用情况。
-g 或 --page:显示页面活动统计。
-y 或 --sys:显示系统信息(中断、上下文切换等)。
-p 或 --proc:显示进程信息(运行中的进程数量等)。
-l 或 --load:显示系统负载信息。
-r 或 --io:显示I/O请求等待时间。
-v 或 --vm:显示虚拟内存统计。
dstat -c -m -d --output dstat_output.csv
复制代码
网络带宽检测
iftop
面板
iftop
h:显示帮助菜单
n:开启 / 关闭主机名的 DNS 解析,如果可以 iftop 可以将 IP 地址解释为主机名则显示主机的名称,否则显示 IP 地址。
N:开启 / 关闭服务名称的解释,例如,本地主机连接远程的主机的 443 端口,iftop 将会在远程主机 IP 地址后面添加服务的名称 www.myfreax.com:https。
p:开启 / 关闭目标和源端口的显示
P:暂停刷新屏幕,注意:这仅仅暂停主要窗口部分的刷新,屏幕底部的统计值依然自动刷新。
s:显示或者隐藏源主机的 IP 或主机名。
S:显示 / 关闭源端口。
t:切换显示发送和接收流量的三种方式,第一种是仅显示发送的流量,第二种是仅显示接收的流量,同时发送和接收的流量,也就是启动时的默认模式。
T:显示 / 关闭发送与接收流量统计,这将会在 2s 10s 40s 速率之前添加一列显示累计值。
q:退出 iftop
复制代码
过滤功能
输入:f
过滤规则和pcap-filter 过滤器表达式一直
如: 过滤源目标ip
src host 192.168.1.100
过滤目标机器ip
dst host 192.168.1.100
过滤 CIDR 格式的 IP 地址 显示源地址在 192.168.0.0/16 网段主机的流量
iftop -f "src net 192.168.0.0/16"
基于端口的过滤 过滤 http 和https的流量
iftop -f "port 80,443"
排除22端口外的流量
iftop -f "not port 22"
#基于ip和端口
命令仅显示来自 IP 地址 192.168.1.100 并且目标端口为 80 的流量。
iftop -f "src host 192.168.1.100 and dst port 80"
复制代码
排序
1/2/3:根据最近 2 秒、10 秒、40 秒的平均网络流量排序;
<:根据源主机地址排序;
>:根据目的主机地址排序;
o:固定显示当前连接,用来观察当前连接的流量情况,避免刷新后连接顺序变化;
复制代码
watch
watch more /proc/net/dev 查看网卡的流量传输详情
复制代码
sar
指标解释
rxpck/s: 每秒钟接收的数据包数。
txpck/s: 每秒钟发送的数据包数。
rxbyt/s: 每秒钟接收的字节数。
txbyt/s: 每秒钟发送的字节数。
rxcmp/s: 每秒钟接收的压缩数据包数。
txcmp/s: 每秒钟发送的压缩数据包数。
rxmcst/s: 每秒钟接收的多播数据包数
复制代码
评论