Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Секреты производительности сетевых приложений для мобильных устройств

Глава 10 из книги "Производительность приложений с открытым исходным кодом".

Оригинал: Secrets of Mobile Network Performance
Автор: Bryce Howard
Перевод: А.Панин

Протокол передачи гипертекста

В данном разделе обсуждаются техники нейтрализации воздействия высоких задержек при обращении данных на производительность протокола передачи гипертекста (Hypertext Transfer Protocol - HTTP).

Keepalive

Keepalive является соглашением в рамках протокола HTTP, позволяющим использовать одно и то же соединение TCP для выполнения последовательных запросов. При этом сохраняется как минимум время одного обращения данных, требуемое для выполнения трехэтапного рукопожатия протокола TCP, равное десяткам или сотням миллисекунд для каждого запроса. Более того, использование соглашения keepalive позволяет воспользоваться одной дополнительной и обычно не предусматриваемой возможностью повышения производительности, заключающейся в сохранении текущего размера окна перегрузки протокола TCP между запросами, что ведет к значительному сокращению количества событий заполнения окна перегрузки.

Процесс конвейерной обработки запросов протокола HTTP
Рисунок 10.5 - Процесс конвейерной обработки запросов протокола HTTP

На практике в процессе конвейерной обработки запросов происходит распределение времени обращения между несколькими транзакциями протокола HTTP. Например, при отправке 5 конвейерных запросов протокола HTTP посредством соединения с временем обращения RTT в 100 мс, средняя задержка обращения составит 20 мс. При отправке 10 конвейерных запросов протокола HTTP в тех же условиях средняя задержка обращения сократится до 10 мс.

Существуют также и значительные недостатки техники конвейерной обработки запросов протокола HTTP, препятствующие ее широкомасштабному внедрению, а именно: запись истории с возможностью определения прокси-серверов для протокола HTTP в случае их использования и подверженность атакам отказа в обслуживании.

Протокол обеспечения безопасности транспортного уровня

Протокол обеспечения безопасности транспортного уровня (Transport Layer Security - TLS) является ориентированным на создание сессий сетевым протоколом, позволяющим безопасно передавать важную информацию посредством публичной сети. Хотя протокол TLS и является чрезвычайно эффективным в плане защиты сетевых взаимодействий, при работе в сетях с высокими задержками при передаче данных его производительность страдает.

Протокол TLS использует сложный механизм рукопожатия, включающий два обмена сообщениями между клиентом и сервером. Защищенная с помощью протокола TLS транзакция протокола HTTP может выполняться заметно медленнее именно по этой причине. Обычно утверждения о медленной работе протокола TLS в реальности относятся к задержкам обращения данных в ходе обмена данными, предусмотренного его протоколом рукопожатия.

Разрешение имени узла с использованием сервера DNS
Рисунок 10.6 - Разрешение имени узла с использованием сервера DNS

В большинстве случаев хостинг-платформы используют реализацию системы кэширования для предотвращения частых отправок запросов серверам доменных имен DNS. Семантики процесса кэширования данных DNS достаточно просты. Каждый ответ сервера DNS содержит атрибут времени жизни (time-to-live - TTL), устанавливающий период времени, в течение которого результат запроса может находиться в кэше. Значения TTL могут находиться в диапазоне от секунд до дней, но обычно составляют порядка нескольких минут. Очень малые значения TTL, обычно меньше минуты, используются для распределения нагрузки или минимизации времени неработоспособности в случае замены сервера или отказа оборудования провайдера.

Системные реализации кэша DNS большинства платформ не учитывают завышенных времен обращения пакетов в мобильных сетях. Многие приложения для мобильных устройств могли бы улучшить свою работоспособность путем использования реализации кэша, которая могла усовершенствовать или заменить доступное решение. При разработке такой реализации может быть предложено несколько стратегий кэширования, в случае использования которых в рамках приложения будут устранены случайные ненужные задержки, вызванные излишними запросами к серверу DNS.

Обновление при отказе

Системы высокой доступности обычно находятся в составе инфраструктур с избыточным резервированием, использующих собственное пространство IP-адресов. Записи DNS с малыми значениями TTL позволяют улучшить работу инфраструктуры путем сокращения времени, в течение которого клиент из сети может обращаться к адресу вышедшего из строя узла, но в то же время они провоцируют отправку большого количества дополнительных запросов к серверу DNS. Параметр времени жизни является компромиссом между минимизацией времени неработоспособности узла и максимизацией производительности клиента.

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

Следует учесть, что эта техника кэширования, скорее всего, не будет совместима с какой-либо схемой распределения нагрузки на основе DNS.

Асинхронное обновление

Асинхронное обновление является техникой кэширования данных DNS, которая (по большей части) учитывает значения параметра TTL, при этом значительно сокращая задержки при отправке частых запросов серверу DNS. Для реализации этой техники необходима клиентская библиотека, предназначенная для выполнения асинхронных запросов к серверу DNS, такая, как c-ares.

Идея достаточно проста: при выполнении запроса, предназначенного для обновления данных DNS из кэша с истекшим временем жизни, возвращаются устаревшие данные и в это же время в фоновом режиме планируется осуществление неблокируемого запроса к серверу DNS для обновления данных в кэше. При наличии реализации функции перехода к отправке блокируемых (т.е., синхронных) запросов для обновления наиболее устаревших данных в случае неудачного завершения предыдущих запросов, эта техника приобретает практически полный иммунитет к задержкам отправки данных сервером DNS, все так же оставаясь совместимой с многими схемами защиты от выхода узлов из строя и распределения нагрузки на основе DNS.

Заключение

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


Вернуться к началу статьи.