百度brpc 发压工具rpc_press解析

1. 背景

昨天看到一段brpc中的压测代码rpc_press, 看着不错。整理一下。
发压工具的难点不是发送请求,而是要注意下面的2点:

  • 保证能发出足够的qps,比如上万qps
  • 控制发送合理的qps,比如控制为5qps,不可以大量发压

2. brpc 中的是关键实现

2.1 如何确保发送足够qps

rpc_press 采用多线程发送。
对于上万qps,多线程来分摊,每个线程发送qps控制在一定范围内。

2.2 如何控制合理qps

这是难点,线程如何控制发送qps。
看下面公式,1000000us(1s)需要发送200请求, 那50请求需要多少时间了?这就是brpc控制压力的核心原理。

核心原理: rpc_press中根据目前发送请求的速度与应该的速度进行比较,来判断是继续发压,还是usleep

2.3 rpc_press 代码

这里贴一点rpc_press工作线程git代码(引用自brpc)

void RpcPress::sync_client() {
    double req_rate = _options.test_req_rate / _options.test_thread_num;
    //max make up time is 5 s
    if (_msgs.empty()) {
        LOG(ERROR) << "nothing to send!";
        return;
    }
    const int thread_index = g_thread_count.fetch_add(1, butil::memory_order_relaxed);
    int msg_index = thread_index;
    std::deque<int64_t> timeq;
    size_t MAX_QUEUE_SIZE = (size_t)req_rate;
    if (MAX_QUEUE_SIZE < 100) {
        MAX_QUEUE_SIZE = 100;
    } else if (MAX_QUEUE_SIZE > 2000) {
        MAX_QUEUE_SIZE = 2000;
    }
    timeq.push_back(butil::gettimeofday_us());
    while (!_stop) {
        brpc::Controller* cntl = new brpc::Controller;
        msg_index = (msg_index + _options.test_thread_num) % _msgs.size();
        Message* request = _msgs[msg_index];
        Message* response = _pbrpc_client->get_output_message();
        const int64_t start_time = butil::gettimeofday_us();
        google::protobuf::Closure* done = brpc::NewCallback<
            RpcPress,
            RpcPress*,
            brpc::Controller*,
            Message*,
            Message*, int64_t>
            (this, &RpcPress::handle_response, cntl, request, response, start_time);
        const brpc::CallId cid1 = cntl->call_id();
        _pbrpc_client->call_method(cntl, request, response, done);
        _sent_count << 1;

        if (_options.test_req_rate <= 0) {
            brpc::Join(cid1);
        } else {
            int64_t end_time = butil::gettimeofday_us();
            int64_t expected_elp = 0;
            int64_t actual_elp = 0;
            timeq.push_back(end_time);
            if (timeq.size() > MAX_QUEUE_SIZE) {
                actual_elp = end_time - timeq.front();
                timeq.pop_front();
                expected_elp = (int64_t)(1000000 * timeq.size() / req_rate);
            } else {
                actual_elp = end_time - timeq.front();
                expected_elp = (int64_t)(1000000 * (timeq.size() - 1) / req_rate);
            }
            if (actual_elp < expected_elp) {
                usleep(expected_elp - actual_elp);
            }
        }
    }
}

3. 参考

原文地址:https://www.cnblogs.com/xudong-bupt/p/9485080.html

时间: 2024-10-18 20:27:17

百度brpc 发压工具rpc_press解析的相关文章

Linux压缩解压工具--日常学习

Date:2017-04-08 命令(对应格式):gzip(.gz)  bzip2(.bz2)  xz(.xz)  compress(.z)   tar(.tar) 1.gzip 语法:gzip  选项  FILE 常用选项:-d   -#    -c (1)-d(decompressiom):解压 解压的方式有两种:"gizp  -d   FILE" 和"gunzip  FIEL" eg: tmp]# ls -lh messages(-h:human-readdb

百度地图瓦片生成工具

http://www.cnblogs.com/milkmap/ 百度地图瓦片生成工具http://download.csdn.net/download/bq_cui/5790805 免费软件. 新版下载地址:http://blog.csdn.net/bq_cui 2013.7.21 可以生成切片及代码. bug:地图级别切换时图像位置跳跃导致不平滑. 说明: 请自己到百度免费申请密钥,替换t.html文件中“您的密钥”. 申请地址 http://lbsyun.baidu.com/apiconso

基于oracle SQL Developer Data Modeler建模工具,解析xml,生成etljet代码

今天准备在 @zhangkai05 写的小工具model_sql基础上,进一步完善功能,使其更加自动化.方便建模人员开发etl任务. 源代码更改后 ,会发布到 git(url地址)上,逐步完善. 描述现状及问题 团队 数据仓库建模在2013年下开始使用 oracle sql developser datamodeler建模工具,之前一直用 powerdesigner,但由于后者是商业收费软件,公司又不打算购买.故经过调研,转向oracle建模工具.虽然其 易用性与 power designer

AB-web服务的测压工具

AB测压工具 ab-web service压力测试工具 ab [option][http[s]]://hostname[:port]/path 请求数:-n requests 并发数: -c concurrency 长连接: -k [[email protected] html]# ab -n 1000 -c 10  https://10.1.45.70/index.txt This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copy

免费百度地图矢量下载工具V5.7使用文档

免费百度地图矢量下载工具V5.7发布了,可以在 https://download.csdn.net/download/niudieyi/10669822 下载.没有CSDN积分的可以加QQ群 732173652 下载.主要更新为POI下载提供简单和复杂版本的关键字.同时提供了软件使用文档. 最近闲来无事,写了一个使用文档.内容如下: 免费百度地图矢量数据爬取器V5.7使用手册 一.软件安装 软件无需安装,直接运行文件夹下的 "百度地图矢量数据下载.exe" 即可 二.软件使用 软件主界

邓西百度知道刷赞工具

邓西百度知道刷赞工具(邓西百度知道刷赞工具,百度知道刷赞,谁有百度知道刷赞软件,百度知道赞怎么刷,百度知道刷赞工具,百度刷赞软件,百度点赞机)是一款专门百度知道营销的软件,这个主要是在抢占热门问答流量的时候有用,起到提升回复或评论排名,增加可信度的作用. 本软件特点: 1:可以对知道的回复进行刷赞操作: 2:可以对知道的评论进行刷赞操作: 3:可以对知道的回复踩操作. 联系QQ:6458450 邓西百度知道点赞工具下载地址: 百度网盘:https://pan.baidu.com/s/1lpouU

文件压缩、解压工具类。文件压缩格式为zip

package com.JUtils.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; impor

Java 爬虫工具Jsoup解析

Jsoup是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据. jsoup 的主要功能如下: 1. 从一个 URL,文件或字符串中解析 HTML: 2. 使用 DOM 或 CSS 选择器来查找.取出数据: 3. 可操作 HTML 元素.属性.文本: jsoup 是基于 MIT 协议发布的,可放心使用于商业项目. jsoup 可以从包括字符串.URL

百度云分享工具 |百度云批量分享工具 |百度网盘批量分享工具

作者QQ:6458450下载地址:http://down.chinaz.com/soft/38271.htm 百度云分享工具是一款专门用于自动批量分享百度云文件的软件.大家都知道,在百度云盘中分享文件,只能手工一条条地点击"分享",如果想分享很多文件,操作会非常辛苦.本软件完全模拟在网页上登录百度云盘,模拟手工点击,将分享的"公共链接"或"私密链接"保存起来,供查询导出,极大地解放人工操作 ,提高工作效率. 本软件特点:1:完全模拟人工操作,不会