MEASUREMENT
bench/stretched-cache/runs/waitcost.txt
The script that produced the numbers in the article, and the record of the run. The file is read from the repository at build time — this is the code that was run, not a copy of it.
The run below is recorded in Russian. It is a lab record, kept in the language it was written in; the numbers, the tables and the code read the same either way.
Record of the run
This measurement has no recorded run — only the script.
Script
50 linesRedis 7.0.15 · один хост, два процесса
20 записей на строку, медиана; клиент ходит к мастеру
напрямую, задержка стоит только на канале мастер — реплика
10. ЦЕНА WAIT РАСТЁТ ВМЕСТЕ С РАССТОЯНИЕМ, И ЭТО ПРОВЕРЯЕТСЯ
------------------------------------------------------------------
в одну сторону круг обычная с WAIT 1 WAIT / круг
5 мс 10 мс 0.15 мс 10.90 мс 1.09
20 мс 40 мс 0.14 мс 41.52 мс 1.04
40 мс 80 мс 0.20 мс 81.40 мс 1.02
Последний столбец — то, ради чего замер и поставлен. Если бы
цена WAIT была фиксированным числом кругов, он был бы одним и
тем же на всех трёх строках. Он и есть один и тот же, и равен
единице: WAIT стоит РОВНО ОДИН круг.
Разности между строками говорят то же самое:
круг вырос на 30 мс, цена WAIT — на 30.62 мс (в 1.02 раза)
круг вырос на 40 мс, цена WAIT — на 39.87 мс (в 1.00 раза)
Сверх круга остаётся немного, и это не расстояние, а работа
самого Redis:
при 5 мс в одну сторону: 10.90 - 10 = 0.90 мс сверх круга
при 20 мс в одну сторону: 41.52 - 40 = 1.52 мс сверх круга
при 40 мс в одну сторону: 81.40 - 80 = 1.40 мс сверх круга
ИСТОРИЯ ЭТОГО БЛОКА СТОИТ ТОГО, ЧТОБЫ ЕЁ ЗНАТЬ, потому что
ошибались тут дважды и по-разному.
Сначала в статье стояло объяснение «82 мс — это два круга»,
выведенное из одной точки. Этот замер его опроверг: на трёх
расстояниях отношение к кругу было 5.20, 2.10 и 1.55, то есть
никаким фиксированным числом кругов цена не описывалась.
Вместо объяснения тогда осталось честное «сверх круга есть
слагаемое в 42-44 мс, и чем оно вызвано, замер не
устанавливает».
Устанавливает блок 11, и ответ оказался про прибор, а не про
Redis: у ретранслятора, изображавшего канал, не был выставлен
TCP_NODELAY, и пара «алгоритм Нейгла — отложенное
подтверждение» добавляла ровно эти сорок миллисекунд. Флаг
выставлен, замер переснят — и картина стала простой: WAIT
стоит один круг плюс полторы миллисекунды.
Что переносится: WAIT добавляет к записи круг до реплики,
и растёт он с расстоянием один к одному. Что не переносится:
конкретные числа. Что стоит унести отдельно: вывод, сделанный
на непроверенном стенде, бывает неверен даже когда он
осторожен.