Измерение времени между переходами в сети (JAVA)

Я пытаюсь собрать данные о времени, которое требуется HTTP-запросу для перехода от одного узла к другому в сети, вот простая топология сети, над которой я работаю: я использую Raspberry Pi 4 модель B

     PC ---- RaspPi(1) ---- RaspPi(2) ---- RaspPi(n) ---- ...

У каждого из этих узлов есть собственное приложение, которое может работать с HTTP, идея сбора данных такова: предположим, у меня есть HTTP-запрос с RaspPi (n) в качестве пункта назначения, теперь, когда запрос проходит через каждый узел, я вышел из системы. TIMESTAMP, когда он достигает узла, с этого момента я могу вычислить DeltaT, то есть время, необходимое для прохождения моего запроса между двумя последовательными узлами.

Я пробовал использовать:

Date now = Calendar.getInstance();
TimeStamp ts = new TimeStamp(now.getTime());

А также

System.currentTimeMillis()

чтобы получить TIMESTAMP, проблема в том, что собранные мной данные имеют отрицательное значение DeltaT, например: TIMESTAMP в RaspPi (2) предшествует TIMESTAMP в RaspPi (1). Я немного поискал и обнаружил, что 2 метода, которые я использовал выше, не монотонны (Источник 1 и Источник 2). Итак, я подумываю использовать еще один метод - использовать System.nanoTime(), но он, похоже, не работает на разных JVM, а это все мои сетевые узлы.

Я не знаю, есть ли лучший подход к сбору этих данных или какая-то работа, которую я могу сделать, чтобы исправить те методы, которые я использовал.

Пожалуйста, дайте мне знать, если я не ясно выразился. Спасибо за прочтение.


person Nguyen Nam    schedule 25.09.2020    source источник
comment
Почему бы вам не использовать вместо этого java.time? stackoverflow.com/a/32975887/2928853   -  person jrook    schedule 25.09.2020


Ответы (1)


Чтобы узнать время на настенных часах, используйте System.currentTimeInMillis.

System.nanoTime может быть в значительной степени произвольным и должен использоваться для измерения продолжительности операции на одном узле / машине. Вы получите произвольные результаты, если попытаетесь использовать его для измерения разницы во времени между двумя разными компьютерами.

В некоторых случаях System.curentTimeInMillis может вернуться назад но я думаю, вы с большей вероятностью столкнетесь с проблемами, вызванными несовершенной синхронизацией системных часов на этих машинах - в целом это сложно и также зависит от того, какие временные интервалы вы обычно ожидаете измерять (микросекунды, миллисекунды?).

Ознакомьтесь с протоколом NTP и тем, как поддерживать синхронизацию часов, и относитесь к полученным результатам с недоверием. Вот полезная информация по этой теме: https://codeburst.io/why-shouldnt-you-trust-system-clocks-72a82a41df93 - интересная штука:

Согласно Google, в часах есть дрейф на 6 мс, который синхронизируется каждые 30 с.

Интересный документ, относящийся к теме: Синхронизация часов для одностороннего Измерение задержки: опрос

person Juraj Martinka    schedule 27.09.2020
comment
Вы правы, NTP - это ответ на синхронизацию сетевых часов, спасибо: D - person Nguyen Nam; 03.10.2020