brpc学习:bvar
一.介绍
bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。
brpc集成了bvar,http接口下的/vars可查看所有曝光的bvar,/vars/VARNAME可查阅某个bvar,在brpc中的使用方法请查看vars。
brpc大量使用了bvar提供统计数值,当你需要在多线程环境中计数并展现时,应该第一时间想到bvar。
但bvar不能代替所有的计数器,它的本质是把写时的竞争转移到了读:读得合并所有写过的线程中的数据,而不可避免地变慢了。当你读写都很频繁或得基于最新值做一些逻辑判断时,你不应该用bvar。
常用的bvar有:
• bvar::Adder : 计数器,默认0,varname << N相当于varname += N。
• bvar::Maxer : 求最大值,默认std::numeric_limits::min(),varname << N相当于varname = max(varname, N)。
• bvar::Miner : 求最小值,默认std::numeric_limits::max(),varname << N相当于varname = min(varname, N)。
• bvar::IntRecorder : 求自使用以来的平均值。注意这里的定语不是“一段时间内”。一般要通过Window衍生出时间窗口内的平均值。
• bvar::Window : 获得某个bvar在一段时间内的累加值。Window衍生于已存在的bvar,会自动更新。
• bvar::PerSecond : 获得某个bvar在一段时间内平均每秒的累加值。PerSecond也是会自动更新的衍生变量。
• bvar::LatencyRecorder : 专用于记录延时和qps的变量。输入延时,平均延时/最大延时/qps/总次数 都有了。
• bvar::Status:记录和显示一个值,拥有额外的set_value函数。
• bvar::PassiveStatus:按需显示值。在一些场合中,我们无法setvalue或不知道以何种频率setvalue,更适合的方式也许是当需要显示时才打印。用户传入打印回调函数实现这个目的。
二. bvar的导出
最常见的导出需求是通过HTTP接口查询和写入本地文件。前者在brpc中通过内置的http服务提供(即通过/vars/xxx访问),后者则已实现在bvar中,默认不打开。
1. bvar_dump方式
可以通过flag打开:
当bvar_dump_file不为空时,程序会启动一个后台导出线程以bvar_dump_interval指定的间隔更新bvar_dump_file,其中包含了被bvar_dump_include匹配且不被bvar_dump_exclude匹配的所有bvar。
注意:bvar程序必须要在持续运行中,才会记录下bvar,一闪而过的简单程序,不会记录下bvar值。
三.通过bvar_dump方式导出示例代码
#include <bvar/bvar.h>
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <iostream>using namespace std;int main(int argc, char* argv[]) {google::ParseCommandLineFlags(&argc, &argv, true);bvar::Adder<int> g_read_error;g_read_error << 10 << 20;g_read_error.expose("add_reader");bvar::Status<int> foo_count2;foo_count2.expose("foo_count2");for(int i=0; i<2000; ++i) {foo_count2.set_value(i);int a;cin >> a;if(a == 0){break;}}return 0;
}
编译:
cc_binary(name = 'bvar',srcs = 'bvar.cpp',deps = ['#brpc','#gflags','#glog']
)
flag文件bvar.gflags:
-bvar_dump=true
-bvar_dump_interval=1
运行后,在当前目录会生成monitor文件夹,进入后会产生两个文件:
bvar.bvar.data
bvar.bvar.system.data
带system的bvar记录了系统监控值,第一个文件里记录了add_reader和foo_count2值:
bvar_add_reader : 30
bvar_bthread_key_count : 0
bvar_bthread_keytable_count : 0
bvar_bthread_keytable_memory : 0
bvar_bthread_stack_count : 0
bvar_bvar_dump_interval : 1
bvar_bvar_sampler_collector_usage : 0.000225182
bvar_foo_count2 : 4
默认bvar_dump_interval是10s,即每10s更新一次文件,可以设置短一点,看出效果,每执行一次循环,bvar_foo_count2值就加1。
四.http获取bvar示例代码
当然也可以通过brpc内置的http服务获取bvar。
如果你的程序只使用了brpc的client或根本没有使用brpc,但你也想使用brpc的内置服务,只要在程序中启动一个空的server就行了,这种server称为dummy server。
只要在程序运行目录建立dummy_server.port文件,填入一个端口号(比如8888),程序会马上在这个端口上启动一个dummy server。在浏览器中访问它的内置服务,便可看到同进程内的所有bvar。
示例代码:
#include <bvar/bvar.h>
#include <iostream>
#include <brpc/server.h>using namespace std;int main(int argc, char* argv[]) {brpc::StartDummyServerAt(8080);bvar::Status<int> foo_count2;foo_count2.expose("foo_count2");for(int i=0; i<2000; ++i) {foo_count2.set_value(i);int a;cin >> a;if(a == 0){break;}}return 0;
}
编译文件与上面一样,运行后,就可以像brpc那样,通过访问http接口就可以访问所有的bvar了。
如访问foo_count2这个bvar,就通过下面的url访问:
http://192.168.12.32:8080/vars/foo_count2
brpc学习:bvar相关推荐
- brpc学习笔记(1)
文章目录 一.简介及各个文档学习 1.1 bvar 1.2 bthread 1.3 client 1.4 server 1.5 内置服务 1.6 工具 参考 一.简介及各个文档学习 brpc是一款RP ...
- brpc源码学习(六)- brpc server 端整体流程
brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比 ...
- brpc源码学习(五)-IOBuf
目录 Block BlockRef IOBuf 主要api tls优化 IOPortal protobuf接口 首先放上官方介绍: brpc使用butil::IOBuf作为一些协议中的附件或http ...
- brpc源码学习(二)-bthread的创建与切换
brpc引入m:n的线程模型,固定的内核线程调度运行大量的bthread以避免内核线程上下文切换带来的开销. bthread类似协程,即用户态线程,bthread的切换不会陷入内核,不会进行一系列内存 ...
- brpc线程模型学习
bthread是brpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability和cache locality. "M:N ...
- brpc源码学习(一)-butex
由于brpc中引入了bthread,如果在bthread中使用了mutex,那么将会挂起当前pthread,导致该bthread_worker无法执行其他bthread,因此类似pthread和fut ...
- 百度开源RPC框架brpc
9 月 14 日,百度正式在 GitHub 上基于 Apache 2.0 协议开源了其 RPC 框架 brpc.brpc 是一个基于 protobuf 接口的 RPC 框架,在百度内部称为" ...
- 2021SC@SDUSC BRPC代码分析(七) —— bthread综述、Butex及mutex详解
2021SC@SDUSC 文章目录 一.bthread的背景知识学习 二.代码分析 总结 一.bthread的背景知识学习 经过前面6篇代码分析,我将BRPC一个极其实用的工具--bvar做了全面系统 ...
- 这可能是东半球最保姆级的后台服务器开发学习路线
作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...
最新文章
- js 自动关闭html页面,JS关闭窗口或JS关闭页面的几种代码分享
- 何谓程序员?何谓中国的程序员?
- Java 中使用反射来创建对象、调用方法
- 动静分离-静态资源缓存控制
- AJAX框架衣柜内部布局,​最合理的衣柜内部布局解析,3大细节不容小觑
- linux mysql general_利用mysql general log 写shell 可行性简要分析
- 【KDD20】TAdaNet: 用于图增强元学习的任务自适应网络
- 源码剖析panic与recover,看不懂你打我好了!
- [PTA]7-24 约分最简分式
- c语言switch例题注释,switch语句例子大全 C语言switch语句例题
- CodeForces - 140C New Year Snowmen
- 【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】
- 快手二面:a==1 a==2 a==3 是 true 还是 false?
- Mac恢复被修改的文档
- python运维脚本简书_通过python+selenium3实现浏览器刷简书文章阅读量
- nnet3-chain-copy-egs用于chain模型输入数据
- 网络安全入门实验04:病毒专杀工具的制作
- UReport2 - 套打实现
- 【案例】“1GB1年1毛钱“——使用 Backup exec 基于阿里云OSS 实现企业数据异地备份 【服务器管理】【云备份】
- 本原多项式和不可约多项式
热门文章
- 电话交换机和网络交换机_网络中交换机的介绍和工作
- 【每日最爱一句】2013.07.18
- java jmf播放mp3_关于jmf不能播放mp3的问题解决
- 什么是消费者需求研究
- 市场复苏下:报复性消费,了解一下~
- 无法识别usb设备如何解决
- vue2.0自学教程(一):走进vue2.0大观园
- linux制作deepin启动盘制作工具,深度启动盘制作工具(Deepin Boot Maker)下载_深度启动盘制作工具(Deepin Boot Maker)官方下载-太平洋下载中心...
- leetcode回溯算法
- sim7600ce 拨号上网测试_SIM7600CE TCP/IP连接与PPP拨号上网 4G上网