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()
使用说明
-
把
analyze_btt.py放在 btt 输出文件所在目录 -
执行:
python3 analyze_btt.py
-
输出:
-
文本文件
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 输出,并生成一个 综合延迟报告,适合多磁盘系统分析。
你希望我帮你做这个扩展吗?
浙公网安备 33010602011771号