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系统调用