prometheus自定义监控磁盘io 磁盘读取速率

本文分享了一个用于监控磁盘性能的Bash脚本。该脚本利用iotop和hdparm命令来收集磁盘的读写速度及读取速率等关键指标,并通过curl将这些数据发送到指定的HTTP端点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、安装两个磁盘命令

iotop 磁盘读、写

hdparm 磁盘读取速率



#!/bin/bash
echo `date "+%F %T"`
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin;
export PATH
ioread=`iotop -b -n 1|head -n 1|awk '{print $5}'`
iowrite=`iotop -b -n 1|head -n 1|awk '{print $12}'`
diskspeed=`hdparm -t /dev/md0 |grep seconds |awk -F "=" '{print $2}'|awk -F 'M' '{print $1}'|awk '$1=$1'`
u_ip=`/sbin/ifconfig |grep inet |sed -n 1p|awk '{print $2}'`
job_name=disk_infoio
cat <<EOF | curl --data-binary @- http://113.2.1.1:9091/metrics/job/$job_name/instance/$u_ip
        disk_infoio{label="ioread"} $ioread
        disk_infoio{label="iowrite"} $iowrite
        disk_infoio{label="diskspeed"} $diskspeed
EOF

根据自己要求,监控所需的磁盘,我这根据要求写的,你们可以随意,主要是磁盘2个命令,害怕迷路,自己记录一下

弱鸡求学

<think>好的,我现在需要帮助用户了解如何拆解应用程序读取文件量。首先,我需要明确用户的需求。拆解读取文件量可能指的是监控或分析一个应用程序在运行过程中读取了多少文件数据。用户可能是开发人员、系统管理员或者安全研究人员,他们可能想要优化应用性能、排查问题或者进行资源监控。 接下来,我需要考虑不同的操作系统,因为方法可能不同。用户可能使用的是Linux,因为之前的问题涉及Linux内核,但也不排除其他系统。不过,根据上下文,先假设是Linux环境。 然后,我需要回顾已有的知识,比如在之前的对话中提到的内核统计机制,比如/proc文件系统、perf工具、eBPF等。这些工具可能可以用来监控文件读取量。另外,像strace、lsof这样的命令行工具也可能相关。 用户的问题比较宽泛,拆解应用程序读取文件量可能包括几个方面:实时监控、历史记录、按文件或进程分类统计。我需要分步骤解释不同的方法,并说明它们的优缺点。 首先,可能想到的是使用系统自带的工具,如lsof查看打开的文件,或者使用strace跟踪系统调用。但strace会产生较大的性能开销,可能不适合长时间使用。然后,可以考虑/proc文件系统中的信息,比如/proc/[pid]/io,这里可能有进程的IO统计信息。 另外,提到eBPF工具如bpftrace或bcc工具包,这些可以在低开销下监控read系统调用,并统计读取的字节数。这可能是更高效的方法,特别是对于生产环境。 还有,使用auditd审计系统可以记录文件访问事件,但配置起来可能复杂一些。对于需要持久化日志的情况,这可能是个选择。 另外,用户可能需要将统计结果可视化或生成报告,这时候可能需要结合其他工具,比如awk、python脚本处理数据,或者使用监控系统如Prometheus+Grafana。 还需要注意权限问题,有些工具需要root权限才能运行,比如eBPF相关的工具或者auditd。如果用户是在受限环境中,可能需要调整方法。 可能的陷阱包括:监控工具本身带来的性能影响,特别是对高IO的应用程序;不同工具统计的粒度不同,比如每次调用的字节数还是累积总量;还有如何正确过滤目标进程的数据,避免其他进程的干扰。 最后,总结各种方法的适用场景,帮助用户根据具体需求选择最合适的工具组合。比如,快速检查用/proc或lsof,深度分析用eBPF,安全审计用auditd等。 需要确保回答结构清晰,分点列出不同方法,并给出具体命令示例,方便用户实际操作。同时提醒注意事项,比如性能影响和权限要求。可能还需要解释一些术语,比如eBPF,确保用户理解这些工具的基本原理和使用场景。</think>--- ### 如何拆解应用程序读取文件量 要监控和分析应用程序的文件读取量,可以通过以下方法从不同层级捕获数据,涵盖实时跟踪、历史统计和深度分析。以下是具体步骤和工具说明: --- ### 1. **系统级工具(快速定位)** #### **(1) 使用 `lsof` 查看进程打开的文件** ```bash lsof -p <PID> # 查看指定进程打开的文件列表 lsof -c <进程名> # 按进程名过滤(如 `lsof -c nginx`) ``` **功能**:列出进程当前打开的文件句柄,包括读取中的文件。 **缺点**:仅显示实时状态,无法统计累计读取量。 --- #### **(2) 通过 `/proc` 文件系统获取 IO 统计** ```bash cat /proc/<PID>/io # 查看进程的累计读写量(单位:字节) ``` **输出示例**: ``` rchar: 1024000 # 读取的总字符数(包括缓存) read_bytes: 512000 # 实际从磁盘读取的字节数 ``` **适用场景**:快速获取进程的累计读取量,区分缓存与实际磁盘读取。 --- #### **(3) 使用 `iotop` 实时监控磁盘 IO** ```bash iotop -o -p <PID> # 按进程显示实时磁盘 IO(需 root 权限) ``` **功能**:动态显示进程的读写速率(KB/s),适用于观察瞬时负载。 --- ### 2. **系统调用跟踪(精确到每次操作)** #### **(1) 使用 `strace` 追踪文件读取调用** ```bash strace -e trace=read -p <PID> # 捕获所有 read 系统调用 strace -e trace=openat,read -p <PID> # 跟踪文件打开和读取 ``` **输出示例**: ``` read(3, "data...", 4096) = 1024 # 读取文件描述符 3,返回 1024 字节 ``` **缺点**:性能开销大,可能影响高负载进程。 #### **(2) 过滤并统计读取量** 将 `strace` 输出重定向到文件后,用脚本统计: ```bash strace -p <PID> -e trace=read -o strace.log awk '/^read/ {sum += $3} END {print sum}' strace.log # 统计总读取字节 ``` --- ### 3. **内核级监控(低开销高效统计)** #### **(1) 使用 `eBPF/bpftrace` 动态追踪** **示例脚本**:统计指定进程的 `read` 系统调用字节数 ```bash bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid == <PID>/ { @bytes = sum(args->ret); }' ``` **输出**:每隔一秒输出累计读取字节数,无进程性能影响。 #### **(2) 使用 `bcc` 工具包中的 `filetop`** ```bash filetop -C # 实时显示所有进程的文件读写量(按文件名聚合) ``` **功能**:按文件路径统计读写速率,适合分析具体文件的热点。 --- ### 4. **审计框架(记录所有文件访问事件)** #### **(1) 配置 `auditd` 记录文件读取** ```bash # 添加审计规则(监控 /etc/passwd 的读取) auditctl -w /etc/passwd -p r -k read_passwd # 查看日志 ausearch -k read_passwd ``` **日志内容**:记录进程 ID、用户、时间戳和操作详情。 **适用场景**:安全审计或合规性检查。 --- ### 5. **自定义代码插桩(深度集成)** #### **(1) 使用 `LD_PRELOAD` 劫持文件读取函数** 编写动态库拦截 `read` 函数并统计: ```c // hook_read.c #define _GNU_SOURCE #include <dlfcn.h> #include <unistd.h> size_t (*original_read)(int, void*, size_t) = NULL; size_t read(int fd, void *buf, size_t count) { original_read = dlsym(RTLD_NEXT, "read"); size_t bytes = original_read(fd, buf, count); // 记录到日志或全局变量 fprintf(stderr, "Read %zu bytes from fd %d\n", bytes, fd); return bytes; } ``` **编译与使用**: ```bash gcc -shared -fPIC -o hook_read.so hook_read.c -ldl LD_PRELOAD=./hook_read.so ./target_program # 运行目标程序 ``` **优点**:无需修改目标程序代码,灵活统计。 --- ### 6. **可视化与长期监控** #### **(1) 使用 `Prometheus + Grafana` 构建监控系统** - **导出指标**:通过 `node_exporter` 收集系统级 IO 数据。 - **自定义指标**:编写 `eBPF` 程序导出进程级读取量到 Prometheus。 #### **(2) 生成报告脚本** ```bash # 统计指定进程过去一小时的读取量 awk '/read_bytes/ {print $2}' /proc/<PID>/io | ts "%Y-%m-%d %H:%M" >> io.log ``` --- ### 总结 | **方法** | **粒度** | **开销** | **适用场景** | |------------------|----------------|----------|----------------------------------| | `/proc/<PID>/io` | 进程级累计 | 无 | 快速检查累计读取量 | | `strace` | 单次调用级别 | 高 | 调试或短期分析 | | `eBPF/bpftrace` | 内核事件级别 | 低 | 生产环境实时监控 | | `LD_PRELOAD` | 函数调用级别 | 中 | 无源码程序的定制统计 | | `auditd` | 文件路径级别 | 中 | 安全审计与合规性记录 | **选择建议**: - 快速定位问题:优先使用 `/proc` 和 `iotop`。 - 深度分析行为:结合 `eBPF` 和 `strace`。 - 长期监控:集成 `Prometheus` 和自定义导出器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值