Linux系统ping包统计数据中的mdev表示什么?

Linux系统在进行 ping 命令的时候,里面有一项输出叫 mdev,如下所示:

 

min/avg/max,我们都可以明白分别表示 最小时延、平均时延和最大时延,那mdev表示什么呢? ping 的手册中并没有提到。我们不妨看一下 ping 的源代码,见 ping_common.c:

tsum += triptime;
tsum2 += (long long)triptime * (long long)triptime

以及

tsum /= nreceived + nrepeats;
tsum2 /= nreceived + nrepeats;
tmdev = llsqrt(tsum2 – tsum * tsum);

可以得出:

mdev = SQRT(SUM(RTT*RTT) / N – (SUM(RTT)/N)^2)

也就是这个平均偏差的公式:

可见 mdev 就是 Mean Deviation 的缩写,它表示这些 ICMP 包的 RTT 偏离平均值的程度,这个值越大说明你的网速越不稳定。

via http://wangcong.org/blog/archives/1801  

注:不同的操作系统,可能名称不同,比如mac下叫做stddev;而windows下ping则没这个统计数据。

来源自博客:技术|ping 的 mdev 值 (linux.cn)https://linux.cn/article-1481-1.html

### 使用 Python 计算系统响应时延的方法 #### 方法概述 系统响应时延是指从发出请求到接收到响应之间的时间间隔。这种时延通常由多个部分组成,括传播时延、传输时延、处理时延以及队列时延[^3]。为了计算系统的响应时延,可以利用 Python 的 `subprocess` 模块执行外部命令(如 ICMP Ping 请求),并通过捕获其输出来获取往返时间。 以下是基于 Python 实现的一个具体方法: --- #### 代码实现 以下是一个完整的 Python 脚本,用于计算单个 IP 地址的平均响应时延: ```python import subprocess import re def calculate_ping_latency(ip_address, count=4): """ 计算指定IP地址的平均Ping响应时延。 参数: ip_address (str): 目标IP地址或域名。 count (int): 发送的ICMP回显请求次数,默认为4次。 返回: float: 平均响应时延(毫秒)。如果无法获得有效数据,则返回None。 """ try: # 构造ping命令 command = f"ping -c {count} {ip_address}" result = subprocess.run(command, shell=True, text=True, capture_output=True) # 提取并解析输出中的时延信息 output = result.stdout match = re.search(r'rtt min/avg/max/mdev = (\d+\.\d+)/(\d+\.\d+)/\d+\.\d+/\d+\.\d+', output) if match: avg_latency = float(match.group(2)) # 获取平均时延 return avg_latency else: return None except Exception as e: print(f"发生错误:{e}") return None if __name__ == "__main__": target_ip = "8.8.8.8" # Google公共DNS服务器 latency = calculate_ping_latency(target_ip) if latency is not None: print(f"{target_ip} 的平均响应时延为 {latency:.2f} ms") else: print(f"未能成功计算 {target_ip} 的响应时延") ``` --- #### 批量计算响应时延 对于批量 IP 地址的情况,可以通过循环调用上述函数完成多目标的响应时延计算。下面提供了一个简单的扩展版本: ```python def batch_calculate_latencies(ip_list, count=4): """ 对一批IP地址进行批量Ping测试,并返回它们的平均响应时延列表。 参数: ip_list (list of str): 待测IP地址列表。 count (int): 每个IP发送的ICMP回显请求次数。 返回: dict: 键为IP地址,值为其对应的平均响应时延(毫秒)。 """ latencies = {} for ip in ip_list: latency = calculate_ping_latency(ip, count=count) latencies[ip] = latency return latencies if __name__ == "__main__": targets = ["8.8.8.8", "1.1.1.1"] # 示例IP列表 results = batch_calculate_latencies(targets) for ip, latency in results.items(): status = f"{latency:.2f} ms" if latency is not None else "不可达" print(f"{ip}: 响应状态 -> {status}") ``` --- #### 关键技术点说明 1. **子进程调用** 利用 `subprocess.run()` 函数运行操作系统级别的命令,能够高效地集成外部工具的功能。这里通过调用 `ping` 命令实现了对远程主机的可达性检测和时延测量[^2]。 2. **正则表达式提取数据** 输出结果中含了丰富的统计信息,例如最小、最大及时延平均值等。借助正则表达式可以从字符串形式的结果中精确匹配所需的数值。 3. **异常处理机制** 在实际应用过程中可能会遇到各种意外状况,比如网络中断或者非法输入参数等问题。因此,在设计程序逻辑时需充分考虑这些潜在风险,并加入必要的防护措施以提高健壮性。 --- #### 注意事项 - 不同平台下的 ping 命令语法可能存在差异。例如 Windows 系统下 `-n` 表示发送的数据数量,而 Linux/MacOS 下则是使用 `-c` 来控制这一行为。 - 如果目标主机屏蔽了 ICMP 协议流量,则即使物理链路正常也无法得到有效的回应数据。 - 当前方案仅适用于 IPv4 地址;若涉及更复杂的场景(如双栈环境或特定协议支持),可能还需要额外调整策略。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值