Deep Engineering

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.

Cited in
/en/system-design/caching/stretched-cache

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 lines
Redis 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 добавляет к записи круг до реплики,
  и растёт он с расстоянием один к одному. Что не переносится:
  конкретные числа. Что стоит унести отдельно: вывод, сделанный
  на непроверенном стенде, бывает неверен даже когда он
  осторожен.