当前位置: 首页 > 文档资料 > Swoole 内核开发 >

RingBuffer环形内存池

优质
小牛编辑
131浏览
2023-12-01

swoole1.7.2中开始使用RingBuffer来做数据包的管理。1.7.2之前的版本,都是直接使用unix socket来发送数据。存在几个缺点:

  • 数据尺寸受到内核限制,最大不超过8180字节
  • 依赖内核unix_dgram_qlen参数,如果未调整内核参数,在极端情况下导致系统忙等,浪费CPU
  • 至少4次内存复制,消耗较多

RingBuffer环形内存池的优点:

  • 没有任何内存碎片,是非常高效的内存管理手段
  • 从数据投递到数据接收,仅需2次内存复制

当然RingBuffer仅仅可用在顺序申请释放的场景下,不是通用的内存管理技术。但在服务器端编程方面使用非常广泛。使用RingBuffer后,

  • 数据包大小将不受限制,一次IPC就可以投递整个数据包
  • 内存复制操作大大减少,性能得到了提升
  • dispatch_mode=3模式下,单个请求的数据包长度可以任意大

示例程序中单个请求的数据包超过了1.5M。之前的方式,需要调用unix socket 将近200次send系统调用操作
使用RingBuffer后,只需1次unix socket send系统调用