Web технологии (продолжение)

Jan 07, 2024 23:26





Да, я всё ещё не закончил с https/vss сервером!

Начал тестировать скорость. Расскажу о косяках, они интересные.

Прежде всего выкинул mmap взаимодействие между сервисами, уж больно оно гемморойное получается. Пока тестировал на компьютере - всё было нормально. Как стал тестировать на Maix iii вылезла неприятная проблема с производительностью. Обычно код на Maix iii работает в 3 - 10 раз медленнее, чем на AMD Ryzen 5 3600. Но вот межпроцессорное взаимодействие замедлилось в 800 раз! Да, я знаю, что там проблемы с кешем и их можно порешать. Но уж больно это гемморойно. Тем более, что есть unix sockets которые работают всего в 3 раза медленнее, чем mmap, но при этом не имеют никаких побочных эффектов и замедляются всего в 3 раза при переходе от Ryzen 5 на Maix.

Далее - начал тестировать libwebsockets на скорость передачи wss пакетов от Maix iii на desktop. Тут меня очень интересовал комментарий levgem в котором он написал «С вебртц тебе может не хватить перфоманса по шифрованию». И вот когда я начал тестировать скорость libwebsockets понял, что чего-то где-то не так. Скорость получилась 0.77 MB/sec. Причем от наличия, либо отсутствия шифрования она не зависела. И тут я начал потихоньку подозревать, что качество кода libwebsockets отвратительное. Впрочем не только я так думаю. Например тут ему за качесто кода поставили 2 балла из 5. Собственно, а чего я хотел от библиотеки, в которой требуется оставлять в буфере для ws сообщения некоторое количество байт в начале, что-бы они туда заголовок записали? А ещё там нельзя просто сказать write для ws сообщения, а надо его писать в определйнном callback, причем по одной штуке за раз! После того как сравнил скорость libwebsockets на desktop со скоростью websocket на python - впал в некоторое уныние. Код на Питоне работает десятикратно быстрее!

Вобщем плюнул, стал искать другие библиотеки. За минимальное время, к которому надо стремиться взял raw tcp сокеты, которые успевают передавать мегабайт за 0.25 секунды. После того как перебрал кучу непонятных библиотек, стал смотреть более тщательно на mongoose. Это такая простенькая библиотека для встраиваемых применений (правда с GPLv2 лицензией), но мне пофиг. Качество кода там тоже «так себе», зато код очень простой. Изначально она тоже копировала мегабайт в секунду. Но там было несколько легкоустранимых недостатков. Первым делом - у них буфер увеличивался (при помощи calloc/free/memmove) при записи каждого сообщения. При удалении сообщения он тем-же макаром уменьшался. Пока сообщения мелкие это незаметно, но когда начинаешь мегабайты писать - оно начинает тормозить. Чутка пофиксил это поведение, хотя по хорошему надо использовать ring buffer. Вторая простая ошибка - они не особо тестировали под Linux свои сэмплы на скорость. Там non blocking соекты и по умолчанию крутился цикл, которых жрал 100% времени ядра в ожидании, когда чтонить придёт или осободится буфер для записи. Добавил милисекундную задержку, и оно уже стало шустро работать без шифрования. Примерно 0.6 секунды на передачу мегабайта.

Про шифрование - отдельный вопрос. Openssl умеет много алгоритмов шифрования, но самые быстрые это TLS13-CHACHA20-POLY1305-SHA256 и ECDHE-RSA-AES128-GCM-SHA256), если если немного пошаманить, что бы выбиралось TLS_AES_128_GCM_SHA256, TLS 1.3, то скорость, с которой отсылаются пакеты websocket практичекси не отличается от скорости raw tcp соединения.

Так-что если потенциально захочу передавать свои 2 мегабита видео по Wi-Fi то смогу это сделать не хуже, чем про raw tcp-ip.
Previous post Next post
Up