io分析第三章

明白了,你希望有一个 完整 Python 脚本,能够直接读取 btt 输出文件(例如 sdb_avg_latency.txt 或直接 blktrace + btt 输出),并生成完整分析文档,包括:

  • 每个请求的服务时间

  • 平均服务时间(新内核 svctm 替代值)

  • 最大服务时间

  • 延迟分布

我可以给你写一个完整示例脚本,并附带使用说明。


Python 脚本示例:分析 btt 输出

假设你已经执行:

sudo blktrace -d /dev/sdb -o sdb
sudo btt -i sdb.blktrace.* -X > sdb_avg_latency_raw.txt

btt 输出到 sdb_avg_latency_raw.txt,内容类似:

Device: 8:0
Avg IO Latency: 2.45 ms
Max IO Latency: 10.12 ms
Queue Depth Avg: 0.85
# q activity
58650097.127647825   9.0
58650097.449863382   9.0
...
# c activity
58650098.959712513  10.5
58650098.960133851  10.4
...

Python 脚本:analyze_btt.py

import re
import matplotlib.pyplot as plt

# 输入 btt 输出文件
INPUT_FILE = "sdb_avg_latency_raw.txt"
OUTPUT_FILE = "sdb_avg_latency_analysis.txt"

# 用于存储 q activity 和 c activity 的时间戳
q_times = []
c_times = []

# 匹配数字行(时间戳 + 延迟)
line_re = re.compile(r"^\s*(\d+\.\d+)\s+(\d+\.?\d*)")

with open(INPUT_FILE, "r") as f:
    section = None
    for line in f:
        line = line.strip()
        if line.startswith("#"):
            if "q activity" in line:
                section = "q"
            elif "c activity" in line:
                section = "c"
            else:
                section = None
            continue
        match = line_re.match(line)
        if match:
            ts, val = float(match.group(1)), float(match.group(2))
            if section == "q":
                q_times.append(ts)
            elif section == "c":
                c_times.append(ts)

# 检查数量
n_requests = min(len(q_times), len(c_times))

# 计算每个请求的服务时间(毫秒)
service_times_ms = [(c_times[i] - q_times[i])*1000 for i in range(n_requests)]

avg_service_time = sum(service_times_ms)/n_requests
max_service_time = max(service_times_ms)

# 保存分析结果
with open(OUTPUT_FILE, "w") as f:
    f.write(f"Total Requests: {n_requests}\n")
    f.write(f"Average Service Time (ms): {avg_service_time:.3f}\n")
    f.write(f"Maximum Service Time (ms): {max_service_time:.3f}\n")
    f.write("Service times per request (ms):\n")
    for t in service_times_ms:
        f.write(f"{t:.3f}\n")

print(f"Analysis saved to {OUTPUT_FILE}")
print(f"Average Service Time: {avg_service_time:.3f} ms")
print(f"Maximum Service Time: {max_service_time:.3f} ms")

# 可选:画延迟分布图
plt.hist(service_times_ms, bins=50, color='skyblue', edgecolor='black')
plt.xlabel("Service Time (ms)")
plt.ylabel("Number of Requests")
plt.title("I/O Service Time Distribution")
plt.grid(True)
plt.savefig("service_time_histogram.png")
plt.show()

使用说明

  1. analyze_btt.py 放在 btt 输出文件所在目录

  2. 执行:

python3 analyze_btt.py
  1. 输出:

  • 文本文件 sdb_avg_latency_analysis.txt,包含:

    • 总请求数

    • 平均服务时间(ms)

    • 最大服务时间(ms)

    • 每个请求的服务时间

  • 图表 service_time_histogram.png

    • 显示 I/O 服务时间分布

    • 可快速判断延迟峰值


结果示例(文本输出)

Total Requests: 1234
Average Service Time (ms): 2.45
Maximum Service Time (ms): 10.12
Service times per request (ms):
2.45
2.50
2.42
...
  • Average Service Time → 新内核 svctm 替代值

  • Maximum Service Time → 最大单次延迟

  • 直方图显示延迟分布,更直观地分析 I/O 性能


如果你需要,我可以帮你 改进这个脚本,让它直接支持 多个设备的 btt 输出,并生成一个 综合延迟报告,适合多磁盘系统分析。

你希望我帮你做这个扩展吗?

posted on 2026-02-02 13:40  吃草的青蛙  阅读(1)  评论(0)    收藏  举报

导航