KCP improve

This commit is contained in:
2026-05-30 17:50:45 +08:00
parent 661ed401da
commit 56c74337e4
12 changed files with 272 additions and 31 deletions
+28
View File
@@ -15,10 +15,34 @@ LAYLINK_MAX_SEND_BUFFER_BYTES=67108864
# 单连接发送缓冲区上限;单位字节。大文件下载建议 33554432 或 67108864,内存紧张时调小。
LAYLINK_BACKPRESSURE_HIGH_WATERMARK_BYTES=33554432
# 背压触发水位;单位字节。应小于 LAYLINK_MAX_SEND_BUFFER_BYTES,达到后会暂停上游读取直到缓冲排空。
[kcp]
LAYLINK_KCP_BACKEND=ffi
# KCP 实现后端;可选 ffi、php。ffi 使用 native ikcp.c 动态库,生产建议使用;php 是调试回退实现。
LAYLINK_KCP_FFI_LIB=native/kcp/liblaylink_kcp.so
# native KCP 动态库路径;LAYLINK_KCP_BACKEND=ffi 时使用。相对路径按项目根目录解析,先运行 scripts/build-kcp-ffi.sh 构建。
LAYLINK_KCP_NODELAY=1
# KCP nodelay 开关;1 更低延迟,0 更保守。拥堵明显时可保持 1 并调大 interval 或关闭 nc。
LAYLINK_KCP_INTERVAL_MS=10
# KCP 内部 update 间隔;单位毫秒。常用 10、20、30,越小越低延迟但 CPU/发包更高。
LAYLINK_KCP_FAST_RESEND=2
# KCP 快速重传阈值;0 关闭,2 是常见低延迟设置,丢包网络可尝试 2-4。
LAYLINK_KCP_NO_CONGESTION_CONTROL=0
# 是否关闭 KCP 拥塞控制;0 开启拥塞控制更稳,1 更激进但容易挤爆 UDP 发送缓冲。
LAYLINK_KCP_SEND_WINDOW=256
# KCP 发送窗口;越大吞吐潜力越高但更容易拥堵,常用 128、256、512、1024。
LAYLINK_KCP_RECV_WINDOW=512
# KCP 接收窗口;应不小于发送窗口,常用 256、512、1024。
LAYLINK_KCP_MTU_BYTES=1200
# KCP MTU;建议 1200 避免公网路径分片,内网可尝试 1350。
LAYLINK_KCP_TICK_MS=10
# PHP transport tick 间隔;单位毫秒。通常与 LAYLINK_KCP_INTERVAL_MS 一致。
LAYLINK_KCP_UDP_SEND_QUEUE_BYTES=16777216
# UDP EAGAIN 发送队列上限;单位字节。发送缓冲暂满时会排队重试,超过后关闭该 KCP 会话。
LAYLINK_KCP_UDP_FLUSH_PACKETS=256
# 每次 tick 最多刷出的 UDP packet 数;拥堵时可调低到 64 或 128,追求吞吐可调高。
LAYLINK_KCP_OUTPUT_DRAIN_PACKETS=256
# 每次从 native KCP 输出队列搬到 UDP 发送队列的最大 packet 数;调低可减少单个大下载占用事件循环时间。
[client-agent]
NODE_ID=client-01
@@ -75,3 +99,7 @@ POP_AGENT_LISTEN=0.0.0.0:9001
# POP Server 监听 Agent 长连接的地址;格式为 host:port,例如 0.0.0.0:9001 或 127.0.0.1:9001。
POP_ALLOWED_AGENT_TRANSPORTS=tcp,kcp
# POP Server 允许 Client Agent 使用的传输协议;可写逗号数组 tcp,kcp,也可写 JSON 数组 ["tcp","kcp"];当前已实现 tcp、kcpudp 为预留实现。
POP_AGENT_TCP_WORKERS=1
# POP Server TCP Agent listener 的 worker 数量;TCP 模式可按 CPU 和并发提高到 2、4、8。只使用 KCP 时该值不影响 KCP。
POP_AGENT_KCP_WORKERS=1
# POP Server KCP/UDP Agent listener 的 worker 数量;当前必须为 1,因为 KCP 会话状态在单 worker 内维护,多 worker 会导致 UDP 包跨进程丢状态。