Я пишу сетевую программу, которая может рассчитать точную скорость передачи пакетов данных (пакетов в секунду, кадров в секунду, бит/с). Теперь у меня есть устройство под названием testcenter, которое может отправлять точные потоки на конкретный компьютер (протокол UDP/IP) в Linux, мне нравится знать точный pps (пакетов в секунду) с помощью моей программы, я рассмотрел функцию gettimeofday(&start,NULL)
перед вызовом recvfrom()
и обновить счетчик пакетов, после этого вызвать gettimeofday(&end,NULL)
и получить скорость pps. Я надеюсь, что есть лучшее решение, чем это, поскольку барьер пользователя/ядра преодолевается при системных вызовах. С наилучшими пожеланиями.
как рассчитать скорость полученных пакетов на ПК с Linux? например, pps или fps
Ответы (2)
Ваше наблюдение о том, что gettimeofday
переключается в режим ядра, неверно для Linux на нескольких популярных архитектурах из-за использования vsyscalls. Очевидно, что использование gettimeofday
здесь неплохой вариант. Однако вам следует подумать об использовании монотонных часов, см. man 3 clock_gettime
. Обратите внимание, что clock_gettime
еще не преобразован в vsyscall для такого количества архитектур, как gettimeofday
.
Помимо этой опции вы можете установить опцию сокета SO_TIMESTAMP
и получать точные временные метки через recvmsg
.
Я думаю, вам следует использовать clock_gettime() с CLOCK_MONOTONIC_COARSE. Но это будет точно только до последнего тика. Так что может быть ошибка на 10 секунд миллисекунд. Но это определенно быстрее, чем при использовании CLOCK_MONOTONIC_RAW. Вы также можете использовать gettimeofday, но clock_gettime с CLOCK_MONOTONIC_RAW немного быстрее и имеет более высокое разрешение, чем gettimeofday. Также gettimeofday() дает время настенных часов, которое может меняться даже при переходе на летнее время... Я не думаю, что вам следует использовать его для измерения скорости трафика.