资讯动态

brpc /connections 内置服务全解析:连接状态查看、统计指标与三种连接模式

发布时间:2026/9/13 23:10:15 来源:尧图企业网站定制
brpc /connections 内置服务全解析连接状态查看、统计指标与三种连接模式【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址: https://gitcode.com/GitHub_Trending/brpc/brpcbrpcbetter RPC为每个 server 进程内置了名为/connections的 HTTP 服务可实时查看当前进程持有、接受的所有连接。本文以 docs/cn/connections.md 为核心结合 src/brpc/builtin/connections_service.cpp 等源码系统讲解该页面的三段式结构、每个统计列的含义以及单连接、连接池、短连接三种连接模式的判定方法帮助你快速定位连接异常、评估连接健康状况。一、什么是 /connections 服务/connections是 brpc 内置服务builtin service之一通过访问http://server_ip:port/connections即可打开示例页面前缀见 docs/cn/connections.md。它由 src/brpc/builtin/connections_service.cpp 中的ConnectionsService::default_method实现内部调用Acceptor::ConnectionCount()与Acceptor::ListConnections()收集连接列表再逐一输出统计。从 src/brpc/builtin/connections_service.cpp 可以看到该页面支持 HTML 与纯文本两种输出浏览器访问返回 HTML 表格表头带排序脚本curl 等命令行工具请求则返回纯文本。页面底部还会以 gzip 方式压缩响应。一个典型的页面输出如下取自原文档server_socket_count: 5 | CreatedTime | RemoteSide | SSL | Protocol | fd | BytesIn/s | In/s | BytesOut/s | Out/s | BytesIn/m | In/m | BytesOut/m | Out/m | SocketId | | -------------------------- | ------------------- | ---- | --------- | ---- | --------- | ---- | ---------- | ----- | --------- | ---- | ---------- | ----- | -------- | | 2015/09/21-21:32:09.630840 | 172.22.38.217:51379 | No | http | 19 | 1300 | 1 | 269 | 1 | 68844 | 53 | 115860 | 53 | 257 | | 2015/09/21-21:32:09.630857 | 172.22.38.217:51380 | No | http | 20 | 1308 | 1 | 5766 | 1 | 68884 | 53 | 129978 | 53 | 258 | | 2015/09/21-21:32:09.630880 | 172.22.38.217:51381 | No | http | 21 | 1292 | 1 | 1447 | 1 | 67672 | 52 | 143414 | 52 | 259 | | 2015/09/21-21:32:01.324587 | 127.0.0.1:55385 | No | baidu_std | 15 | 1480 | 20 | 880 | 20 | 88020 | 1192 | 52260 | 1192 | 512 | | 2015/09/21-21:32:01.325969 | 127.0.0.1:55387 | No | baidu_std | 17 | 4016 | 40 | 1554 | 40 | 238879 | 2384 | 92660 | 2384 | 1024 | channel_socket_count: 1 | CreatedTime | RemoteSide | SSL | Protocol | fd | BytesIn/s | In/s | BytesOut/s | Out/s | BytesIn/m | In/m | BytesOut/m | Out/m | SocketId | | -------------------------- | -------------- | ---- | --------- | ---- | --------- | ---- | ---------- | ----- | --------- | ---- | ---------- | ----- | -------- | | 2015/09/21-21:32:01.325870 | 127.0.0.1:8765 | No | baidu_std | 16 | 1554 | 40 | 4016 | 40 | 92660 | 2384 | 238879 | 2384 | 0 | channel_short_socket_count: 0说明上面示例来自原文档。在较新版本的源码实现中HTML 模式还额外增加了Local、RecentErr、nbreak、Rtt/Var(ms)等列见 src/brpc/builtin/connections_service.cpp纯文本模式同样包含Rtt/Var(ms)列。实际输出以你运行的 brpc 版本为准。二、页面的三段式结构原文档指出上述信息分为三段第一段server_socket_countserver 接受accept的连接即外部客户端连入本进程的连接。第二段channel_socket_countserver 作为下游发起方、通过brpc::Channel建立的单连接虚拟连接。fd 为 -1 的即为虚拟连接它对应第三段中所有相同 RemoteSide 的连接。第三段channel_short_socket_countserver 与下游的短连接或连接池pooled connections中的物理连接这些连接从属于第二段中相同 RemoteSide 的虚拟连接。从源码角度看第一段由Acceptor维护Acceptor::ConnectionCount()返回_socket_map.size()见 src/brpc/acceptor.cpp第二、三段由SocketMapList()填充见 src/brpc/socket_map.cpp随后同样调用PrintConnections输出。三段的连接数之和就代表当前进程在三个层面的连接规模被连入的连接数、主动建立的虚拟连接数、虚拟连接背后的物理连接数。对照源码可以印证这种虚拟连接 物理连接的两层模型虚拟连接是brpc::Channel通过SocketMap复用的主连接对应Socket对象本身连接池中的物理连接挂在虚拟连接之下。源码在输出前会调用ptr-HasSocketPool()、ptr-GetPooledSocketStats(numfree, numinflight)统计连接池中空闲free与在途inflight的 socket 数量见 src/brpc/socket.cpp并在 Protocol 列以协议名*数量的形式标注例如baidu_std*8表示该虚拟连接背后有 8 个池化连接短连接场景则表现为大量的、独立的物理连接fd 各不相同从属于相同的 RemoteSide 虚拟连接。另外注意Acceptor::ConnectionCount()的注释说明该计数在多线程并发修改下只是粗略计数not accurate count页面顶部server_socket_count只是当前时刻的快照值。三、表格各列含义速查以下每列含义均直接继承自 docs/cn/connections.md 并补充了源码细节RemoteSide远端的 IP 和端口。在较新版本中可通过 gflagshow_hostname_instead_of_ip改为显示主机名默认false见 src/brpc/builtin/connections_service.cpp 与 NameOfPoint 的实现。SSL是否使用 SSL 加密。若为Yes一般是 HTTPS 或启用 TLS 的连接-表示 SSL 状态未知如 TCP 连接尚未完成握手No表示未加密见SSLStateToYesNosrc/brpc/builtin/connections_service.cpp。Protocol使用的协议可能为baidu_std、hulu_pbrpc、sofa_pbrpc、memcache、http、public_pbrpc、nova_pbrpc、nshead_server等。协议名来自InputMessenger::NameOfProtocol对 nshead 服务会显示其 Service 类名见 src/brpc/builtin/connections_service.cpp。若为连接池中的连接会显示为协议名*池内连接数无法识别时显示-h2 协议在非 SSL 场景下显示为h2c。fdfile descriptor文件描述符可能为 -1。fd 为 -1 的行代表虚拟连接第二段实际流量由第三段中的物理连接承载。BytesIn/s上一秒读入的字节数。In/s上一秒读入的消息数消息是对 request 和 response 的统称。BytesOut/s上一秒写出的字节数。Out/s上一秒写出的消息数。BytesIn/m上一分钟读入的字节数。In/m上一分钟读入的消息数。BytesOut/m上一分钟写出的字节数。Out/m上一分钟写出的消息数。SocketId内部 id用于 debug用户不用关心。在 HTML 页面中它同时是一个指向/sockets/SocketId的链接点击可查看该 socket 的更详细状态。秒级与分钟级两类统计均由Socket::GetStat填充见 src/brpc/builtin/connections_service.cpp 与 src/brpc/socket.h 中的SocketStat底层使用滑动窗口计数器实时累计。四、三种连接模式的典型形态原文档给出了三张典型截图分别对应三种连接形态图片位于 docs/images 目录单连接single connection连接池pooled connections短连接short connections三张截图的核心区别可以这样看| 形态 | Protocol 列 | fd | 说明 | | ---- | ----------- | -- | ---- | | 单连接 |baidu_std池化时形如baidu_std*N | 具体 fd 值 | 一条虚拟连接即一条物理连接 | | 连接池 |协议名*N如baidu_std*8 | 池内物理连接的 fd | 虚拟连接下挂多个池化 socket数量 N 是空闲在途之和 | | 短连接 |-或对端信息 | 各不相同 | 每条请求独立建立连接用完即断 |从源码看PrintConnections输出前会对每个连接执行ptr-PeekAgentSocket(agent_sock)若存在 agent socket 则用其替换显示见 src/brpc/builtin/connections_service.cpp这保证统计的是真正承载流量的物理连接随后对存在 socket pool 的连接调用GetPooledSocketStats统计池内数量并据此拼接 Protocol 列的*N后缀src/brpc/builtin/connections_service.cpp。五、连接类型与协议的默认形态为什么同一张页面里既有单连接又有连接池和短连接这取决于客户端使用的协议与连接方式。根据 docs/cn/client.md 中的协议说明不同协议的默认连接方式不同baidu_std百度标准协议docs/cn/baidu_std.md默认单连接httphttp/1.0 或 http/1.1默认连接池Keep-Aliveh2、h2:grpc默认单连接thrift默认连接池memcache、redis默认单连接nova_pbrpc默认连接池。而连接方式本身可细分为三种模式同样见 docs/cn/client.md单连接客户端与对端只建立一个连接全部流量走这一条连接。连接数少、系统调用开销低但如果客户端数量少或负载差异大可能出现对端 RS 热点连接池pooled客户端与对端可建立多个连接数量约为一段时间内的最大并发度让负载分散到多个下游实例适合缓解单连接热点短连接每次请求临时建立连接用完即断适合低频或非常规请求。在/connections页面中这三种模式会分别体现为第二段的单条虚拟连接单连接、第三段中同一 RemoteSide 下的多条池化连接连接池、以及第三段中大量短命连接短连接。六、常用调优与排查技巧连接数超限默认最多展示 1024 条连接统计这是 gflagmax_shown_connections的软限制DEFINE_int32(max_shown_connections, 1024, ...)见 src/brpc/builtin/connections_service.cpp。当连接数超过限制时页面尾部会提示 Stop printing more connections...此时可在 URL 后追加?givemeall一次性拉取全部连接src/brpc/builtin/connections_service.cpp。注意该参数是软限制且拉取全部连接可能较慢应谨慎使用。显示主机名设置 gflagshow_hostname_instead_of_iptrue可将 RemoteSide 从 IP:端口 显示为主机名便于人工识别对端。连接健康度较新版本中第二段channel表格额外提供Local本地端口、RecentErr近期错误数、nbreak隔离次数和Rtt/Var(ms)TCP 采样 RTT 及其抖动来自TCP_INFO见 src/brpc/builtin/connections_service.cpp等列可用于快速判断某个下游连接是否存在抖动或反复错误。配合 /sockets 与 /vars 使用HTML 页面中点击 SocketId 可跳转/sockets/SocketId查看单个连接的详细状态同时可结合 docs/cn/vars.md 中介绍的 bvar 指标如连接数、读写字节数做趋势观测。命令行快速查看由于页面支持纯文本输出可以直接用 curl 拉取分析例如curl http://127.0.0.1:8000/connections输出即为纯文本表格便于脚本化解析和告警。七、总结/connections是 brpc 运维体系中查看连接状态的第一入口它以三段式结构server 接受的连接、Channel 虚拟连接、池化/短连接完整呈现了进程内外部的连接拓扑以秒级和分钟级两组读写统计辅助评估流量再以fd、Protocol、Rtt/Var等字段帮助定位异常连接。结合 docs/cn/connections.md 与 src/brpc/builtin/connections_service.cpp 阅读你可以在实际部署中快速判断单连接、连接池与短连接的运行形态为连接数规划与故障排查提供直接依据。【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址: https://gitcode.com/GitHub_Trending/brpc/brpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价