SlideShare a Scribd company logo
1 of 20
Download to read offline
Порядок преодоления болота на маршруте
Как не надо писать приложения, основанные на протоколе TCP




                Артём Гавриченков
Основано на реальных событиях
• NOT AN AD!
• Распределённая сеть Qrator
   ●
      "кастомный" TCP/IP "снизу"
    ●
        "кастомный" протокол управления "сверху"
    ●
        опыт работы с большим числом Web-серверов и Web-
        браузеров, включая самописные
    ●
        2 года дебаг^W совершенствования продукта
Проблемы
• TCP не обеспечивает гарантированную доставку
  сообщения.
Спокойно.
Проблемы
• TCP не обеспечивает гарантированную доставку
  сообщения за гарантированное время. Так лучше?
• Первоочерёдная задача – проектирование
  таймаутов
• Ресурсы (включая время) на любое действие
  пользователя должны быть ограничены
• Бездействие – это тоже действие
Таймауты
• между recvfrom()
• между запросами
• время запроса
• время сессии
• время жизни любой проектируемой сущности
• Long polling может быть плохой идеей
Пример
• Slowloris (Apache): DoS сервера с одного ПК
• Slow HTTP POST
   ●
       Apache, IIS, Lighttpd: DoS сервера с одного ПК
   ●
       Nginx: DDoS сервера с ботнета
От времени к пространству
Content-Length
●
    Ресурсы на любое действие пользователя
    должны быть ограничены
●
    В "кастомный протокол" должно закладываться
    ограничение на размер передаваемых данных
●
    Сервер и клиент должны контролировать это
    ограничение
errno(3)
●
    Закрытие соединения не означает успешную
    передачу данных
●
    После recvfrom(), sendto(), etc. проверяйте errno
    ●
        ENOMEM
    ●
        ECONNRESET
    ●
        EANYTHING
Пример
●
    Internet Explorer: скачивание файла успешно
    заканчивается при ECONNRESET
    ●
        Статус соединения не проверяется
    ●
        Content-Length не проверяется
Лимиты памяти
●
    Используемые ресурсы должны быть ограничены
    сверху
    ●
        ENOMEM
●
    Используемые ресурсы должны быть ограничены
    снизу
    ●
        Нет ресурсов → idle wait → ECONNRESET
Latency
●
    Троекратное рукопожатие занимает время
●
    Нужно реализовывать persistent-соединения
    ●
        сразу, чтобы не городить костыли потом
Историческая справка о костылях
●
    TCP
    ●
        T/TCP
●
    HTTP/1.0
    ●
        HTTP/1.1
Оптимизация
●
    Прежде всего:
    ●
        Measure!
    ●
        Profile!
    ●
        Emulate packet loss!
Оптимизация
●   Текстовые протоколы удобны для отладки
    ●   Отлаживать придётся
●   Использование бинарных протоколов, как
    правило, – преждевременная оптимизация
●   Потом, всегда есть BSON и Google Protocol Buffers
Оптимизация
●
    Опции TCP-сокета:
    ●
        TCP_NODELAY: отключение алгоритма Нейгла,
        ускорение при малых порциях данных
    ●
        TCP_CORK (Linux): для отсылки порций данных
        в одном TCP-сегменте
    ●
        "socket corking"
Оптимизация
●
    Опции TCP-стека:
    ●
        Linux: /proc/sys/net/**
         –   net.ipv4.tcp_fin_timeout
         –   net.ipv4.tcp_{,r,w}mem
         –   net.core.{r,w}mem_max
    ●
        Windows:
        HKLMSystemCurrentControlSetServicesTcpipParameters
Одной строкой
●
    SO_REUSEADDR
●
    sendfile(2)
●
    select(2)/poll(2)/epoll(7)
●
    {n,h}to{n,h}{s,l}()
●
    int64_t vs long
●
    IPv6
Спасибо за внимание
Artyom Gavrichenkov <ximaera@highloadlab.com>

More Related Content

What's hot

Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Ontico
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Ontico
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
Ontico
 
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Fuenteovejuna
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Ontico
 
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
Использование AMQP в основе архитектуры бэкенда для мобильного приложенияИспользование AMQP в основе архитектуры бэкенда для мобильного приложения
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
phpdevby
 
Kubasov 1 7_deploy
Kubasov 1 7_deployKubasov 1 7_deploy
Kubasov 1 7_deploy
kuchinskaya
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
AvitoTech
 

What's hot (20)

Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
 
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
 
Multithreading in go
Multithreading in goMultithreading in go
Multithreading in go
 
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
Асинхронная обработка данных: RabbitMQ, Comet
Асинхронная обработка данных: RabbitMQ, CometАсинхронная обработка данных: RabbitMQ, Comet
Асинхронная обработка данных: RabbitMQ, Comet
 
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual MachinesTMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
 
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
 
Инкапсуляция сетевой топологии при помощи ПКС
Инкапсуляция сетевой топологии при помощи ПКСИнкапсуляция сетевой топологии при помощи ПКС
Инкапсуляция сетевой топологии при помощи ПКС
 
Тестирование QoS на экспериментальном стенде
Тестирование QoS на экспериментальном стендеТестирование QoS на экспериментальном стенде
Тестирование QoS на экспериментальном стенде
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластере
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
 
Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]
 
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
Использование AMQP в основе архитектуры бэкенда для мобильного приложенияИспользование AMQP в основе архитектуры бэкенда для мобильного приложения
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
 
Kubasov 1 7_deploy
Kubasov 1 7_deployKubasov 1 7_deploy
Kubasov 1 7_deploy
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
 
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
 

Viewers also liked

Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
HLL
 
Александр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabАлександр Крижановский, NatSys Lab
Александр Крижановский, NatSys Lab
Ontico
 
Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...
Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...
Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...
HLL
 
Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...
Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...
Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...
HLL
 
Влияние сетевых аномалий на доступность ресурсов
Влияние сетевых аномалий на доступность ресурсовВлияние сетевых аномалий на доступность ресурсов
Влияние сетевых аномалий на доступность ресурсов
HLL
 
Russian Internet Core: политики маршрутизации
Russian Internet Core: политики маршрутизацииRussian Internet Core: политики маршрутизации
Russian Internet Core: политики маршрутизации
HLL
 
Актуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернетеАктуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернете
Max Lapshin
 
Циклы маршрутизации на междоменном сетевом уровне
Циклы маршрутизации на междоменном сетевом уровнеЦиклы маршрутизации на междоменном сетевом уровне
Циклы маршрутизации на междоменном сетевом уровне
HLL
 

Viewers also liked (20)

DDoS: Practical Survival Guide
DDoS: Practical Survival GuideDDoS: Practical Survival Guide
DDoS: Practical Survival Guide
 
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
 
Detecting Autonomous Systems Relationships
Detecting Autonomous Systems RelationshipsDetecting Autonomous Systems Relationships
Detecting Autonomous Systems Relationships
 
Александр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabАлександр Крижановский, NatSys Lab
Александр Крижановский, NatSys Lab
 
Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...
Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...
Тандемные DDoS-атаки / Проблематика уязвимостей в спецификации TCP/IP (фундам...
 
Beyond the botnet
Beyond the botnetBeyond the botnet
Beyond the botnet
 
Dumb Ways To Die: How Not To Write TCP-based Network Applications
Dumb Ways To Die: How Not To Write TCP-based Network ApplicationsDumb Ways To Die: How Not To Write TCP-based Network Applications
Dumb Ways To Die: How Not To Write TCP-based Network Applications
 
DDoS-атаки в 2011 году: характер и тенденции
DDoS-атаки в 2011 году: характер и тенденцииDDoS-атаки в 2011 году: характер и тенденции
DDoS-атаки в 2011 году: характер и тенденции
 
Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...
Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...
Архитектура центра очистки трафика (ЦОТ): решения уровня оператора связи и ко...
 
Динамика DDoS-атак в России
Динамика DDoS-атак в РоссииДинамика DDoS-атак в России
Динамика DDoS-атак в России
 
DDоS: Практическое руководство к выживанию. (Часть 2: Работа над ошибками)
DDоS: Практическое руководство к выживанию. (Часть 2: Работа над ошибками)DDоS: Практическое руководство к выживанию. (Часть 2: Работа над ошибками)
DDоS: Практическое руководство к выживанию. (Часть 2: Работа над ошибками)
 
Влияние сетевых аномалий на доступность ресурсов
Влияние сетевых аномалий на доступность ресурсовВлияние сетевых аномалий на доступность ресурсов
Влияние сетевых аномалий на доступность ресурсов
 
BGP Route Stability
BGP Route StabilityBGP Route Stability
BGP Route Stability
 
Russian Internet Core: политики маршрутизации
Russian Internet Core: политики маршрутизацииRussian Internet Core: политики маршрутизации
Russian Internet Core: политики маршрутизации
 
Erlang railsclub - 1
Erlang   railsclub - 1Erlang   railsclub - 1
Erlang railsclub - 1
 
Актуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернетеАктуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернете
 
Game of BGP
Game of BGPGame of BGP
Game of BGP
 
Циклы маршрутизации на междоменном сетевом уровне
Циклы маршрутизации на междоменном сетевом уровнеЦиклы маршрутизации на междоменном сетевом уровне
Циклы маршрутизации на междоменном сетевом уровне
 
Pulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядовPulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядов
 
UDP Amplifiers на примере DNS и способы противодействия
UDP Amplifiers на примере DNS и способы противодействияUDP Amplifiers на примере DNS и способы противодействия
UDP Amplifiers на примере DNS и способы противодействия
 

Similar to Порядок преодоления болота на маршруте: как не надо писать приложения, основанные на протоколе TCP

High performance computing - принципы проектирования сети
High performance computing - принципы проектирования сетиHigh performance computing - принципы проектирования сети
High performance computing - принципы проектирования сети
MUK
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Ontico
 
High performance computing принципы проектирования сети
High performance computing принципы проектирования сетиHigh performance computing принципы проектирования сети
High performance computing принципы проектирования сети
MUK Extreme
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
Ontico
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
Yandex
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Ontico
 
High Load 2009 Imdg Presentation
High Load 2009   Imdg PresentationHigh Load 2009   Imdg Presentation
High Load 2009 Imdg Presentation
HighLoad2009
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизу
Yandex
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Ontico
 
специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)
Ontico
 

Similar to Порядок преодоления болота на маршруте: как не надо писать приложения, основанные на протоколе TCP (20)

Distributed systems
Distributed systemsDistributed systems
Distributed systems
 
High performance computing - принципы проектирования сети
High performance computing - принципы проектирования сетиHigh performance computing - принципы проектирования сети
High performance computing - принципы проектирования сети
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 
Обратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai StructОбратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai Struct
 
High performance computing принципы проектирования сети
High performance computing принципы проектирования сетиHigh performance computing принципы проектирования сети
High performance computing принципы проектирования сети
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
 
gRPC в продакшне для мобильных приложений
gRPC в продакшне для мобильных приложенийgRPC в продакшне для мобильных приложений
gRPC в продакшне для мобильных приложений
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляются
 
High Load 2009 Imdg Presentation
High Load 2009   Imdg PresentationHigh Load 2009   Imdg Presentation
High Load 2009 Imdg Presentation
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизу
 
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
 
HBase on Dev{Highload}
HBase on Dev{Highload}HBase on Dev{Highload}
HBase on Dev{Highload}
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
В поисках эффективного middleware
В поисках эффективного middlewareВ поисках эффективного middleware
В поисках эффективного middleware
 
специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)
 

Порядок преодоления болота на маршруте: как не надо писать приложения, основанные на протоколе TCP

  • 1. Порядок преодоления болота на маршруте Как не надо писать приложения, основанные на протоколе TCP Артём Гавриченков
  • 2. Основано на реальных событиях • NOT AN AD! • Распределённая сеть Qrator ● "кастомный" TCP/IP "снизу" ● "кастомный" протокол управления "сверху" ● опыт работы с большим числом Web-серверов и Web- браузеров, включая самописные ● 2 года дебаг^W совершенствования продукта
  • 3. Проблемы • TCP не обеспечивает гарантированную доставку сообщения.
  • 5. Проблемы • TCP не обеспечивает гарантированную доставку сообщения за гарантированное время. Так лучше? • Первоочерёдная задача – проектирование таймаутов • Ресурсы (включая время) на любое действие пользователя должны быть ограничены • Бездействие – это тоже действие
  • 6. Таймауты • между recvfrom() • между запросами • время запроса • время сессии • время жизни любой проектируемой сущности • Long polling может быть плохой идеей
  • 7. Пример • Slowloris (Apache): DoS сервера с одного ПК • Slow HTTP POST ● Apache, IIS, Lighttpd: DoS сервера с одного ПК ● Nginx: DDoS сервера с ботнета
  • 8. От времени к пространству
  • 9. Content-Length ● Ресурсы на любое действие пользователя должны быть ограничены ● В "кастомный протокол" должно закладываться ограничение на размер передаваемых данных ● Сервер и клиент должны контролировать это ограничение
  • 10. errno(3) ● Закрытие соединения не означает успешную передачу данных ● После recvfrom(), sendto(), etc. проверяйте errno ● ENOMEM ● ECONNRESET ● EANYTHING
  • 11. Пример ● Internet Explorer: скачивание файла успешно заканчивается при ECONNRESET ● Статус соединения не проверяется ● Content-Length не проверяется
  • 12. Лимиты памяти ● Используемые ресурсы должны быть ограничены сверху ● ENOMEM ● Используемые ресурсы должны быть ограничены снизу ● Нет ресурсов → idle wait → ECONNRESET
  • 13. Latency ● Троекратное рукопожатие занимает время ● Нужно реализовывать persistent-соединения ● сразу, чтобы не городить костыли потом
  • 14. Историческая справка о костылях ● TCP ● T/TCP ● HTTP/1.0 ● HTTP/1.1
  • 15. Оптимизация ● Прежде всего: ● Measure! ● Profile! ● Emulate packet loss!
  • 16. Оптимизация ● Текстовые протоколы удобны для отладки ● Отлаживать придётся ● Использование бинарных протоколов, как правило, – преждевременная оптимизация ● Потом, всегда есть BSON и Google Protocol Buffers
  • 17. Оптимизация ● Опции TCP-сокета: ● TCP_NODELAY: отключение алгоритма Нейгла, ускорение при малых порциях данных ● TCP_CORK (Linux): для отсылки порций данных в одном TCP-сегменте ● "socket corking"
  • 18. Оптимизация ● Опции TCP-стека: ● Linux: /proc/sys/net/** – net.ipv4.tcp_fin_timeout – net.ipv4.tcp_{,r,w}mem – net.core.{r,w}mem_max ● Windows: HKLMSystemCurrentControlSetServicesTcpipParameters
  • 19. Одной строкой ● SO_REUSEADDR ● sendfile(2) ● select(2)/poll(2)/epoll(7) ● {n,h}to{n,h}{s,l}() ● int64_t vs long ● IPv6
  • 20. Спасибо за внимание Artyom Gavrichenkov <ximaera@highloadlab.com>