Knot XDP & optimizations
Kernel: Knot XDP (AF_XDP) 高性能模式, 需升级内核到 4.18.x(推荐使用 5.x 内核).
version: 3.x
网卡: 建议使用Intel系列多队列支持 XDP 网卡(700系列(i40e),500系列(ixgbe)),
configure
listen-xdp
:
配置 xdp, 格式为 interface@port
:
server:
rundir: "/var/run/knot"
user: knot:knot
listen: [ 127.0.0.1@53, ::1@53 ]
listen-xdp: enp5s0f1@53
Optimizations
DEVNAME=enp5s0f1
# 调整CPU为性能模式
for file in `find /sys/devices/system/cpu/ -name scaling_governor`; do echo performance > $file; done
# 启用 UDP RSS HASH
ethtool -N $DEVNAME rx-flow-hash udp4 sdfn
ethtool -N $DEVNAME rx-flow-hash udp6 sdfn
# 设置网卡 RX/TX channels(queue)
ethtool -L $DEVNAME combined 64
# 设置网卡 RX/TX 硬件描叙符数量
ethtool -G $DEVNAME rx 1024 tx 2048
#
renice -n 19 -p $(pgrep '^ksoftirqd/[0-9]*$')
Limitations
- XDP 只处理UDP请求;
- 不支持 VLAN;
- 不支持 Dynamic DNS;
- MTU 限制 1792 长度;
- 不支持UDP Checksum校验;
- 一个网卡不支持多个
BPF filters
; BPF filter
不支持自动卸载, 需手动执行ip link set dev <ETH> xdp off
;big-endian
字节序平台需重新编译;- Symmetrical routing is required (要求 源/目的 MAC/IP 一致, 有点类似对称哈希, 具体作用不太清楚, 可能是用于XDP TX与RX使用同一个queue id);
kxdpgun
kxdpgun 是 Knot 基于XDP开发的dns性能测试工具, 使用很简单:
Usage: kxdpgun [-t duration] [-Q qps] [-b batch_size] [-r] [-p port] [-F cpu_affinity] [-I interface] -i queries_file dest_ip
-I interface
: knot 3.1 version
-i queries_file
格式:
abc6.example.com. AAAA
a.example.com. NS E
ab.example.com. A D
abcd.example.com. DS D
示例:
./kxdpgun -i name.txt -I enp5s0f1 172.16.41.170 -t 30 -Q 8000000 -F 0xffff
在本地测试环境, CPU E5-2670 X 2 单个域名请求可达到 8Mpps %100 无丢失: