写点什么

服务器异常问题排查指南

作者:BeyondLife
  • 2023-12-07
    江苏
  • 本文字数:5001 字

    阅读完需:约 16 分钟

服务器异常问题排查指南

引言

在日常线上问题 troubleshooting 的过程中,经常会与到在没有一些 APM 工具加持的情况下需要人肉进行服务器相关异常的问题排查,本文从常见的服务器异常指标维度分析,总结了我们在无外部 APM 工具辅助的场景下怎么从服务器的各项性能指标维度排查故障问题,进而准确定位出具体的服务器资源瓶颈

操作系统相关

操作系统版本和 cpu 架构

#1操作系统查看lsb_release -a#2cat /etc/os-release#linux 内核查看uname -a
复制代码

内存分配

#查看内存信息cat/etc/meminfo
复制代码

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_syncookiescat /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 连接的闲置关闭时间 默认7200scat /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

iotop 显示每个进程的io使用情况
复制代码



  • 列解释


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 过滤器表达式一直如: 过滤源目标ipsrc host 192.168.1.100过滤目标机器ipdst 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

sar -n DEV 1
复制代码



指标解释


rxpck/s: 每秒钟接收的数据包数。txpck/s: 每秒钟发送的数据包数。rxbyt/s: 每秒钟接收的字节数。txbyt/s: 每秒钟发送的字节数。rxcmp/s: 每秒钟接收的压缩数据包数。txcmp/s: 每秒钟发送的压缩数据包数。rxmcst/s: 每秒钟接收的多播数据包数
复制代码


发布于: 14 分钟前阅读数: 9
用户头像

BeyondLife

关注

还未添加个人签名 2018-05-03 加入

十年开发老兵,多年搜索及推荐领域技术和业务积累目前主要研究低代码平台设计及开发模式,关注三高架构设计方案及系统实现,微服务治理实践及DDD领域驱动设计方案,目前致力于研究低代码平台的最佳实践方案

评论

发布
暂无评论
服务器异常问题排查指南_trouble shooting_BeyondLife_InfoQ写作社区