как рассчитать скорость полученных пакетов на ПК с Linux? например, pps или fps

Я пишу сетевую программу, которая может рассчитать точную скорость передачи пакетов данных (пакетов в секунду, кадров в секунду, бит/с). Теперь у меня есть устройство под названием testcenter, которое может отправлять точные потоки на конкретный компьютер (протокол UDP/IP) в Linux, мне нравится знать точный pps (пакетов в секунду) с помощью моей программы, я рассмотрел функцию gettimeofday(&start,NULL) перед вызовом recvfrom() и обновить счетчик пакетов, после этого вызвать gettimeofday(&end,NULL) и получить скорость pps. Я надеюсь, что есть лучшее решение, чем это, поскольку барьер пользователя/ядра преодолевается при системных вызовах. С наилучшими пожеланиями.


person xiaozhu    schedule 13.01.2014    source источник
comment
Привет и добро пожаловать на stackoverflow.com. Пожалуйста, найдите время, чтобы прочитать страницы справки, особенно разделы с именами На какие темы я могу задать здесь? и Какие типы вопросов мне следует избегать? . И что еще более важно, прочтите контрольный список вопросов о переполнении стека. Вы также можете узнать, что такое SSCCE.   -  person Some programmer dude    schedule 13.01.2014


Ответы (2)


Ваше наблюдение о том, что gettimeofday переключается в режим ядра, неверно для Linux на нескольких популярных архитектурах из-за использования vsyscalls. Очевидно, что использование gettimeofday здесь неплохой вариант. Однако вам следует подумать об использовании монотонных часов, см. man 3 clock_gettime. Обратите внимание, что clock_gettime еще не преобразован в vsyscall для такого количества архитектур, как gettimeofday.

Помимо этой опции вы можете установить опцию сокета SO_TIMESTAMP и получать точные временные метки через recvmsg.

person Helmut Grohne    schedule 13.01.2014
comment
Спасибо! вариант сокета SO_TIMESTAMP намного лучше решил мою проблему, ядро ​​​​отправляет входящий пакет данных после того, как MAC rx кадр, я думаю, что это точно. - person xiaozhu; 03.03.2014

Я думаю, вам следует использовать clock_gettime() с CLOCK_MONOTONIC_COARSE. Но это будет точно только до последнего тика. Так что может быть ошибка на 10 секунд миллисекунд. Но это определенно быстрее, чем при использовании CLOCK_MONOTONIC_RAW. Вы также можете использовать gettimeofday, но clock_gettime с CLOCK_MONOTONIC_RAW немного быстрее и имеет более высокое разрешение, чем gettimeofday. Также gettimeofday() дает время настенных часов, которое может меняться даже при переходе на летнее время... Я не думаю, что вам следует использовать его для измерения скорости трафика.

person Vikram Singh    schedule 13.01.2014