背景
brpc 作为一种高效的通信库,被广泛引用到许多场景下。但在一些场景下会出现异常。比如当业务请求特别频繁的时候,可能出现瞬间请求暴增,导致server 端服务被打爆的情景。再如当服务端处理繁忙的时候,也可能出现前端请求超时的问题。为了方便大家少走弯路,下面总结了一些常见问题的解决思路和方案。
工具
为了便于分析观察brpc 相关问题,可以打开brpc internal profile 端口,通过端口观察它的bthread利用率、rpc 服务处理频率和耗时。观察方法示例如下:
-
- 从浏览器页面打开profile 端口网页:
http://10.240.6.36:19214/status
- 从浏览器页面打开profile 端口网页:
-
- 观察服务处理的频率和延时:
可以看到上面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 端是否还活着
如果不在线就会出现上面的问题;
-
- 检查server端是否处理太慢
当处理太慢超过客户端设置的超时限制的时候,客户端就会出现超时。这种情况需要去分析server端为什么处理慢,需要尽快加快处理速度。
- 检查server端是否处理太慢