LINUX.ORG.RU

Эмулировать задержки БД

 , , ,


0

3

Возникли задачи по тестированию бэкенда, связанные со скоростью базы данных (пусть будет PostgreSQL). Не знаю как подойти к задаче, когда нужно проверить работу сервиса с разными задержками обращений к базе. Для HTTP я использовал прокси, моки и подобные инструменты типа WANem, хочется для базы такое же. Влиять на CPU я могу, но считаю этот подход неоптимальным. Внедрять в коде искусственные ожидания еще хуже. Посему вопросов 2.

1. Есть ли такой инструмент?

2. Если делать самому, то с чего начать?

★★★★★

Последнее исправление: Lordwind (всего исправлений: 1)

типа WANem

И почему его нельзя использовать в данном случае? Для приложения как бы без разницы чем вызвана задержка. Но можно и свой tcp прокси на коленке накатать и задерживать ответ.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Сервис на жаве (ЯП не важен) обращается к базе, а не по HTTP. И даже в этом случае пришлось бы разруливать маршрутами кого кидать на прокси, а кого напрямую.

Lordwind ★★★★★
() автор топика
Ответ на: комментарий от untitl3d

не хочется искусственных ожиданий (почему?)

Потому что есть разные реплики для чтения и записи и т.к. они находятся в разных кластерах, то и задержки могут быть разные. Втыкать это в коде кажется очень монструозным.

Lordwind ★★★★★
() автор топика
Ответ на: комментарий от sparks

Ок, им можно резать трафик и латентность с сетевого интерфейса. Как мне разделить трафик к другим микросервисам и к базе, чтобы тестировать только задержки к базе? Если бэк в кубере, мне придется на разные поды разные интерфейсы назначать?

Lordwind ★★★★★
() автор топика
Последнее исправление: Lordwind (всего исправлений: 1)
Ответ на: комментарий от Lordwind

докер все делает через cgroups, года 3 назад я нечто подобное делал, но сейчас чутка приболел и едва соображаю из за температуры, если за пару дней решение не найдешь, то я скину своё, копай в сторону cgroups + tc или tc + network namespace

sparks ★★★★
()

тупо железку потестировать - pgbench и аналоги.
в контексте того что могут предоставить сервисы и насколько кривые запросы в сервисах/организация схемы/индексов - тестируй пиковую нагрузку на сервисы, смотри [не]справлятся ли база на текущем обородувании. делай выводы. в процессе смотри top slow query, их explain plan, io, как генерятся wal и успевают ли они на реплику, использования буферов, нужен ли partitioning и т.д. и т.п.

etwrq ★★★★★
()
Ответ на: комментарий от etwrq

Ты не понял. Речь не про нагрузочное тестирование или поиск медленных запросов, а про функциональное тестирование основного кода в условиях разной латентности базы. Например одна часть кода или сервис пишет данные, другой читает. И тут реплика с чтением переехала на новый кластер и стала отвечать быстрее, чем реплика с записью, а разработчик этого не предусмотрел. А когда это в разных сервисах и написано разными людьми еще и давно, лучше застрелиться чем такое дебажить.

Lordwind ★★★★★
() автор топика
Ответ на: комментарий от Lordwind

Например одна часть кода или сервис пишет данные, другой читает.

пишут и читают в разные реплики? тут ещё время на синхронизацию реплик надо учитывать.

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

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

etwrq ★★★★★
()
Ответ на: комментарий от etwrq

у нас кафка для аналитики больше, а рабочая инфа в базе

тут ещё время на синхронизацию реплик надо учитывать.

хорошее замечание

так отвечает же ж.

вот конкретно то что я видел работало так - метод записи отработал успешно, метод чтения ожидает что будет значение по id, а задержка реплики плавала настолько, что вываливался NPE, который нельзя было поймать в тестовом окружении (ибо там нет реплик)

Lordwind ★★★★★
() автор топика
Ответ на: комментарий от Lordwind

метод записи отработал успешно, метод чтения ожидает что будет значение по id

Это называется синхронной репликацией, не? SET LOCAL synchronous_commit?

x3al ★★★★★
()
Ответ на: комментарий от Lordwind

а задержка реплики плавала настолько, что вываливался NPE

может реплика тупит при применение полученых wal, логи смотрели?

задержка реплики плавала настолько

она как-то мониторится?
тут можно попробовать, на свой страх и риск, streaming replication sync/async - смотря что важнее, данные или время отклика.

NPE, который нельзя было поймать в тестовом окружении (ибо там нет реплик)

это как? т.е. в проде(среде) завели реплику, разделили r w между мастером и стендбаем, не тестируя?

etwrq ★★★★★
()
Ответ на: комментарий от etwrq

может реплика тупит

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

в проде(среде) завели реплику, разделили r w между мастером и стендбаем

нет, в проде r и w разнесены, а на тестинге все в куче, поэтому такие приколы только в проде проверить можно, вот я и думаю как до греха не доводить

Lordwind ★★★★★
() автор топика

Для HTTP я использовал прокси, моки и подобные инструменты типа WANem, хочется для базы такое же.

Так в чём проблема?

Внедрять в коде искусственные ожидания еще хуже.

С чего это вдруг? Подход ровно такой же. Мокаешь соединение к базе данных, и добавляешь там задержку - можешь локально делать sleep, можешь в запросы инжектить. Или берёшь прокси (готовый, или проще выглядит написать свой тупой прокси на уровне сокетов из 20 строк) и добавляешь в нём задержки как тебе надо.

slovazap ★★★★★
()

Все просто, нужно будет для начала написать симулятор оптимизатора постгреса.

Это сарказм, если что. Бери композ, поднимай в нем постгрес (если надо можно даже сварм и поднять на другой тачке) и не парь себе мозг

upcFrost ★★★★★
()