VCL 套接字接口
注意
VCL 套接字接口扩展是实验性的,目前正在积极开发中。
注意
这些功能在 Windows 上不支持,有关详细信息,请参阅 VPP 支持的体系结构。
此套接字接口扩展通过 VPP 的 Comms
库 (VCL) 与 fd.io VPP 集成,为 Envoy 提供高速 L2-L7 用户空间网络。
VCL 套接字接口仅包含在 contrib 镜像 中。
示例配置
bootstrap_extensions:
- name: envoy.extensions.vcl.vcl_socket_interface
typed_config:
"@type": type.googleapis.com/envoy.extensions.vcl.v3alpha.VclSocketInterface
default_socket_interface: "envoy.extensions.vcl.vcl_socket_interface"
工作原理
如果启用,该扩展将在 Envoy 引导期间初始化时,通过 VCL 接口 (vcl_interface.h
) 附加到 VCL,进而附加到外部 VPP 进程。这将注册一个主 VCL 工作器,而后续的 Envoy 工作器将在套接字接口扩展检测到其代码正在由尚未向 VCL 注册的 pthread 执行时注册。
由于 libevent 和 VCL 都希望处理异步轮询和 IoHandles
的分发,因此 VCL 接口通过为每个 Envoy 工作器注册与 VCL 工作器的 VPP 消息队列关联的 eventfd 来将控制权委托给 libevent。这些共享内存消息队列由 VPP 用于将 io/ctrl 事件传达给 VCL,而 eventfd 用于在消息队列从空状态转换为非空状态时发出信号。最终这意味着由 VPP 生成的事件会迫使 libevent 将控制权交回给 VCL 接口,VCL 接口会使用内部维护的 epoll fd 来为每个 Envoy 工作器轮询/提取 VCL 中的事件,并随后将它们分发出去。为了支持所有这些间接交互,套接字接口使用自定义的 IoHandle
和 FileEvent
实现,它们在 Envoy 和 VCL API 调用之间进行转换。
安装和运行 VPP/VCL
有关如何构建和/或安装 VPP 的信息,请参见入门指南 此处。假设使用 DPDK 接口,一个也配置主机堆栈的最小 startup.conf
文件将包含
unix {
# Run in interactive mode and not as a daemon
nodaemon
interactive
# Cli socket to be used by vppctl
cli-listen /run/vpp/cli.sock
# Group id is an example
gid vpp
}
cpu {
# Avoid using core 0 and run vpp's main thread on core 1
skip-cores 0
main-core 1
# Set logical CPU core(s) where worker threads are running. For performance testing make
# sure the cores are on the same numa as the NIC(s). Use lscpu to determine the numa of
# a cpu and "sh hardware" in vpp cli to determine the numa of a NIC. To configure multiple
# workers lists are also possible, e.g., corelist-workers 2-4,6
corelist-workers 2
}
buffers {
# Default is 16384 (8192 if running unpriviledged)
buffers-per-numa 16384
}
dpdk {
# Notes:
# - Assuming only one NIC is used
# - The PCI address is an example, the actual one should be found using something like dpdk_devbind
# https://github.com/DPDK/dpdk/blob/main/usertools/dpdk-devbind.py
# - Number of rx queues (num-rx-queus) should be number of workers
dev 0000:18:00.0 {
num-tx-desc 256
num-rx-desc 256
num-rx-queues 1
}
}
session {
# Use session layer socket api for VCL attachments
use-app-socket-api
# Enable VPP session layer
enable
# VPP worker's message queues lengths
event-queue-length 100000
}
手动启动 VPP,获得二进制文件后:./vpp -c startup.conf
可以通过将配置文件添加到 /etc/vpp/vcl.conf
或将 VCL_CONFIG
环境变量指向配置文件来配置 VCL。可以在下方找到一个可用于 RPS 负载测试的最小示例
vcl {
# Max rx/tx session buffers sizes in bytes. Increase for high throughput traffic.
rx-fifo-size 400000
tx-fifo-size 400000
# Size of shared memory segments between VPP and VCL in bytes
segment-size 1000000000
# App has access to global routing table
app-scope-global
# Allow inter-app shared-memory cut-through sessions
app-scope-local
# Pointer to session layer's socket api socket
app-socket-api /var/run/vpp/app_ns_sockets/default
# Message queues use eventfds for notifications
use-mq-eventfd
# VCL worker incoming message queue size
event-queue-size 40000
}