linux 数据丢包监控,【易测试201604】网络性能监控及常见问题定位

在性能测试中,特别是测试云计算相关产品时,网络是影响性能的关键的因素之一,此文主要介绍网络性能如何监控以及常见网络性能问题如何定位。

1 常见网络模型和架构

首先介绍一下网络交互的过程中,数据包是怎么走的。从发送到被接收,经过的路径大致如下,以一次网络交互为例,一个数据包自发送端从上往下经由用户态空间的应用、系统内核空间到达网卡驱动,然后通过数据链路传输到达接收端,再从下往上经过网卡驱动、系统内核空间最终到达用户态空间的应用中等待被处理。在整个过程中,涉及到多个队列,一系列的参数设定,其中任一部分的波动都可能导致终端表现出网络性能的抖动。

2 网络性能监控

网络性能监控是网络性能测试的重要部分,也是定位网络性能问题的重要手段。监控结果能相对直观地显示出网络系统的运行状态,帮助我们分析和解决性能问题。在网络性能监控中,最常用的监控方式有两类:网卡性能监控和协议栈监控。

2.1 网卡性能监控

网卡性能监控是网络性能测试中最重要的监控方式之一,网卡承载了所有的网络流量,很多关键性能参数都能从网卡性能监控中获得。网卡性能监控工具有很多,其中以sar较为常用。

2.1.1 网卡性能监控工具 - sar

sar 全称为System Activity Report,是Unix/Linux 下流行的系统资源监控命令,Linux 下如果没有该命令,需要安装 sysstat 包。

sar -n 可以根据关键字以不同的角度报告实时的网络流量变化,其中DEV和ETCP关键字最为常用。

DEV关键字以设备为单位提供网络统计报告,方便快速观察各网卡性能:

IFACE:设备名;

rxpck/s:每秒钟接收的数据包;

txpck/s:每秒钟发送的数据包;

rxbyt/s:每秒钟接收的字节数;

txbyt/s:每秒钟发送的字节数;

rxcmp/s:每秒钟接收的压缩数据包;

txcmp/s:每秒钟发送的压缩数据包;

rxmcst/s:每秒钟接收的多播数据包。

ETCP关键字报告TCP层的错误统计,包括重试、断连、重传、错误、RST包等:

atmptf/s:每秒重试失败数;

estres/s:每秒断开连接数;

retrans/s:每秒重传数;

isegerr/s:每秒错误数;

orst

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于BPF的Linux网络丢包监控的C代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <linux/if_packet.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <arpa/inet.h> #include <linux/filter.h> #include <errno.h> #include <unistd.h> #define BUFSIZE 2048 int main(int argc, char *argv[]) { int sock_fd; char buffer[BUFSIZE]; struct sockaddr_ll saddr; int saddr_len = sizeof(saddr); struct sock_filter bpf_code[] = { /* Match all packets */ { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, }; struct sock_fprog filter = { .len = sizeof(bpf_code) / sizeof(struct sock_filter), .filter = bpf_code, }; if ((sock_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("socket"); exit(1); } /* Set the BPF filter */ if (setsockopt(sock_fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) < 0) { perror("setsockopt"); exit(1); } while (1) { int len = recvfrom(sock_fd, buffer, BUFSIZE, 0, (struct sockaddr *)&saddr, &saddr_len); if (len < 0) { perror("recvfrom"); exit(1); } /* Check for dropped packets */ if (saddr.sll_pkttype == PACKET_OUTGOING) { printf("Packet dropped!\n"); } } close(sock_fd); return 0; } ``` 该代码创建一个原始套接字并使用BPF过滤器来捕获所有网络数据包。它在每次接收到数据包时检查包的类型,如果为“出包”则打印出“Packet dropped!”的消息。这样,您就可以使用此代码来监视Linux系统上的网络丢包情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值