bvar
bvar
bvar,多线程应用中的高性能计数器。
什么是 bvar?
bvar 是一套计数器,用于在多线程应用中方便地记录和查看各种统计信息。其实现将数据存放在线程本地存储(TLS)中,从而减少缓存弹跳(cache bouncing),在高竞争场景下比 UbMonitor(百度内部的旧版计数库)甚至原子操作都要快得多。brpc 默认集成了 bvar,即服务器中所有对外暴露的 bvar 都可以通过 /vars 访问,单个 bvar 可通过 /vars/VARNAME 寻址。阅读 vars 可了解如何在 brpc 服务器中查询它们。brpc 大量使用 bvar 来暴露内部状态。如果你正在寻找用于采集和展示应用指标的工具,应优先考虑 bvar。bvar 当然无法取代所有计数器,本质上它把写入时发生的竞争转移到了读取时:读取时需要汇总所有线程写入的数据,因此比普通读取慢得多。如果对该计数器的读写都很频繁,或者需要根据最新值做决策,就不应该使用 bvar。
要理解 bvar 的工作原理,请先阅读 explaining cacheline,其中提到的计数器示例正是 bvar。当许多线程修改同一个计数器时,每个线程只写入自己的区域,不参与全局竞争,而所有私有数据在读取时才进行汇总,这比普通读取慢得多,但对于低频率的日志记录或展示来说已经足够。写入速度非常快、开销极小,使用户可以从各个方面监控系统,而不必担心损害性能。这正是我们设计 bvar 的目的。
下图比较了在多线程同时访问时,bvar、原子操作、静态 UbMonitor、动态 UbMonitor 的开销。可以看到,bvar 的开销基本与线程数量无关,且始终很低(约 20 纳秒)。作为对比,在有 24 个线程时,动态 UbMonitor 每次操作需要 7 微秒,相当于使用 bvar 300 次的开销。

添加新的 bvar
阅读 Quick introduction 可了解如何在 C++ 中添加 bvar。bvar 默认已经提供了许多进程级和系统级变量的统计信息,它们以 process_ 和 system_ 为前缀,例如:
process_context_switches_involuntary_second : 14
process_context_switches_voluntary_second : 15760
process_cpu_usage : 0.428
process_cpu_usage_system : 0.142
process_cpu_usage_user : 0.286
process_disk_read_bytes_second : 0
process_disk_write_bytes_second : 260902
process_faults_major : 256
process_faults_minor_second : 14
process_memory_resident : 392744960
system_core_count : 12
system_loadavg_15m : 0.040
system_loadavg_1m : 0.000
system_loadavg_5m : 0.020以及 bRPC 自身使用的其他各类 bvar:
bthread_switch_second : 20422
bthread_timer_scheduled_second : 4
bthread_timer_triggered_second : 4
bthread_timer_usage : 2.64987e-05
bthread_worker_count : 13
bthread_worker_usage : 1.33733
bvar_collector_dump_second : 0
bvar_collector_dump_thread_usage : 0.000307385
bvar_collector_grab_second : 0
bvar_collector_grab_thread_usage : 1.9699e-05
bvar_collector_pending_samples : 0
bvar_dump_interval : 10
bvar_revision : "34975"
bvar_sampler_collector_usage : 0.00106495
iobuf_block_count : 89
iobuf_block_count_hit_tls_threshold : 0
iobuf_block_memory : 729088
iobuf_newbigview_second : 10新导出的文件会覆盖之前的文件,这与常规日志追加新数据的方式不同。
监控 bvar
开启 dump feature of bvar 功能,可将所有暴露的 bvar 导出到文件中,其格式与上述文本相同:每行都是一组“名称”和“值”。开启 dump 后,请检查 $PWD/monitor/ 下是否有数据,例如:
$ ls monitor/
bvar.echo_client.data bvar.echo_server.data
$ tail -5 monitor/bvar.echo_client.data
process_swaps : 0
process_time_real : 2580.157680
process_time_system : 0.380942
process_time_user : 0.741887
process_username : "gejun"监控系统应周期性地汇集每台机器上的数据并将其合并,以提供按需查询。以百度内部的 “noah” 系统为例,bvar 定义的变量会以指标的形式出现在 noah 中,用户可以查看这些指标的历史曲线。


导出到 Prometheus
若要导出到 Prometheus,需将 scraping target url 中的路径设置为 /brpc_metrics。例如,如果 brpc server 运行在 localhost:8080 上,则 scraping target 应为 127.0.0.1:8080/brpc_metrics。
最后修改于 2022年5月17日:更新 brpc 用户页面 (devlive-community/knowforge#71) (a31ce10d3)
评论
登录后参与评论
KnowForge