第 9 章 避免侦听队列锁争用
队列锁争用可能导致数据包丢弃和更高的 CPU 使用率,因此导致更高的延迟。您可以通过调优应用程序并使用传输数据包控制,来避免接收(RX)和传输(TX)队列上的队列锁争用。
9.1. 避免 RX 队列锁定争用: SO_REUSEPORT
和 SO_REUSEPORT_BPF
套接字选项
在多核系统上,如果应用程序使用 SO_REUSEPORT
或 SO_REUSEPORT_BPF
套接字选项打开了端口,您可以提高多线程网络服务器应用程序的性能。如果应用程序不使用其中一个套接字选项,则所有线程都被强制共享单个套接字来接收传入流量。使用单个套接字会导致:
- 对接收缓冲区的显著竞争,这可能会导致数据包丢弃和更高的 CPU 使用率。
- CPU 使用率的显著增加
- 可能的数据包丢弃

使用 SO_REUSEPORT
或 SO_REUSEPORT_BPF
套接字选项,一个主机上的多个套接字可以绑定到同一端口:

详情请查看 socket (7)
man page 和 /usr/src/debug/kernel- <version>/linux- <version> /tools/testing/selftests/net/reuseport_bpf_cpu.c
文件。
Red Hat Enterprise Linux 提供了一个如何在内核源中使用 SO_REUSEPORT
套接字选项的代码示例。要访问代码示例:
启用
rhel-9-for-x86_64-baseos-debug-rpms
存储库:subscription-manager repos --enable rhel-10-for-x86_64-baseos-debug-rpms
# subscription-manager repos --enable rhel-10-for-x86_64-baseos-debug-rpms
Copy to Clipboard Copied! 安装
kernel-debuginfo-common-x86_64
软件包:dnf install kernel-debuginfo-common-x86_64
# dnf install kernel-debuginfo-common-x86_64
Copy to Clipboard Copied! -
现在,代码示例包括在
/usr/src/debug/kernel- <version>/linux- <version> /tools/testing/selftests/net/reuseport_bpf_cpu.c
文件中。