Pull to refresh
85
0
Vladimir Kononov @Pono

Пользователь

Send message

Спасибо за уточнение. В ту же копилку можно добавить и ngx_http_reqstat_module от того же tengine, да. Что я пытался сказать - что есть способы достать из nginx метрики. И чего я не могу понять из статьи - так это мотивации делать то, что описано

Максим, а можете, пожалуйста, немножко развернуть мотивацию такого бутерброда? В предисловии к статье я вижу три пункта:

Коммерческая версия Nginx предлагает решение в виде проверок работоспособности из модуля ngx_http_upstream_hc_module: периодически запрашивается какой-то URL (или просто пытается открыть порт), и, если тот или иной бэкенд не отвечает, его временно исключают из рабочего списка.

tengine предоставляет модуль активных хелсчеков: https://github.com/alibaba/tengine/tree/master/modules/ngx_http_upstream_check_module

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

Это решается и в опенсорсной версии в ngx_http_limit_req_module: limit_req zone=... burst=... без ключа nodelay.

Вы знаете его пределы и, например, не хотите пускать больше ста пользователей за раз

Если же подразумевалось, что инстансы nginx должны иметь синхронизированные счетчики - то не проще ли не решать это вовсе, а воспользоваться рейтлимитером на стороне приложения? Тем более, что известны его пределы. Причем в качестве примера приведено вообще единомоментное количество пользователей, а не rps - то есть вообще другой домен, который с ограничением rps связан слабо.

отсутствие встроенного способа получения вменяемой статистики по распределению трафика по бэкендам

Это же решается с https://github.com/vozlt/nginx-module-vts

Т.е. вижу что, но не могу понять зачем

Это in-house разработка, которую в опенсорсе, увы, не посмотреть. Передал коллегам идею для одной из следующих статей.

Отличный момент!
Нет, не смотрели в силу используемого стека. Да, в Linux алгоритм Нейгла используется по умолчанию и для отключения нужно нужно явно вызывать setsockopt с TCP_NODELAY. В Go, тем не менее, TCP-сокеты по умолчанию создаются с флагом TCP_NODELAY:
https://github.com/golang/go/blob/release-branch.go1.18/src/net/tcpsock.go#L206-L224
https://github.com/golang/go/blob/release-branch.go1.18/src/net/tcpsockopt_posix.go#L15


Каноническая имплементация gRPC на C++ также проставляет TCP_NODELAY:
https://github.com/grpc/grpc/blob/master/src/core/lib/iomgr/socket_utils_common_posix.cc#L234-L249
https://github.com/grpc/grpc/blob/136055b043dcf2b15f69f535f659e4090cf25b9f/src/core/lib/iomgr/tcp_server_utils_posix_common.cc#L177
https://github.com/grpc/grpc/blob/136055b043dcf2b15f69f535f659e4090cf25b9f/src/core/lib/iomgr/tcp_client_posix.cc#L79


Наверняка пошли бы копать в эту сторону, если бы tcpdump не показал, что каждая из сторон считала, что отсылает свою часть работы вовремя. Но это была бы уже другая статья :)

В большинстве случаев, которые я видел и не могу на них влиять, ваша K8S нода работает внутри VM от VMware или т.п. с share физическими ядрами из пула

Я правильно понимаю, что речь про условные 4*50%vCPU-виртуалки? Т.е. четыре виртуальных ядра, но гарантируется только 0.5с процессорного времени на ядро в секунду? Такие виртуалки да, для критичного к задержкам трафика использовать не рекомендуется — и предпочтительнее взять машинку 2*100%vCPU с гарантированными ядрами. Серьёзные cloud-провайдеры не будут запускать на этих ядрах ничего, что не относится к вашей виртуалке. Далее путь уже зависит от сетевого стека конкретного cloud-провайдера.


Яндекс.Облако, например, может вынести сетевой оверхед на отдельные ядра, которые не видны из гостевой системы: https://cloud.yandex.ru/docs/compute/concepts/software-accelerated-network
AWS может прокинуть виртуальную функцию физической сетевой карты: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking.html


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


И как замерить шумность облачной среды не понятно имея доступ только во внутрь гостевой ОС (VM)

В случае VMWare — начать с обновления ядра гостя. В 2020 году Алексей Махалов и Томер Зельцер добавили поддержку steal time:
https://lore.kernel.org/all/202003211432.57Hu5M7W%25lkp@intel.com/T/

NBS в Яндекс-Облаке реализован поверх YDB, в 2018 рассказывали про это:
https://www.youtube.com/watch?v=Kr6WIYPts8I&t=12861s
https://cloud.yandex.ru/docs/ydb/public_talks#about-cloud

Да, ровно так дело и обстоит: это могли быть и другие ядра той же NUMA-ноды.
Что до того, что ядра берутся именно HT-парами: это сделано для того, чтобы меньше вымывался кеш инструкций.

Пробежался глазами по ридми — да, утилита может раскидать прерывания лесенкой. Но всё равно нужно будет прокинуть флажки --banirq — номера прерываний для которых до SCM ещё нужно как-то доставить. procfs и статистика с сетевой карты в диагностике не сильно помогут, к сожалению.


Q: I see that workload is distributed fine, but there is a lot of workload. How to go deeper, how to understand what my system doing right now?
A: Try perf top

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

Пардон, мой ответ неполон без контекста, который я не донёс в статье: речь идёт о машинках без swap, на которых крутятся stateless-сервисы. Единственная disk-related активность этих сервисов — логи в stdout контейнера, которые оседают на диске.

Это, разумеется, была одна из гипотез — но проблема наблюдалась даже у stateless-сервисов, которые не пишут логов.

А как отлавливали проблемные трейсы? Получается, нужно каждый трейс автоматически проверять на "гепы"? Понятно, что как-то это решается, но интересно вдруг есть элегантное решение, чем просто просто перебирать спаны?

Все трейсы, разумеется, проверять не нужно — тестовое приложение-клиент писало в логи trace_id только аномально длинных запросов. Эти trace_id искались в wireshark с помощью простого совпадения по строке (find packet -> string), а вся сессия находилась через follow -> tcp stream


А с чем связано ограничение в 10 мс?

Только с тем, что приложение было написано так, чтобы отправлять запрос раз в десять миллисекунд. Цифра в 10мс была выбрана достаточно большой, чтобы отделить от штатно отработавших запросов-ответов (1мс), но в то же время не сильно большой, чтобы отловить "микрозатыки".

В приведённом примере машинка с двумя процессорами, по 24 физических / 48 гипертредовых ядер на сокет — итого 96 логических ядер, нумерованных от 0 до 95. Две гипертредовых пары мы вынесли под сетевые прерывания — ядра 1 и 49, 2 и 50. 0,3-48,51-95 — это просто свёрнутое представление всех остальных ядер на этой машинке. На каком-нибудь твоём сервере или виртуалки нужные числа будут другие — нужно смотреть топологию конкретной железки
image

Вы слишком серьёзны в своём анализе первоапрельского видео из 2013 года :)

Анкету можно давать либо при выселении, либо положить в номер и попросить заполнить к выселению.

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

По наблюдениям, цикл поддержки удлиняется на два года примерно каждые два года.

И это замечательно, в этом сейчас они лидеры рынка.


При этом с новым SDK можно вполне написать приложение, работающее на старых устройствах — просто нужно не дёргать селекторы и классы новых АПИ (или проверять их существование заранее), и выставить Deployment Target соответственно интересующей системе.

Жаль, что с коммерческими приложениями так не выйдет — потому что пользователи заклюют за отсутствие очередной важной новой фичи из последнего апдейта iOS. И у пользователя устройства, объявленного устаревшим, даже нет опции установки старой версии.

Я просто напомню, что 32-битные айфоны и айпады перестали поддерживаться в iOS 11. В 2018 году

Скажите это оригинальному айфону, который превратился в тыкву с выходом iOS4 — apple перестали принимать в app store приложения, скомпилированные со старой версией SDK.

Спасибо, буду иметь в виду. Рим-Милан и Милан-Флоренция на нужные мне даты стоили как frecciarossa.

Статистика от Italo не согласна с вашим экспириенсом :)
https://habr.com/ru/company/tuturu/blog/474976/#comment_20864560

Несмотря на то, что впечатления говорят об обратном, простые электрички (treni regionali) в Италии расписание соблюдают лучше, чем все эти frecciaross-ы.
Вот данные за прошлый год:
https://www.trenitalia.com/content/dam/tcom/en/info-and-contacts/Quality_Report_2018.pdf


За 2018 было полностью отменено:


SERVICE TYPE        % TRENI SOPPRESSI
Medium- and long-distance trains 0.76
International trains             1.68
Regional trains                  0.16

Из тех, что не отменили вовсе, задерживали отправление более чем на пять минут:


SERVICE TYPE              % DELAY >5’
Medium- and long-distance trains 10.6
International trains             23.6
Regional trains                   5.6

Что до прибытия в пункт назначения, trenitalia мухлюют с цифрами и оглашают "прибытие без опоздания или с опозданием меньше чем на час" в одном бакете. Т.е. не хотят, чтобы публика офигела от количества опозданий на 40 минут:


SERVICE TYPE              % DELAY<60’ 60’~120’ >120’
Medium- and long-distance trains 98.4      1.2   0.4
International trains             98.3      1.3   0.4
Regional trains                  99.9      0.1   0.0

У поездов Italo, дорогих и скоростных, всё еще хуже:
https://italospa.italotreno.it/static/upload/qua/quality-report-2017.pdf
Всего в точку назначения опоздало: 62.5%
из них:


Delay < 60': 60.4%
Delay < 120': 1.7%
Delay > 120': 0.5%
1
23 ...

Information

Rating
Does not participate
Location
Россия
Works in
Date of birth
Registered
Activity