Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Некоторые факты о TCP-соединениях
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Установка TCP-соединения происходит медленно bubenok 09.02.22 в 13:53 |
|
|
Установка TCP-соединения происходит очень медленно; это занимает 84 мс от графика. В реальном приложениях существует больше логики при установке TCP-соединения, например проверка учетных данных клиента. Существует также медленный процесс увеличения пропускной способности между клиентом и сервером нового соединения. bubenok 09.02.22 в 13:55 |
||
|
В последнее время, когда HTTPS стал популярен и принят на большинстве сервисов и веб-сайтов, рукопожатие TLS для установки зашифрованного уровня происходит медленнее; это занимает 250 мс или 1 с. bubenok 09.02.22 в 13:56 |
||
|
Чтобы сэкономить время соединения TCP, нам желательно повторно использовать соединение. По сравнению с HTTP 1.0, HTTP 1.1 может повторно использовать одно и то же соединение TCP для нескольких запросов один за другим. В HTTP 2.0 поддерживается мультиплексирование, клиенты могут одновременно отправлять несколько запросов через одно TCP-соединение, что еще больше повышает производительность. bubenok 09.02.22 в 13:57 |
||
|
TCP-соединение закрывается bubenok 09.02.22 в 13:57 |
||
|
Закрыть TCP-соединение также сложно. Сторона, инициализирующая процесс закрытия, остается в состоянии TIMEWAIT в течение длительного периода времени. Одна и та же комбинация соединений не может быть повторно использована во время состояния TIMEWAIT, чтобы избежать ситуации, когда пакет рассматривается как пакет следующего соединения. Мы также должны убедиться, что удаленная сторона получает последний ACK и закрывает соединение, даже если последний ACK потерян. bubenok 09.02.22 в 14:11 |
||
|
В Linux значение TIMEWAIT по умолчанию составляет 120 секунд или 2 минуты. Не рекомендуется изменять это значение. На загруженном сервере, обрабатывающем большое количество кратковременных подключений, вы можете увидеть, что многие TCP-соединения находятся в состоянии TIMEWAIT, в этом случае это значение можно уменьшить, чтобы обрабатывать больше одновременных подключений. Ресурсы сокета передаются серверу быстрее. bubenok 09.02.22 в 14:12 |
||
|
Таким образом, чтобы избежать слишком большого количества соединений TIMEWAIT на сервере, закрытие соединения всегда предлагается инициировать со стороны клиента. bubenok 09.02.22 в 14:13 |
||
|
Вы можете проверить состояние TCP-соединения с помощью команды ss. bubenok 09.02.22 в 14:13 |
||
|
ss -s bubenok 09.02.22 в 14:13 |
||
|
Total: 169(kernel 2893) bubenok 09.02.22 в 14:16 |
||
|
Изображение 7.3 Использование команды ss для проверки статуса соединения bubenok 09.02.22 в 14:17 |
||
|
Жизненный цикл и время ожидания сокета bubenok 09.02.22 в 14:17 |
||
|
Основным фактором построения надежной системы является обработка исключений. В сетевых приложениях из-за природы TCP и Интернета обработка тайм-аутов очень важна. bubenok 09.02.22 в 14:18 |
||
|
Жизненный цикл абстрактного ресурса bubenok 09.02.22 в 14:18 |
||
|
Та же идея управления жизненным циклом должна применяться ко всем абстрактным ресурсам, которые мы создаем или используем в нашем приложении. Это может быть небольшая переменная в памяти или соединение с базой данных или даже большой сервер или сервисы. bubenok 09.02.22 в 14:19 |
