[English]
Use arena for brpc
brpc在调用用户的service前,需要在内部先完成Request和Response的实例构建,并在service前后执行对应的正反序列化。默认采用动态堆内存分配模式创建,对于比较复杂的结构,内存分配释放和Message结构的构建和析构可能也会带来可见的开销。
Protobuf在3.x之后增加了Arena分配功能,针对复杂结构提供了聚集分配和释放能力。较新版本的brpc也提供了Protobuf arena组件进行支持。在这些基础上,通过应用arenastirng可以针对string成员实现进一步加速。
除了使用原生的Arena,也可以使用babylon::SwissMemoryResource实现内存池加速。babylon::SwissMemoryResource通过可定制的定长分页重用机制,可以进一步提升灵活性。
性能演示
CPU: AMD EPYC 7W83 64-Core Processor, taskset 0-3 core
QPS: 800
- Default (mode: 0)
- latency_percentiles: “[2213,2523,3232,3670]”
- process_cpu_usage : 1.172
- process_memory_resident : 44978722
- Arena (mode: 1)
- latency_percentiles: “[1318,1490,1794,1984]”
- process_cpu_usage : 0.702
- process_memory_resident : 41421824
- Arena & ArenaString (mode: 1, arenastring patch)
- latency_percentiles: “[1055,1196,1416,1583]”
- process_cpu_usage : 0.572
- process_memory_resident : 39732770
- SwissMemoryResource & ArenaString (mode: 2, arenastring patch)
- latency_percentiles: “[1006,1139,1341,1478]”
- process_cpu_usage : 0.551
- process_memory_resident : 44763136