惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
博客园 - 叶小钗
爱范儿
爱范儿
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
T
Tailwind CSS Blog
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
博客园 - 【当耐特】
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell

依云's Blog

Wayfire支持不缩放Xwayland啦 - 依云's Blog 使用wayvnc远程访问无头Wayfire会话 - 依云's Blog pacfiles: 高速的 pacman -F 替代品 用 Android 手机当电脑的话筒 - 依云's Blog 使用 ffmpeg 对音频文件进行响度归一化 - 依云's Blog 使用 nftables 屏蔽大量 IP - 依云's Blog YubiKey 初体验 - 依云's Blog fcitx5 码表同步方案 - 依云's Blog 我正在使用的火狐扩展(2024年版) - 依云's Blog 使用 PipeWire 实现自动应用均衡器 如果你发现你的 OOM Killer 在乱杀进程 使用 atuin 管理 shell 命令历史 btrfs 元数据满了怎么办 btrfs 翻车记 在 nspawn 里运行 docker Linux 上的字体配置与故障排除 新的 PaddleOCR 部署方案 使用 EasyEffects 调整 Bose 音箱的体验 让离线软件真正离线 我所讨厌的网页行为 tmux 状态栏优化 Google Chrome 中的字体设置 从 getmail6 到 offlineimap 微信消息通知的困扰 Qt 的字体渲染问题 Wayfire 迁移进展(四):不那么 high 的 DPI Wayfire 迁移进展(二):Xwayland HiDPI 以及 waybar Wayfire 迁移进展 不同情况下的图形效果 Wayland 初体验
rrdtool 初体验
依云 · 2012-12-02 · via 依云's Blog

rrdtool 是「Round Robin Database tool」的缩写,是一个存放固定数量的数值型数据库,适合随时间变化的量的统计。比如网络传输速度、CPU 使用率、聊天室在线人数等。与大部分数据库软件不一样的是,它可以直接可视化数据,生成 PNG 图像。第一次使用,找点容易快速获取又有意义的数据源——ping 延迟好了。

第一步,确定数据库怎么存放什么数据。我打算发一千个 ping 包,然后存储其延迟。rrdtool 本来是按时间存储的,我用序号来骗骗它好了。起始时间为现在时间。数据的时间间隔为 1 秒,但实际上是一个序号。聚集函数为平均值,存储 1000 个数据。命令如下(百分号提示符表示 shell 是 zsh,下同):

% start=$(date +'%s')
% rrdtool create ping.rrd --start=$start -s1 DS:ping:GAUGE:1:0:U RRA:AVERAGE:0.5:1:1000

其中,DS是「数据源(data source)」的意思,RRA 是「round robin archives」。-s1表示间隔为 1s。时间点是以距 epoche 的秒数表示的。

DS 部分,ping 是数据的名字,GAUGE表示这就是一个值,不是累加(COUNTER,如已传输字节数)或者其它的。1是 heartbeat,超时这个时间还没收到数据的话就当作UNKNOWN值了。再后边是最小值和最大值,超出的话也会被当成UNKNOWN。那里的U表示「UNKNOWN」。

RRA 部分,AVERAGE是求平均值的聚集函数。类似的还有MAX之类的。用于决定一个区间内的多个值如何归并为一个值。0.5部分没看太懂。1即每秒取一个值,1000则是存储 1000 个这样的值。

取得数据:

% ping -c 1000 google.com > ping.log

把数据处理后喂给 rrdtool 的数据库,每次喂最多 1000 条数据:

% grep -oP '\d+\sttl\S+ \S+' ping.log | sed 's/ttl.*=//g' | awk -vstart=$start '{print $1+start ":" $2}' | xargs -n 1000 rrdtool update ping.rrd 

生成每 1、5、15 秒的统计图像:

% for i in 1 5 15; do rrdtool graph ping_$i.png --start=$start --end=$(( $start + 1000 )) -S $i --vertical-label=ms --width=800 --height=300 DEF:v=ping.rrd:ping:AVERAGE 'AREA:v#00dd00'; done

其中,-S是指定绘图的步长。其它参数很好理解。后两部分解释如下:

DEF设置变量v为 ping.rrd 数据库中的 ping 变量。还有可选的CDEF,比如可以写CDEF:s=v,1000,/,即令变量s等于v / 1000。这里是逆波兰表达式。'AREA:v#00dd00'表示绘制矩形图,纵轴变量为v,颜色为 #00dd00。画线的话可以用'LINE1:v#00dd00'这样子,LINE后边的数字是线的宽度。

好啦,图像如下: