Flow field in the configuration
Flow
是 ZBProxy 的重要内容,中文为 流控
,在 ZBProxy 3.0 中正式加入,通过提供多种用户可选的流控模式,极大提升了数据转发的性能和速率,在众多反向代理程序中拥有最高的性能比。
在 ZBProxy 中,我们提供了 auto
流控,并设为默认流控,在各个平台都可以自动选择最合适的流控模式,方便用户的使用。
即使这样,我们也建议用户了解以下流控模式的工作原理白话文,以及相关优化方法,以便精确地选择最符合自己的流控模式。
请先阅读
https://github.com/XTLS/Xray-core/discussions/59
据原文数据指出, net.ipv4.ip_forward
和 net.ipv6.conf.all.forwarding
会大幅影响网络效率,经我本人测试,ZBProxy 的转发效率也会受到这两个设置影响。
建议仔细阅读此文,若不需要 Linux 转发功能,请于 /etc/sysctl.conf
中检查并关闭这两个功能。
auto
auto
并不是一个实际的流控模式,而是一个自动选择器。
在 Linux 环境下,auto
会自动选择使用 linux-zerocopy
。
在 其他 环境下,auto
会自动选择使用 multiple
。
⚠️注意:以上为当前版本 master
分支的选择情况,在今后的版本和其他分支中可能会有所不同,应以您使用的副本的实际情况为准。
linux-zerocopy
/ zerocopy
所有的网络连接事实上都是由系统内核实现并托管,编程语言通过调用系统函数来进行网络操作。因此,在往常的转发过程中,所有数据先会被系统内核读入系统缓冲区,然后再由程序复制到程序的输入缓冲区,并通过程序设计复制到程序的输出缓冲区,最后再通过系统函数调用再复制到系统缓冲区,接着才是通过网络接口发送出去。
因此,传统的转发会产生众多无意义的缓冲区和缓冲区复制,而且系统缓冲区和程序缓冲区之间的复制会产生内核和应用层面的上下文切换,严重影响性能。ZeroCopy 技术的想法是删减掉两个程序缓冲区,减少上下文切换次数;合并两个系统缓冲区,通过 pipe
直接连同网络输入和网络输出。linux-zerocopy
实现了这样的功能,在生产环境中可以减少一倍的内存消耗和大量CPU复制损耗,大幅提升转发速率。
该流控仅支持使用 Linux 内核的系统,如 Debian GNU/Linux、Ubuntu、CentOS、OpenWRT 和 Android。
multiple
此流控会在平台支持时执行多缓冲区读写操作,即同时把数据读入多个缓冲区和从多个缓冲区写入网络接口。
初始化状态下,上下行方向各使用 1 个 8 KiB 的缓冲区。各方向将持续跟踪数据流,并根据数据量的变化最高膨胀到单方向 8 个 8 KiB 缓冲区,从而达到自动优化吞吐量的效果。
目前全平台(除 Wasm)都实现了此流控模式,因此 Windows 等用户可以选择此流控。
origin
使用经典的拷贝操作,并在上下行方向各使用一个固定的 32 KiB 的缓冲区。
该模式延迟、速率较为稳定,适合作为非 Linux 平台下的备选流控。