性能测试分析案例-定位服务器丢包

这篇具有很好参考价值的文章主要介绍了性能测试分析案例-定位服务器丢包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境准备

预先安装 docker、curl、hping3 等工具,如 apt install docker.io curl hping3。

操作和分析

案例是一个 Nginx 应用,如下图所示,hping3 和 curl 是 Nginx 的客户端。
性能测试分析案例-定位服务器丢包,性能测试,性能测试小白,linux,性能优化
在终端一中执行下面的命令,启动 Nginx 应用,并在 80 端口监听。如果一切正常,你应该可以看到如下的输出:

docker run --name nginx --hostname nginx --privileged -p 80:80 -itd feisky/nginx:drop

执行 docker ps 命令,查询容器的状态,你会发现容器已经处于运行状态(Up)了:

docker ps

性能测试分析案例-定位服务器丢包,性能测试,性能测试小白,linux,性能优化
终端二中,执行下面的 hping3 命令,进一步验证 Nginx 是不是真的可以正常访问了。

hping3 -c 10 -S -p 80 xxx.xxx.xxx.xxx

性能测试分析案例-定位服务器丢包,性能测试,性能测试小白,linux,性能优化
发送了 10 个请求包,却只收到了 5 个回复,50% 的包都丢了。再观察每个请求的 RTT 可以发现,RTT 也有非常大的波动变化,小的时候只有 52ms,而大的时候则有1s。
性能测试分析案例-定位服务器丢包,性能测试,性能测试小白,linux,性能优化
发生丢包的位置,实际上贯穿了整个网络协议栈。换句话说,全程都有丢包的可能。比如我们从下往上看:
在两台 VM 连接之间,可能会发生传输失败的错误,比如网络拥塞、线路错误等;
在网卡收包后,环形缓冲区可能会因为溢出而丢包;
在链路层,可能会因为网络帧校验失败、QoS 等而丢包;
在 IP 层,可能会因为路由失败、组包大小超过 MTU 等而丢包;
在传输层,可能会因为端口未监听、资源占用超过内核限制等而丢包;
在套接字层,可能会因为套接字缓冲区溢出而丢包;
在应用层,可能会因为应用程序异常而丢包;
此外,如果配置了 iptables 规则,这些网络包也可能因为 iptables 过滤规则而丢包。
终端一,执行下面的命令,进入容器的终端中:

$ docker exec -it nginx bash

链路层

当缓冲区溢出等原因导致网卡丢包时,Linux 会在网卡收发数据的统计信息中,记录下收发错误的次数。
你可以通过 ethtool 或者 netstat ,来查看网卡的丢包记录。比如,可以在容器中执行下面的命令,查看丢包情况:

netstat -i

性能测试分析案例-定位服务器丢包,性能测试,性能测试小白,linux,性能优化
RX-OK、RX-ERR、RX-DRP、RX-OVR ,分别表示接收时的总包数、总错误数、进入 Ring Buffer 后因其他原因(如内存不足)导致的丢包数以及 Ring Buffer 溢出导致的丢包数。没有任何错误,说明容器的虚拟网卡没有丢包。
还要查看一下 eth0 上是否配置了 tc 规则,并查看有没有丢包。我们继续容器终端中,执行下面的 tc 命令,不过这次注意添加 -s 选项,以输出统计信息:

tc -s qdisc show dev eth0

性能测试分析案例-定位服务器丢包,性能测试,性能测试小白,linux,性能优化
eth0 上面配置了一个网络模拟排队规则(qdisc netem),并且配置了丢包率为 30%(loss 30%)。再看后面的统计信息,发送了 29 个包,但是丢了 13 个。Nginx 回复的响应包,被 netem 模块给丢了。删掉 netem 模块就可以了。我们可以继续在容器终端中,执行下面的命令,删除 tc 中的 netem 模块:

root@nginx:/# tc qdisc del dev eth0 root netem loss 30%

切换到终端二中,重新执行刚才的 hping3 命令,看看现在还有没有问题:

hping3 -c 10 -S -p 80 xxx.xxx.xxx.xxx

还是 50% 的丢包;RTT 的波动也仍旧很大,从 3ms 到 1s。
丢包还在继续发生。不过,既然链路层已经排查完了,我们就继续向上层分析,看看网络层和传输层有没有问题。

网络层和传输层

执行下面的 netstat -s 命令,就可以看到协议的收发汇总,以及错误信息了:

netstat -s
Ip:
    Forwarding: 1
    61 total packets received
    0 forwarded
    0 incoming packets discarded
    43 incoming packets delivered
    48 requests sent out
Icmp:
    0 ICMP messages received
    0 input ICMP message failed
    ICMP input histogram:
    0 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
Tcp:
    0 active connection openings
    2 passive connection openings
    10 failed connection attempts
    0 connection resets received
    0 connections established
    43 segments received
    64 segments sent out
    17 segments retransmitted
    0 bad segments received
    0 resets sent
Udp:
    0 packets received
    0 packets to unknown port received
    0 packet receive errors
    0 packets sent
    0 receive buffer errors
    0 send buffer errors
UdpLite:
TcpExt:
    10 resets received for embryonic SYN_RECV sockets
    1 TCP sockets finished time wait in fast timer
    4 SYNs to LISTEN sockets dropped
    0 packet headers predicted
    7 acknowledgments not containing data payload received
    3 predicted acknowledgments
    TCPSackRecovery: 1
    3 congestion windows recovered without slow start after partial ack
    TCPSackFailures: 1
    1 timeouts in loss state
    2 fast retransmits
    TCPTimeouts: 12
    TCPLossProbes: 2
    TCPDSACKRecv: 1
    TCPSpuriousRTOs: 2
    TCPSackShifted: 1
    TCPSackShiftFallback: 3
    TCPRetransFail: 3
    TCPSynRetrans: 5
    TCPOrigDataSent: 20
IpExt:
    InOctets: 2853
    OutOctets: 3642
    InNoECTPkts: 61

TCP 协议发生了丢包和重传,分别是:
10次连接失败重试(failed connection attempts)
17次重传(segments retransmitted)
10 次半连接重置(resets received for embryonic SYN_RECV sockets)
5次 SYN 重传(TCPSynRetrans)
12 次超时(TCPTimeouts)
TCP 协议有多次超时和失败重试,并且主要错误是半连接重置。换句话说,主要的失败,都是三次握手失败。

iptables

iptables 和内核的连接跟踪机制也可能会导致丢包。

# 容器终端中执行exit
root@nginx:/# exit
exit

# 主机终端中查询内核配置
$ sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 65536
$ sysctl net.netfilter.nf_conntrack_count
net.netfilter.nf_conntrack_count = 14

连接跟踪数只有 14,而最大连接跟踪数则是 65536。显然,这里的丢包,不可能是连接跟踪导致的。
iptables 的原理,它基于 Netfilter 框架,通过一系列的规则,对网络数据包进行过滤(如防火墙)和修改(如 NAT)。
iptables -nvL 命令,查看各条规则的统计信息。比如,你可以执行下面的 docker exec 命令,进入容器终端;然后再执行下面的 iptables 命令,就可以看到 filter 表的统计数据了:

# 在主机中执行
docker exec -it nginx bash

# 在容器中执行
root@nginx:/# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 25 packets, 1000 bytes)
 pkts bytes target     prot opt in     out     source               destination
    6   240 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.29999999981

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 15 packets, 660 bytes)
 pkts bytes target     prot opt in     out     source               destination
    6   264 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.29999999981

两条 DROP 规则的统计数值不是 0,它们分别在 INPUT 和 OUTPUT 链中。这两条规则实际上是一样的,指的是使用 statistic 模块,进行随机 30% 的丢包。
接下来的优化就比较简单了。比如,把这两条规则直接删除就可以了。我们可以在容器终端中,执行下面的两条 iptables 命令,删除这两条 DROP 规则:

root@nginx:/# iptables -t filter -D INPUT -m statistic --mode random --probability 0.30 -j DROP
root@nginx:/# iptables -t filter -D OUTPUT -m statistic --mode random --probability 0.30 -j DROP

执行刚才的 hping3 命令,看看现在是否正常:

hping3 -c 10 -S -p 80 xxx.xxx.xxx.xxx

没有丢包了
终端一,在容器终端中执行 exit 命令,退出容器终端:文章来源地址https://www.toymoban.com/news/detail-790918.html

root@nginx:/# exit

到了这里,关于性能测试分析案例-定位服务器丢包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jmeter 在linux服务器中执行性能测试、监听服务器资源指标

    下载apache-jmeter-5.5文件; 下载ServerAgent-2.2.3文件; 解压apache-jmeter-5.5文件;(需先安装java环境) 找到apache-jmeter-5.5apache-jmeter-5.5bin目录,运行 ApacheJMeter.jar 创建 测试计划 、 线程组 、 HTTP请求 及各类监听组件; 保存脚本为 xxx.jmx 文件。 将apache-jmeter-5.5.tgz 压缩包上传至服务器,

    2024年02月09日
    浏览(75)
  • Linux服务器的性能监控与分析

     如上图所示,我们在命令vmstat后面添加了两个参数,1表示间隔一秒获取一次,10表示总共获取10次 我们一列一列数据来看: r:代表目前实际运行的指令队列,很高表示CPU很繁忙通常会CPU使用率过高 这个数据如果高于服务器CPU核数就可能出现瓶颈(需要结合后五列CPU使用百

    2024年02月12日
    浏览(45)
  • Linux 常用操作命令(CentOS 7.0)- 故障定位:服务器负载、进程管理、日志分析

    系统经研发测试上线后,如果运行期间出现了BUG,需要对服务故障进行定位,一般会查看服务器负载、服务状态、进程管理、服务日志等。 本文以CentOS 7.0 操作系统上的命令操作作为示例进行记录。 #服务器负载 完整参见:http://www.laobingbiji.com/note/detail.html?note_id=20231115154337

    2024年01月17日
    浏览(69)
  • Linux的服务器日志分析及性能调优

    作为网络安全和数据传输的重要环节,代理服务器在现代互联网中扮演着至关重要的角色。然而,在高负载情况下,代理服务器可能面临性能瓶颈和效率问题。本文将介绍如何利用Linux系统对代理服务器进行日志分析,并提供一些实用技巧来优化其性能。 1. 日志收集与分析

    2024年02月10日
    浏览(56)
  • 部标JT808车辆定位监控平台单服务器13.6万接入压力测试记录(附源码)

    之前经常有人问平台能支持多少设备同时在线,由于事情多没时间做。最近刚好有机会做下压力测试。在不间断的连续压测三天,最终结果为13.6万TCP连接,30秒上报频率。 测试平台同时接入设备数量与并发处理能力。 一台主服务器用于部署车辆定位平台,是常见的8核16G内存

    2024年04月12日
    浏览(53)
  • Jmeter性能测试,通过插件监控服务器资源使用情况

    可以通过jmeter 安装\\\"PerfMon(Servers Performance Monitoting)\\\"插件并配合服务端资源监控工具进行实现,详细操作流程如下: (备注:我这个是已安装的,如果未安装,可以点击“Available Plugins”tab搜索该插件) 如果可以选择该元件即代表安装成功 点击AddRow --配置服务器地址、端口号

    2024年02月16日
    浏览(63)
  • Jmeter性能测试 —— jmeter之使用ServerAgent监控服务器

    ServerAgent 性能测试时我们关注的重要指标是:并发用户数,TPS,请求成功率,响应时间,服务器的CPU,memory, I/O disk等。Jmeter的聚合报告可以查看并发数、吞吐量、请求成功率、响应时间等;如果要查看服务器端的CPU,memory, I/O disk等就需要安装插件ServerAgent 将ServerAgent-2.2

    2024年02月07日
    浏览(59)
  • 如何监测和优化阿里云服务器的性能?有哪些性能分析工具和指标?

    如何监测和优化阿里云服务器的性能?有哪些性能分析工具和指标? 阿里云服务器性能监测与优化是云计算服务中一个非常重要的环节。为了确保服务器稳定、高效地运行,我们需要对其性能进行监测,并在监测的基础上进行优化。本文将为您介绍如何监测和优化阿里云服务

    2024年02月11日
    浏览(49)
  • 国际腾讯云账号云服务器网络访问丢包问题解决办法!!

    本文主要介绍可能引起云服务器网络访问丢包问题的主要原因,及对应排查、解决方法。下面一起了解腾讯云国际云服务器网络访问丢包问题解决办法: 可能原因 引起云服务器网络访问丢包问题的可能原因如下: 1.触发限速导致 TCP 丢包 2.触发限速导致 UDP 丢包 3.触发软中断

    2024年02月11日
    浏览(43)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包