ermouth: (Default)
[personal profile] ermouth

Хэлп нидед ) Разбираюсь с ненормальными задержками в пролезании данных, ситуация описана в одном из недавних постов.

Детали такие:

  • есть два клиентских браузера и сервер между ними
  • в одном браузере в какой-то документ вносится правка, она сохраняется в локальную базу
  • также браузер немедленно пытается отправить правки на сервер, это серия из 2-3 коротких запросов, каждый в пределах килобайта; несколько запросов нужно для согласования дерева ревизий
  • если связи нет, браузер повторяет попытку каждые ~20 секунд, аналогично если репликация завершается с ошибкой
  • браузер на другом конце отслеживает изменения longpoll-запросом, который обрывается и возобновляется каждую минуту
  • этот запрос – подписка на канал изменений в БД, как только в базе что-то поменялось, оно появляется в этом канале
  • подписка на канал имеет параметр since, в котором указывается номер обновления, с которого надо начинать слив; так браузер получает обновления “из прошлого” после обрывов
  • один клиент соединён через 3G, второй через спутник
  • одновременно с браузером работал вайбер, никаких проблем с доставкой сообщений в вайбере не было.

Дополнительно:

  • протокол репликации надёжно работает на 14400 (<2kb/s) с latency  в 1 секунду и обрывами каждые 30 секунд, в рассматриваемом случае мы имеем лучшие условия
  • у меня не воспроизводится проблема ни при каких комбинациях сетевых параметров и нагрузок, худшее, что я смог получить – две минуты задержки
  • в логах сервера ничего не видно, на сервере в БД конфликтов нет (то-есть не было таких ситуаций, что два человека пишут в один документ одновременно)
  • логи в браузерах клиентов уже затёрты, там log rotate и небольшой объём.

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

Тут что-то экзотическое – и скорее всего, сетевое. Может, у кого-то из уважаемых френдов есть догадки?

Date: 2016-10-09 05:45 pm (UTC)
From: [identity profile] net-cat.livejournal.com
Трафик перехватывают. Экзотическое, да. :)

Date: 2016-10-09 06:04 pm (UTC)
From: [identity profile] ermouth.livejournal.com
> Трафик перехватывают

Ога, и на несколько часов придерживают )

Не, думаю тут что-то чисто инженерное, race какой-то.

Date: 2016-10-09 10:31 pm (UTC)
From: [identity profile] morfizm.livejournal.com
У меня так получилось, что я не занимался расследованиями сетевый перформанс issues, так что могу не знать каких-то простых вещей, тулов и пр. Но я иногда обсуждал issues, которые ребята находили, так что поделюсь из общеинтуитивных соображений:

1. Не очень понятно, причём тут вайбер - совершенно непоказательно, на мой взгляд. Ты рассказываешь про проблемы на пути A - B - C (A это клиент, C это клиент на том конце, а B это сервис). Если Вайбер работает так же как Skype, то Вайбер это либо A - C, либо или A - X - C, где X это какой-то сервер вайбера или же один из общих контактов (да, этот сволочной Скайп гоняет шифрованный трафик через общих контактов, если это помогает для более хорошей связи!).

2. Добавь инструментарий, чтобы узнать точно, проблема на куске A - B, B - C или на обоих. Тебе нужен такой протокол логгинга, который скорректирует проблемы несинхронизированных часов.

3. Повторять попытку каждые 20 секунд нужно только если рвётся соединение. В остальных случаях я бы рекомендовал на стороне A тоже держать одно long-poll соединение. Открытие нового TCP соединения это куча оверхеда, но главное - тормозня может возникнуть не просто из-за обмена handshake'ами, а из-за физических промежуточных девайсов (раутеры, свитчи, netscalers, etc). Они могут кэшировать существующие TCP соединения и давать по ним зелёный свет, а для новых соединений тормозить - по куче разных причин (misconfiguration, overload, etc, etc).

4. А ещё, открытие нового соединения - это DNS lookup. Который обычно кэшируется, но это just yet another potential failure point. Ты можешь изолировать эту проблему, если DNS lookup сделаешь вручную отдельным вызовом, а потом будешь открывать повторные соединения по IP. Хотя, опять же, я рекомендую один long poll.

5. Вайбер наверняка использует другой порт. Где-то посередине может быть traffic shaping (QoS или какие-то ограничители по полиси), завязанный на порты.

Date: 2016-10-10 07:50 am (UTC)
From: [identity profile] ermouth.livejournal.com
Спасибо.

1. Вайбер просто показывает, что last mile-ы с обеих сторон не разорваны физически.
2. У меня есть удовлетворительно синхронизированные отсчёты (номер обновление БД, типа USN в Active Directory) и инструментарий есть – только надо доработать логгер, чтобы log rotate не через 500Кб наступал.
3. Держать открытое исходящее POST-соединение никак не выйдет по целому набору причин. Главная: много какой пограничный софт считает атакой несколько открытых пост-запросов, по которым не идут данные.
4. Этой проблемы точно нет.
5. Это я рассматриваю как вариант.

Главная проблема у меня сейчас – нет того оборудования и соединения, с которым были проблемы, и его затруднительно имитировать.

Мне вчера подсказали, что я слишком оптимистичен насчёт latency 1s, для спутника это может быть и больше 2 секунд. На 2-3 секунды latency _всё время_ система действительно не расчитана, можно получить race. Подозреваю, что-то в таком духе и происходит.

Date: 2016-10-10 07:55 am (UTC)
From: [identity profile] morfizm.livejournal.com
1. Понятно.

3. А почему нужен HTTP-POST? Нельзя ли сделать обычное TCP соединение, уровнем ниже, чем HTTP, или JavaScript не даёт нужных APIs?

У спутника действительно может быть "стабильно пару секунд", при некоторых обстоятельствах, конечно. Но, благо, имитировать задержку ведь должно быть нетрудно. Есть жестокий, но простой/быстрый способ: добавь на сервере 2 секунды ко всему и посмотри, не валятся ли другие клиенты :)

Date: 2016-10-10 08:11 am (UTC)
From: [identity profile] ermouth.livejournal.com
> или JavaScript не даёт нужных APIs

Есть вебсокеты ещё, но там проблем больше чем преимуществ в моём случае.

> Есть жестокий, но простой/быстрый способ

Есть ещё быстрее – задать прямо в браузере throttling. Оказывается, Хром даёт не просто набор predefined-настроек, но можно и свои добавлять.

Я вот только что сделал 3s latency и 5кбит/с uplink, и, похоже краешек жопы уже увидел )

Date: 2016-10-10 08:16 am (UTC)
From: [identity profile] morfizm.livejournal.com
Логично, большинство проблем с race conditions должны быть видны и если задержку добавить на клиенте.

Реально плохой коннект - это не просто 3s, а что-то вроде диапазона от 3 до 8, и ещё 10% packet loss. На прошлой работе у нас даже был специальный Wifi ssid, подключившись к которому ты получаешь вот такой лажёвый коннект. Типа потестировать свой мегасерис в более реальных условиях, а то в обычной обстановке там пинги 1-10 мс, скорость 1 гигабит/сек и без packet loss :)

Date: 2016-10-10 08:18 am (UTC)
From: [identity profile] morfizm.livejournal.com
Каждый случай packet loss - это вылет соединения по тайм-ауту. Мне кажется, это тоже нужно симулировать. Может просто в код добавить if random < 0.1, тогда тупо sleep 20 sec & fail, иначе исполнять обычный код.

Date: 2016-10-13 11:38 am (UTC)
From: [identity profile] grayscaler.livejournal.com
Торренты не качают/раздают в это время?

Date: 2016-10-13 11:49 am (UTC)
From: [identity profile] ermouth.livejournal.com
Что ты, какие торренты через мобилу/спутник )

Date: 2016-10-13 12:03 pm (UTC)
From: [identity profile] grayscaler.livejournal.com
Гипотетически - скачали один раз порнушку, и забыли. А оно сидит себе в трее и через любое доступное соединение пытается раздавать.

Profile

ermouth: (Default)
ermouth

November 2021

S M T W T F S
 123456
78910111213
14151617181920
21 222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 1st, 2026 07:54 pm
Powered by Dreamwidth Studios