28个稳定版本

2.16.3 2022年6月13日
2.16.2 2022年3月22日
2.15.2 2022年2月24日
2.15.0 2021年12月3日
1.2.0 2019年11月6日

#174Unix API

1,540 星 & 37 关注者

Apache-2.0

450KB
11K SLoC

Rust 10K SLoC // 0.0% comments · Rust 包仓库 C 1K SLoC // 0.1% comments · Rust 包仓库 Shell 178 SLoC // 0.0% comments · Rust 包仓库

Rezolus

Rezolus 是一个用于收集详细的系统性能遥测并通过高分辨率遥测暴露突发模式的工具。Rezolus 提供了对基本系统指标、性能计数器和 eBPF(扩展伯克利包过滤器)遥测的支持。测量是提高性能的第一步。

有关每个指标的详细文档,请参阅 METRICS 文档。

License: Apache-2.0 Build Status: CI

概述

Rezolus 从多个不同的来源收集遥测数据。目前,Rezolus 从传统来源(procfs、sysfs)、perf_events 子系统和 BPF 收集遥测数据。每个采样器实现了一套一致的函数,以便可以轻松添加新的函数以进一步扩展 Rezolus 的功能。

每个遥测来源都进行了过采样,以便我们可以在时间间隔内构建直方图。这个直方图使我们能够捕捉到将出现在远上和远下百分位数的变异性。这种过采样方法是 Rezolus 与其他遥测代理相比的关键区别之一。

Rezolus 支持BPF以及更常见的遥测来源,是一个用于捕获性能异常、分析系统性能和进行性能诊断的非常复杂的工具。

有关底层指标库和采样器设计的更详细信息,请参阅 DESIGN 文档。

特性

  • 传统遥测来源(procfs、sysfs、...)
  • 对硬件性能计数器的 perf_events 支持
  • BPF 支持对内核和用户空间活动的测量
  • 过采样和百分位数指标以捕捉突发情况

传统遥测源

Rezolus 从传统来源(procfs、sysfs)收集指标,以提供 CPU、磁盘和网络的基本遥测。Rezolus 导出 CPU 利用率、磁盘带宽、磁盘 IOPs、网络带宽、网络包速率、网络错误以及 TCP 和 UDP 协议计数器。

这些基本遥测源,当结合过采样来捕捉它们的突发情况时,通常可以提供系统性能的高级视图,并可能迅速指出资源饱和或发生错误的地方。

性能事件

性能事件允许我们报告硬件和软件事件。典型的软件事件包括页面错误、上下文切换和 CPU 迁移。典型的硬件事件包括 CPU 循环、指令完成、缓存命中、缓存未命中以及其他关于底层硬件上工作负载运行的详细指标。

这些指标通常用于高级性能调试以及调优和优化工作。

BPF

通过 BPF 可以公开大量的性能信息,这使得我们可以让 Linux 内核在非常细粒度的层面上进行遥测捕获和聚合。

Rezolus 内置了采样器,可以捕获块 I/O 大小分布、EXT4 和 XFS 操作延迟分布以及调度运行队列延迟分布。您会看到这里我们主要公开了大小和延迟的分布。内核将每个操作的适当值记录到直方图中。然后 Rezolus 从用户空间访问此直方图,并将值传输到其内部存储中,然后将其公开给外部聚合器。

通过在内核中收集遥测数据,我们能够收集关于极高频率发生的事件(例如,任务调度)的数据,同时收集遥测数据时的性能开销最小。BPF 采样器既可以捕获运行时性能异常,也可以描述工作负载。

采样率和分辨率

为了准确反映突发的强度,采样率必须至少是记录最短突发的两倍,以确保至少有一个样本完全重叠事件中的突发部分。对于传统分钟级时间序列,这意味着峰值至少需要 120 秒或更长时间才能在强度方面被准确记录。Rezolus 允许配置采样率,使我们能够在分辨率和资源消耗之间进行权衡。在 10Hz 采样下,200ms 或更长时间的连续突发足以在 pMax 中被准确反映。与之相比,分钟级指标需要 120,000ms,或秒级指标需要 2000ms 的连续突发才能被准确记录。

入门指南

构建

Rezolus 使用标准 Rust 工具链构建,可以通过 rustup 安装和管理,或者按照 Rust 网站 上的说明进行。

本指南的其余部分假设您已选择通过 rustup 安装工具链。

注意:Rezolus 旨在在 Linux 系统上构建和部署,但有一些非常有限的 MacOS 支持以测试整体框架。它专注于为 Linux 系统提供系统遥测。为了获得最佳体验和开发新的采样器,您应该在 Linux 上构建和运行。

从源代码克隆和构建 Rezolus

git clone https://github.com/twitter/rezolus
cd rezolus

# create an unoptimized development build
cargo build

# run the unoptimized binary and display help
cargo run -- --help

# create an optimized release build
cargo build --release

# run the optimized binary and display help
cargo run --release -- --help

# run the optimized binary with the example config (needs sudo for perf_events)
cargo build --release && \
sudo target/release/rezolus --config configs/example.toml

# metrics can be viewed in human-readable form with curl
curl --silent http://localhost:4242/vars

带有 BPF 支持的构建

默认情况下,BPF 支持未编译入。如果您希望生成带有 BPF 支持的构建,请按照以下步骤操作

先决条件

BPF支持需要我们将链接对准BPF编译器集合。您可以使用您发行版提供的版本,也可以从源代码构建BCC并安装。了解您已安装的BCC版本至关重要。Rezolus通过在构建时利用不同的功能标志支持多个版本。

我们的当前策略是支持从Debian Stable或CentOS 7( whichever is older)的发行版仓库中的版本到最新的BCC版本。

此策略涵盖了当前稳定和测试版本的Debian、Ubuntu、CentOS、Fedora、Arch和Gentoo。其他发行版的用户可能需要从源代码构建支持的BCC版本。有关详细信息,请参阅BCC安装指南

构建

如上所述,我们提供不同的功能标志来映射到各种支持的BCC版本。bpf功能将映射到由rust-bcc项目支持的最新版本。对于大多数用户,这将是一个正确的标志。但是,如果您必须链接到一个较旧的BCC版本,您将需要使用更具体的功能标志形式。这些针对特定版本的标志形式为bpf_v0_10_0,其中BCC版本反映在功能名称中。您可以在本项目的Cargo清单中找到功能标志的完整列表。

# create an optimized release build with BPF support
cargo build --release --features bpf
sudo target/release/rezolus --config configs/example.toml

# metrics can be viewed in human-readable form with curl
curl --silent http://localhost:4242/vars

HTTP曝光

Rezolus通过HTTP暴露指标,不同的路径对应不同的曝光格式。

  • 可读性:/vars
  • JSON:/vars.json/metrics.json/admin/metrics.json
  • Prometheus:/metrics

注意:目前,除默认提供JSON曝光外,任何其他路径。此行为可能在将来发生变化,不应依赖于它。

此外,您可以在根级路径/上获取运行的版本。

支持

在GitHub上创建新问题

贡献

我们认为一个友好的社区非常重要,并要求您在与社区的所有互动中遵循Twitter的开源行为准则

作者

可以在GitHub上找到贡献者的完整列表。

关注Twitter上的@TwitterOSS以获取更新。

许可

版权所有2019年Twitter,Inc。

在Apache License,Version 2.0下许可:https://apache.ac.cn/licenses/LICENSE-2.0

安全问题?

请通过Twitter的bug-bounty计划报告敏感的安全问题(https://hackerone.com/twitter),而不是GitHub。

依赖关系

~14–29MB
~469K SLoC