Лимит кол-ва потоков в С++ приложении под Linux
27921
Вот отсюда и вытекает вопрос - как быть, в случае если число клиентов сильно вырастет? И онлайн будет, ну скажем 50 (100, 500) тысяч клиентов? Первое что приходит на ум - это писать какой-то промежуточный балансер, но если кол-во потоков Всей системы будет исчерпано - то тут уж получается без разницы сколько отдельных приложений-серверов будет крутиться в системе. Как решаются подобные проблемы?
Спасибо.
на одной сетевой карточке, теоретически, возможно создать 65535 сокетов. из этого вычитаем сокеты уже используемые системой/программами/сервисами.
а вообще, архитектура _по_потоку_на_клиента_ - стара и тупикова.
сервер написанный с использованием boost.asio держит 35к клиентов всего на 4ех потоках ;)
Не хочу превращать эту тему в холивар, потому продолжаю ждать альтернативных вариантов решения :)
boost есть в репах любого дистра. это же не Qt ;)
нечего там настраивать. и тем более тестировать. ибо boost используется в продакшн коде множества контор, и о подавляющем большинстве багов становится известно еще до выпуска релизной версии. ибо повторюсь: это же не Qt.
сигналы/слоты есть в бусте. при том настоящие, а не генераторная поделка Qt.
boost.asio и использует хендлеры. ибо это единственный способ сообщить о статусе завершения асинхронной задачи.
удачи.
Возможно, попробую объединить Qt с бустом. Дело в том что помимо приема коннектов от клиентов - нужно ещё и обслуживать их. Работа с мускулем, mongodb, и много чего другого - что будет очень удобно писать на С++ , нежели на чистом С++, даже с бустом. Так что, думаю если удастся заставить qt работать с boost-овским asio - это будет идеальная связка для моей задачи.
Спасибо =)
кто это такие в контексте линукс?
раз уж не 65535, тогда вы наверняка знаете сколько?
http://www.opennet.ru/base/dev/epoll_example.txt.html
65535 - это количество портов. На каждом порте может висеть сколько угодно отдельных соединений.
http://www.opennet.ru/base/dev/epoll_example.txt.html
а разве кто-то предлагал что-то иное? boost.asio в лине юзает epoll, в вине - IOCP, в BSD - kqueue. что внутрях юзает Qt под конкретной платформой - я не в курсе. но точно знаю что в венде не юзает IOCP, из-за чего все ее помоями поливают.
да вы что?!
под адрес на интерфейс выделяется 16 бит. и нечего тут гадать.
под адрес на интерфейс выделяется 16 бит. и нечего тут гадать.
под адрес чего?
для каждого конекта сетевой стек создает локальный порт, а их всего 65к (16 бит на номер порта).
кто такой в вашем понимании "сам коннект" ?
правильно. еще и IP адресом. но на одном IP, портов всего 65К.
почему? исходя из чего?
я так понимаю что здесь
для каждого конекта сетевой стек создает локальный порт, а их всего 65к (16 бит на номер порта).
вы имели в виду connect()
правильно. еще и IP адресом. но на одном IP портов всего 65К.
почему? исходя из чего?
IP и сокеты - вещи хоть и повсеместно рядом стоящие, но совершенно разные
да и IP может быть не один..
вряд ли вы будите отрицать тот факт, что невозможно создать соединение не ассоциированное не с одним IP, в рамках текущего обсуждения сетевых сокетов.
на одной сетевухе? в этом я не в зуб ногой.
давайте ближе к практике.
я имею localhost, и хочу создать на нем слушающий сокет на 70000 порту:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
struct sockaddr_in my_addr;
socklen_t addrlen = sizeof(sockaddr_in);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(70000);
my_addr.sin_addr.s_addr = INADDR_ANY;
printf("%hx\n", my_addr.sin_port);
int sock_fd = socket(my_addr.sin_family, SOCK_STREAM, 0);
if ( sock_fd < 0 ) {
perror("socket()");
return 1;
}
if ( bind(sock_fd, (struct sockaddr*)&my_addr, addrlen) < 0 ) {
close(sock_fd);
perror("bind()");
return 1;
}
}
но еще на стадии компиляции, компилятор говорит мне: warning: large integer implicitly truncated to unsigned type
ладно, запускаем и смотрим что выводится: 7011
у меня более нет вопросов кроме одного: покажите как я могу создать сокет на 70000 порту.
спасибо :)
зы
подсказочка: на IPV6 потолок портов намного выше. но мы ведь говорим про IPV4 ;)
и ваша цитата:
в общем, ваша позиция ясна.
http://stackoverflow.com/questions/113224/what-is-the-largest-tcp-ip-network-port-number-allowable-for-ipv4
да, сорри, спутал с адресом. у IPV6 фишка в том что под адрес отводится 128бит, в сравнении с IPV4 - 32 бит.
Просто раньше вы высказались относительно количества сокетов, а теперь о номере TCP (я полагаю) порта.
А это как сравнить мягкое со сладким.
Я с высказываниями о максимальном номере TCP порта не спорил вроде.
2. Максимальное кол-во системный потоков в пингвине не равно кол-ву потоков в процессе
3. RTFM про пулы потоков и асинхронный ввод/вывод
Вы привели пример бреда, простите за прямоту.
в чем бред,
?
О ужас!Но ладно,смотрим дальше
но еще на стадии компиляции, компилятор говорит мне: warning: large integer implicitly truncated to unsigned type
ладно, запускаем и смотрим что выводится: 7011
О,дальше–лучше
Делаем так:70000-65536=4464→0x1170.Ничего не угадывается?
[COLOR="#e0e0e0"]да-да,при отладке надо смотреть,в какой системе вывод идёт…[/COLOR]
да-да,при отладке надо смотреть,в какой системе вывод идёт…
ты же посмотри как я вывожу, и задумайся над тем, что же я хотел сказать этим, о великий просветитель.
и где же ты там увидел отладчик? разуй глаза и посмотри код. это вывод в консоль. накой мне там десятичные?
или просто тролота?
…
printf("%hx\n", my_addr.sin_port);
:facepalm:
[COLOR="silver"]отмазки пошли ☺[/COLOR]
Ну ладно,без отладчика.Однако моё высказывание «надо смотреть,в какой системе вывод идёт»,тем не менее,в силе остаётся
И да,я же не писал,что увидел отладчик.Отладчик–инструмент,отладка–процесс(не всегда с участием отладчика)
*Поднял палец*
PS:
Однако моё высказывание «надо смотреть,в какой системе вывод идёт»,тем не менее,в силе остаётся
Скорее какие спецификаторы вывода используются :D