背景

brpc 作为一种高效的通信库,被广泛引用到许多场景下。但在一些场景下会出现异常。比如当业务请求特别频繁的时候,可能出现瞬间请求暴增,导致server 端服务被打爆的情景。再如当服务端处理繁忙的时候,也可能出现前端请求超时的问题。为了方便大家少走弯路,下面总结了一些常见问题的解决思路和方案。

工具

为了便于分析观察brpc 相关问题,可以打开brpc internal profile 端口,通过端口观察它的bthread利用率、rpc 服务处理频率和耗时。观察方法示例如下:

    1. 从浏览器页面打开profile 端口网页:
      http://10.240.6.36:19214/status
    1. 观察服务处理的频率和延时:

可以看到上面server端处理brpc的延时大概30ms左右。

场景1:bthread 打爆

现象

E1201 21:29:06.761580 44635 /home/chenlei6/essd-demo/third-party/brpc/src/bthread/task_group.cpp:672] _remote_rq is full, capacity=2048
E1201 21:29:07.564314 44661 /home/chenlei6/essd-demo/third-party/brpc/src/bthread/task_group_inl.h:91] _rq is full, capacity=4096

解决办法

在server端加了个并发度的防御, 示例如下:

 rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.HandleBrpcIO") =
            FLAGS_max_brpc_io_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.AllocBlock") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.DeleteBlock") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.AddReplica") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.GetBlocks") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.GetServerStatistic") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.ChangeBlockStatus") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.QueryBlockMaxSeqId") =
            FLAGS_max_control_request_concurrency;
    rpc_server_->MaxConcurrencyOf("kunlun.proto.dbs.ManageService.AlignReplicaData") =
            FLAGS_max_control_request_concurrency;

场景2:brpc client端超时

现象

[WARN][2022-09-01 10:58:02 575209][23219][1662001042526809][rpc_client.hpp:PostCall:160][server:10.177.18.141:18401, cmd:Register, code:kServiceUnavailableException, msg:[E1008]Reached timeout=5000ms @10.177.18.141:18401, cost:5000768us]
[WARN][2022-09-01 10:58:02 575229][23219][data_server.cc:Register:258][fail to send AddDataServer request to serverid:155111419168737]
[WARN][2022-09-01 10:58:02 575446][23219][1662001042526809][rpc_client.hpp:PostCall:160][server:10.177.18.144:18401, cmd:Register, code:kServiceUnavailableException, msg:[E111]Fail to connect Socket{id=4 addr=10.177.18.144:18401} (0x0x443f0f0): Connection refused [R1][E112]Not connected to 10.177.18.144:18401 yet, server_id=4 [R2][E112]Not connected to 10.177.18.144:18401 yet, server_id=4 [R3][E112]Not connected to 10.177.18.144:18401 yet, server_id=4, cost:208us]

解决办法

可以参考下面流程去排查:
* 1. 检查server 端是否还活着
如果不在线就会出现上面的问题;

    1. 检查server端是否处理太慢
      当处理太慢超过客户端设置的超时限制的时候,客户端就会出现超时。这种情况需要去分析server端为什么处理慢,需要尽快加快处理速度。