Pull to refresh

Comments 14

До конца статьи надеялся и верил, что будет про Epoll. И, как оказалось, не зря. Спасибо!
Спасибо за статью!
Последний абзац заинтриговал. Есть ли какие-то общепринятые практики, куда развивать пример в случае задач из разряда highload? Или это тема для следующего поста? :)
Где-то читал, что qt больше подходит для приложений с gui, а в высоконагруженных проектах показывает плохие результаты из-за использования сигналов и слотов, мол, они медленнее, чем в других языках, где используются обратные вызовы (callbacks).
На хабре была статья с тестом, но там не было для сравнения веб-сервера на qt.
В связи с этим вопрос: вы в примере используете SOCKS-сервер, сколько реально он может выдержать соединений по сравнению с остальными?
Не делали таких тестов?
Было бы интересно прочесть про highload и qt на примерах.
Поразмышляю. Всегда считал, что серверы пишутся с использованием других инструментов. Плюс Qt в переносимости. Однако, в случае с epoll это будет linux и какой тут разговор о переносимости?
С другой стороны, если я хорошо знаю Qt и плохо знаю стандартные библиотеки, то мне будет очень комфортно писать приложение с применением всяческих QFile, QQueue, QMap и т.д. пусть даже это приложение и будет серверным.
По поводу сигналов и слотов, наслышан, что они медленнее. Но у такой системы есть несколько важных свойств, которых нет у callbacks: 1) место, из которого испускается сигнал никак не привязано к месту приема (слоту), то есть сигнал выпустил, а кто его принимает — уже не наше дело; 2) приемников сигнала (слотов) может быть несколько — к приему сообщения готовятся те, кому оно нужно; 3) в Qt можно обмениваться сигналами между thread'ами. Это позволяет строить некие подобия системы акторов.
libevent, libuv переносимые. Вообще удивительно, что существуют столько альтернативных диспетчеров.
Тестирование прокси сервера это отличись тормоза ресурса, от тормозов твоего сервера. Можно пойти по пути описанным в этом письме. Я пробовал словить блокировки внутри malloc, что бы сравнить с jemalloc/tcmalloc.

Да. Сигналы и слоты медленные, особенно если использовать синтаксис
QObject::connect(const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection) const

Понятно что работа со строками быстрой быть не может. Сравнение между Qt4/Qt5 слотами можно посмотреть Benchmark for conception


Я естественно не делаю ничего из highload на Qt, потому что уткнемся в память, а именно в операциях malloc/free, фрагментация памяти и т.д. Потом еще обязательно придется оптимизировать парсеры, если они есть, как например в nxweb – HTTP сервер для приложений на Си. Если вы хотите с базой общаться, то скорее всего захочется асинхронно и с ней работать, а интерфейс QSqlQuery не предоставляет этой возможности. Потом еще вдруг заходим размещение ответа от базы за оптимизировать как Побег из темницы типов. Реализуем работу с данными, тип которых определяется динамически. Если мы скажем захотим сделать игровой сервер, то epoll с сокетами будет недостаточно.
Использую Qt в своем проекте iCloud DNS Bypass.
Сделал HTTP и DNS сервера на QTcpSocket и QUdpSocket.
Постоянная нагрузка на HTTP 10-100 запросов в секунду и в сутки примерно 1 млн запросов.
На DNS сервер 20-500 запросов в секунду и в сутки более 5 млн запросов.
При этом средняя нагрузка обоих серверов 5% а пиковая 10%.
Так что Qt вполне себя хорошо ведет на сетевых проектах.
PS: в живую это выглядит так: youtu.be/FUysTl-TsIQ
Обычно на форумах хотят от 500 запросов в секунду :)

Все зависит от задач. PhantomJS — это гибридное приложение написанное на Qt, C++, JavaScript. Его использует другой проект jsreport, где люди радуются 641 pdf станицей в секунду.
Я специально оставил % нагрузки чтоб можно было подсчитать максимально возможное количество в секунду.
Был такой случай.
Происходила атака от 1579 разных IP-адресов и нагрузка на 1 ядерный 3 ггз процессор составляла 80%.
А количество запросов в секунду превышало 7000.
При этом я и никто из пользователей не заметил сбоев в работе сервера.
О том что происходит атака я узнал по пол гигабайтным логам запросов.
Мне бы хотелось сравнить с Erlang, задача вроде простая, я смог бы написать. У вас есть какие-то нагрузочные тесты?
У меня есть логи за все времена и может каким-то образом получится воспроизвести нагрузку.
Но у меня нет возможности достать 1579 IP-адресов только чтоб произвести тест.
Если у вас есть чем сделать тесты то можем попробовать на одинаковых условиях.
Мой Qt HTTP сервер тут ui.iclouddnsbypass.com, данные доступны только из-под iOS юзер агентов.
А Qt DNS сервер запущен тут 78.109.17.60
Я использовал только сокеты и треды из Qt, вся реализация HTTP и DNS протоколов своя.
У меня получается каша в голове. Да и iOS не имею.
Хочу уточнить. У вас есть сервис для людей. Он состоит из: HTTP, DNS и SOCKS4 серверов?
Сервис только из HTTP и DNS, общее количество уникальных пользователей уже больше 1,5 млн.
А использование QTcpServer для HTTP у меня схоже с тем что в этой статье для SOCKS4.
Чтобы получать ответы от ui.iclouddnsbypass.com надо просто задать User-Agent любой iOS браузера Safari.
А кто запрещает в Qt использовать callback-модель? Более того, ее успешно можно комбинировать с сигнально-слотовой моделью (что в рамках одной нити исполнения тоже callback-модель). Это все-таки C++, просто с хорошими фичами. :-)

Инструментов в Qt, для работы с классической callback-моделью в купе с сигналами слотами, полным полно.
Sign up to leave a comment.

Articles

Change theme settings