Свойство JMeter nanoThreadSleep - как его использовать?
Я настраиваю решение для нагрузочного тестирования, и, читая документы JMeter, я вижу, что вы можете установить множество свойств для планов тестирования. У меня есть тесты, которые уже выполняются очень хорошо и дают результаты, графики и т. Д., Но когда я попытался получить более глубокое понимание JMeter и точности результатов и тому подобное, я столкнулся с проблемой ниже.
Из документации JMeter я прочитал следующее:
# Whether to use System.nanoTime() - otherwise only use System.currentTimeMillis()
sampleresult.useNanoTime=true
# Use a background thread to calculate the nanoTime offset
# Set this to <= 0 to disable the background thread
sampleresult.nanoThreadSleep=5000
Теперь я понимаю, что nanotime
будет основываться на фиксированном, но произвольном времени происхождения, тогда как currenttimeinmillis
основано на системном времени (т.е. на стене). И я знаю, что nanotime
будет более точным, поэтому я заинтересован в его использовании: я провожу нагрузочное тестирование и мне нужно, чтобы измерения времени отклика были как можно более точными и точными.
Но проблема у меня в том, чтобы понять, как использовать nanoThreadSleep
, Что именно является смещением nanotime? Зачем мне хотеть или не хотеть фоновый поток для вычисления смещения nanotime? Что произойдет, если я позволю JMeter работать с использованием nanotime, но не буду использовать nanoThreadSleep
установка явно?
Я искал в Stackru и Google какое-то объяснение, но не могу найти ничего другого, кроме того, что об этом говорят документы JMeter, в крошечной рекламе, которую я здесь вставил. Могут ли другие помочь мне понять это и как я могу использовать это правильно и эффективно?
1 ответ
Глядя на код JMeter, я нашел интересующий раздел ниже. Так что в основном фоновая нить спит для NANOTHREAD_SLEEP
миллисекунды, а затем, когда он просыпается, он спрашивает время.
Это значение должно оставаться как можно выше, чтобы не увеличивать накладные расходы на выборку, но должно оставаться как можно ниже, чтобы обеспечить достаточную точность.
Если вы не используете nanothread, то все время вычисляются с использованием System.nanoTime(), и это может давать или не давать дополнительную точность. Как правило, на счетчики высокой точности очень сильно влияют изменения частоты (например, из-за режимов энергосбережения). Мое мнение таково, что вам не нужно беспокоиться об использовании System.nanoTime(), потому что вы не сможете получить повторяемость теста с точностью до наносекундного уровня. Даже миллисекунда кажется очень узким интервалом для этого.
Зачем вам использовать фоновый поток для вычисления времени? Я думаю, что это потому, что если поток измеряет только время, вы можете спросить его текущее время в любое время во время выполнения. Если вы не используете фоновый поток, я думаю, что время обновляется только в момент выборки. С включенной веткой думаю это время обновляется чаще (при условии NANOTHREAD_SLEEP
хорошо считается). Я не писал JMeter, но я думаю, что это философия временного потока.
Это полезно? Вероятно, это может выжать дополнительную точность. Однако JMeter используется для тестирования производительности веб-приложений, где повторяемость плохая из-за задержек в сети, использования ресурсов и т. Д. Даже если вы измеряете наносекунды, люди будут больше интересоваться долями в секундах и миллисекундах и тем, что тест повторяется.
КОД:
private static class NanoOffset extends Thread {
private static volatile long nanoOffset;
static long getNanoOffset() {
return nanoOffset;
}
@Override
public void run() {
// Wait longer than a clock pulse (generally 10-15ms)
getOffset(30L); // Catch an early clock pulse to reduce slop.
while(true) {
getOffset(NANOTHREAD_SLEEP); // Can now afford to wait a bit longer between checks
}
}
private void getOffset(long wait) {
try {
TimeUnit.MILLISECONDS.sleep(wait);
long clock = System.currentTimeMillis();
long nano = SampleResult.sampleNsClockInMs();
nanoOffset = clock - nano;
} catch (InterruptedException ignore) {
// ignored
}
}
}