Я использую tcpdump для захвата пакетов UDP и анализа задержки в сети между вещателем UDP и моим сервером. Чтобы вычислить задержку, я сравниваю временные метки хоста-источника, указанные в данных приложения UDP, с временными метками локального «ядра» tcpdump.
Часы двух серверов синхронизированы с точностью до миллисекунды, и допустима задержка до 2 или 3 миллисекунд. Моя машина - это двухъядерный Intel X5670 @ 2,93 ГГц с сетевыми картами Mellanox 10 ГБ и отключенным объединением.
Проблема в том, что я наблюдаю задержку более 10 миллисекунд между двумя хостами, когда частота данных увеличивается, хотя всегда значительно ниже полосы пропускания 10 ГБ. У меня есть 5 заданий tcpdump, работающих одновременно с:
tcpdump -c 0 chrt -f 80 -q -i eth1 net 232.xxx.xxx.xxx and udp port 22456 -s 0 -w myfile
В прошлом у меня был больший успех, чем писать собственную программу дампа с двумя потоками: один поток сетевого чтения с высоким приоритетом и асинхронный поток записи на диск с низким приоритетом, но на этот раз я действительно хотел бы использовать стандартное решение Linux.
Что я могу сделать, чтобы минимизировать задержку чтения tcpdump UDP?
Я бы посоветовал вам попробовать переименовать процесс tcpdump и сбросить трассировку в файл в файловой системе tmpfs. Также вы можете добавить параметр -p в tcpdump, чтобы не переводить интерфейс в беспорядочный режим, что может уменьшить паразитный трафик.
mkdir /tmpfs
mount -t tmpfs -o size=128m none /tmpfs
nice -n -10 tcpdump ... -w /tmpfs/yourfile