Comments 14
До конца статьи надеялся и верил, что будет про Epoll. И, как оказалось, не зря. Спасибо!
+4
Спасибо за статью!
Последний абзац заинтриговал. Есть ли какие-то общепринятые практики, куда развивать пример в случае задач из разряда highload? Или это тема для следующего поста? :)
Последний абзац заинтриговал. Есть ли какие-то общепринятые практики, куда развивать пример в случае задач из разряда highload? Или это тема для следующего поста? :)
0
Где-то читал, что qt больше подходит для приложений с gui, а в высоконагруженных проектах показывает плохие результаты из-за использования сигналов и слотов, мол, они медленнее, чем в других языках, где используются обратные вызовы (callbacks).
На хабре была статья с тестом, но там не было для сравнения веб-сервера на qt.
В связи с этим вопрос: вы в примере используете SOCKS-сервер, сколько реально он может выдержать соединений по сравнению с остальными?
Не делали таких тестов?
Было бы интересно прочесть про highload и qt на примерах.
На хабре была статья с тестом, но там не было для сравнения веб-сервера на qt.
В связи с этим вопрос: вы в примере используете SOCKS-сервер, сколько реально он может выдержать соединений по сравнению с остальными?
Не делали таких тестов?
Было бы интересно прочесть про highload и qt на примерах.
+1
Поразмышляю. Всегда считал, что серверы пишутся с использованием других инструментов. Плюс Qt в переносимости. Однако, в случае с epoll это будет linux и какой тут разговор о переносимости?
С другой стороны, если я хорошо знаю Qt и плохо знаю стандартные библиотеки, то мне будет очень комфортно писать приложение с применением всяческих QFile, QQueue, QMap и т.д. пусть даже это приложение и будет серверным.
По поводу сигналов и слотов, наслышан, что они медленнее. Но у такой системы есть несколько важных свойств, которых нет у callbacks: 1) место, из которого испускается сигнал никак не привязано к месту приема (слоту), то есть сигнал выпустил, а кто его принимает — уже не наше дело; 2) приемников сигнала (слотов) может быть несколько — к приему сообщения готовятся те, кому оно нужно; 3) в Qt можно обмениваться сигналами между thread'ами. Это позволяет строить некие подобия системы акторов.
С другой стороны, если я хорошо знаю Qt и плохо знаю стандартные библиотеки, то мне будет очень комфортно писать приложение с применением всяческих QFile, QQueue, QMap и т.д. пусть даже это приложение и будет серверным.
По поводу сигналов и слотов, наслышан, что они медленнее. Но у такой системы есть несколько важных свойств, которых нет у callbacks: 1) место, из которого испускается сигнал никак не привязано к месту приема (слоту), то есть сигнал выпустил, а кто его принимает — уже не наше дело; 2) приемников сигнала (слотов) может быть несколько — к приему сообщения готовятся те, кому оно нужно; 3) в Qt можно обмениваться сигналами между thread'ами. Это позволяет строить некие подобия системы акторов.
0
Тестирование прокси сервера это отличись тормоза ресурса, от тормозов твоего сервера. Можно пойти по пути описанным в этом письме. Я пробовал словить блокировки внутри malloc, что бы сравнить с jemalloc/tcmalloc.
Да. Сигналы и слоты медленные, особенно если использовать синтаксис
Понятно что работа со строками быстрой быть не может. Сравнение между Qt4/Qt5 слотами можно посмотреть Benchmark for conception
Я естественно не делаю ничего из highload на Qt, потому что уткнемся в память, а именно в операциях malloc/free, фрагментация памяти и т.д. Потом еще обязательно придется оптимизировать парсеры, если они есть, как например в nxweb – HTTP сервер для приложений на Си. Если вы хотите с базой общаться, то скорее всего захочется асинхронно и с ней работать, а интерфейс QSqlQuery не предоставляет этой возможности. Потом еще вдруг заходим размещение ответа от базы за оптимизировать как Побег из темницы типов. Реализуем работу с данными, тип которых определяется динамически. Если мы скажем захотим сделать игровой сервер, то epoll с сокетами будет недостаточно.
Да. Сигналы и слоты медленные, особенно если использовать синтаксис
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 с сокетами будет недостаточно.
+2
Использую Qt в своем проекте iCloud DNS Bypass.
Сделал HTTP и DNS сервера на QTcpSocket и QUdpSocket.
Постоянная нагрузка на HTTP 10-100 запросов в секунду и в сутки примерно 1 млн запросов.
На DNS сервер 20-500 запросов в секунду и в сутки более 5 млн запросов.
При этом средняя нагрузка обоих серверов 5% а пиковая 10%.
Так что Qt вполне себя хорошо ведет на сетевых проектах.
PS: в живую это выглядит так: youtu.be/FUysTl-TsIQ
Сделал HTTP и DNS сервера на QTcpSocket и QUdpSocket.
Постоянная нагрузка на HTTP 10-100 запросов в секунду и в сутки примерно 1 млн запросов.
На DNS сервер 20-500 запросов в секунду и в сутки более 5 млн запросов.
При этом средняя нагрузка обоих серверов 5% а пиковая 10%.
Так что Qt вполне себя хорошо ведет на сетевых проектах.
PS: в живую это выглядит так: youtu.be/FUysTl-TsIQ
+3
Обычно на форумах хотят от 500 запросов в секунду :)
Все зависит от задач. PhantomJS — это гибридное приложение написанное на Qt, C++, JavaScript. Его использует другой проект jsreport, где люди радуются 641 pdf станицей в секунду.
Все зависит от задач. PhantomJS — это гибридное приложение написанное на Qt, C++, JavaScript. Его использует другой проект jsreport, где люди радуются 641 pdf станицей в секунду.
0
Я специально оставил % нагрузки чтоб можно было подсчитать максимально возможное количество в секунду.
Был такой случай.
Происходила атака от 1579 разных IP-адресов и нагрузка на 1 ядерный 3 ггз процессор составляла 80%.
А количество запросов в секунду превышало 7000.
При этом я и никто из пользователей не заметил сбоев в работе сервера.
О том что происходит атака я узнал по пол гигабайтным логам запросов.
Был такой случай.
Происходила атака от 1579 разных IP-адресов и нагрузка на 1 ядерный 3 ггз процессор составляла 80%.
А количество запросов в секунду превышало 7000.
При этом я и никто из пользователей не заметил сбоев в работе сервера.
О том что происходит атака я узнал по пол гигабайтным логам запросов.
+1
Мне бы хотелось сравнить с Erlang, задача вроде простая, я смог бы написать. У вас есть какие-то нагрузочные тесты?
0
У меня есть логи за все времена и может каким-то образом получится воспроизвести нагрузку.
Но у меня нет возможности достать 1579 IP-адресов только чтоб произвести тест.
Если у вас есть чем сделать тесты то можем попробовать на одинаковых условиях.
Мой Qt HTTP сервер тут ui.iclouddnsbypass.com, данные доступны только из-под iOS юзер агентов.
А Qt DNS сервер запущен тут 78.109.17.60
Я использовал только сокеты и треды из Qt, вся реализация HTTP и DNS протоколов своя.
Но у меня нет возможности достать 1579 IP-адресов только чтоб произвести тест.
Если у вас есть чем сделать тесты то можем попробовать на одинаковых условиях.
Мой Qt HTTP сервер тут ui.iclouddnsbypass.com, данные доступны только из-под iOS юзер агентов.
А Qt DNS сервер запущен тут 78.109.17.60
Я использовал только сокеты и треды из Qt, вся реализация HTTP и DNS протоколов своя.
0
У меня получается каша в голове. Да и iOS не имею.
Хочу уточнить. У вас есть сервис для людей. Он состоит из: HTTP, DNS и SOCKS4 серверов?
Хочу уточнить. У вас есть сервис для людей. Он состоит из: HTTP, DNS и SOCKS4 серверов?
0
А кто запрещает в Qt использовать callback-модель? Более того, ее успешно можно комбинировать с сигнально-слотовой моделью (что в рамках одной нити исполнения тоже callback-модель). Это все-таки C++, просто с хорошими фичами. :-)
Инструментов в Qt, для работы с классической callback-моделью в купе с сигналами слотами, полным полно.
Инструментов в Qt, для работы с классической callback-моделью в купе с сигналами слотами, полным полно.
+1
Sign up to leave a comment.
Articles
Change theme settings
Многопоточный SOCKS 4 сервер на Qt