我使用 tcpdump 捕获 UDP 数据包并分析 UDP 广播器与我的服务器之间的网络延迟。为了计算延迟,我将 UDP 应用程序数据中报告的源主机时间戳与 tcpdump 本地“内核”时间戳进行比较。
两台服务器时钟同步到毫秒精度,最多 2 或 3 毫秒的延迟是可以接受的。我的机器是双 6 核 Intel X5670 @2.93Ghz,配备 10Gb Mellanox NIC 并禁用合并。
问题是,当数据频率上升时,我观察到 2 个主机之间的延迟超过 10 毫秒,尽管始终远低于 10Gb 带宽。我同时运行 5 个 tcpdump 作业:
tcpdump -c 0 chrt -f 80 -q -i eth1 net 232.xxx.xxx.xxx and udp port 22456 -s 0 -w myfile
过去,我曾使用 2 个线程编写自己的转储程序并取得了更好的成功:一个高优先级的网络读取器线程和一个低优先级的磁盘写入器异步线程,但这次我真的很想使用标准的 Linux 解决方案。
我该怎么做才能尽量减少 tcpdump UDP 读取延迟?
答案1
我建议您尝试重新调整 tcpdump 进程,并将跟踪转储到 tmpfs 文件系统上的文件中。您还可以向 tcpdump 添加 -p 选项,以便不将接口置于混杂模式,这可能会减少寄生流量。
mkdir /tmpfs
mount -t tmpfs -o size=128m none /tmpfs
nice -n -10 tcpdump ... -w /tmpfs/yourfile