Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Лимит кол-ва потоков в С++ приложении под Linux

444
19 октября 2011 года
patison
323 / / 15.03.2007
Пишу tcp client/server приложение. Клиент - может быть на чем угодно (java, objc, c++, итд), сервер - на C++ (Qt), крутиться будет на убунте. Встал следующий вопрос - насколько стало известно отсюда, кол-во потоков в системе ограничено. Посмотрел ради интереса у себя:
 
Код:
patison@ApX-PC:~$ cat /proc/sys/kernel/threads-max
27921


Вот отсюда и вытекает вопрос - как быть, в случае если число клиентов сильно вырастет? И онлайн будет, ну скажем 50 (100, 500) тысяч клиентов? Первое что приходит на ум - это писать какой-то промежуточный балансер, но если кол-во потоков Всей системы будет исчерпано - то тут уж получается без разницы сколько отдельных приложений-серверов будет крутиться в системе. Как решаются подобные проблемы?

Спасибо.
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
(100, 500) тысяч


на одной сетевой карточке, теоретически, возможно создать 65535 сокетов. из этого вычитаем сокеты уже используемые системой/программами/сервисами.


а вообще, архитектура _по_потоку_на_клиента_ - стара и тупикова.
сервер написанный с использованием boost.asio держит 35к клиентов всего на 4ех потоках ;)

444
19 октября 2011 года
patison
323 / / 15.03.2007
Ух как не хочется с бустом связываться (только не спрашивайте почему. Спишем это на аллергию). Может быть есть какие-то альтернативы? Может, даже, силами Qt как-то можно решить этот вопрос?
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
не знаю что у вас за личные неприязни к boost, но вот связываться с Qt я бы никому не рекомендовал(так же, не спрашивайте почему).
444
19 октября 2011 года
patison
323 / / 15.03.2007
Ну с аллергией я может преувеличил =) На самом деле буст хорошая штука, я просто не часто его использовал, и нужно будет дополнительно потратить время на то что-бы его поставить на серваке, настроить и оттестить его работу, а потом вникать в доки. А Qt.. ну у меня была изначально мысль писать на plain c (или может С++), с использованием posix threads, и тп. Но как-то быстрее и изящней всё это дело получается на Qt. Опять-же, механизмы сигналов/слотов, колбэки. В общем люблю я Qt :)
Не хочу превращать эту тему в холивар, потому продолжаю ждать альтернативных вариантов решения :)
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
нужно будет дополнительно потратить время на то что-бы его поставить на серваке


boost есть в репах любого дистра. это же не Qt ;)

Цитата:
настроить и оттестить его работу


нечего там настраивать. и тем более тестировать. ибо boost используется в продакшн коде множества контор, и о подавляющем большинстве багов становится известно еще до выпуска релизной версии. ибо повторюсь: это же не Qt.

Цитата:
механизмы сигналов/слотов


сигналы/слоты есть в бусте. при том настоящие, а не генераторная поделка Qt.

Цитата:
колбэки


boost.asio и использует хендлеры. ибо это единственный способ сообщить о статусе завершения асинхронной задачи.

Цитата:
продолжаю ждать альтернативных вариантов решения


удачи.

444
19 октября 2011 года
patison
323 / / 15.03.2007
Хм. Заставили задуматься ))
Возможно, попробую объединить Qt с бустом. Дело в том что помимо приема коннектов от клиентов - нужно ещё и обслуживать их. Работа с мускулем, mongodb, и много чего другого - что будет очень удобно писать на С++ , нежели на чистом С++, даже с бустом. Так что, думаю если удастся заставить qt работать с boost-овским asio - это будет идеальная связка для моей задачи.
Спасибо =)
14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
completion ports и thread pool. И ограничение сокетов все же не 65536 на карточку.
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
completion ports


кто это такие в контексте линукс?

Цитата:
не 65536


раз уж не 65535, тогда вы наверняка знаете сколько?

360
19 октября 2011 года
P*t*
474 / / 15.02.2007
Мне казалось, что самый правильный способ для таких вещей - использование асинхронного ввода/вывода с помощью epoll. Это даже не библиотека, а стандартный системный вызов, имеющийся в любом ядре linux.
http://www.opennet.ru/base/dev/epoll_example.txt.html

Цитата: niXman
на одной сетевой карточке, теоретически, возможно создать 65535 сокетов. из этого вычитаем сокеты уже используемые системой/программами/сервисами.


65535 - это количество портов. На каждом порте может висеть сколько угодно отдельных соединений.

14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: niXman
кто это такие в контексте линукс?


это модель

Цитата: niXman
раз уж не 65535, тогда вы наверняка знаете сколько?


нет конкретного числа, но можно аккуратно сказать что ограничено свободной памятью

70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата: P*t*
Мне казалось, что самый стандартный способ для таких вещей - использование асинхронного ввода/вывода с помощью epoll.
http://www.opennet.ru/base/dev/epoll_example.txt.html


а разве кто-то предлагал что-то иное? boost.asio в лине юзает epoll, в вине - IOCP, в BSD - kqueue. что внутрях юзает Qt под конкретной платформой - я не в курсе. но точно знаю что в венде не юзает IOCP, из-за чего все ее помоями поливают.

70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
нет конкретного числа, но можно аккуратно сказать что ограничено свободной памятью


да вы что?!
под адрес на интерфейс выделяется 16 бит. и нечего тут гадать.

14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: niXman
да вы что?!
под адрес на интерфейс выделяется 16 бит. и нечего тут гадать.


под адрес чего?

70K
19 октября 2011 года
niXman
20 / / 13.06.2011
простите. моцг спать просится.
для каждого конекта сетевой стек создает локальный порт, а их всего 65к (16 бит на номер порта).
14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
я не вижу в коннекте 16 бит :)
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
номер порта - 16бит
14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
ну номера порта в самом коннекте нет, да и не только этим номером определяется сокет, а может статься так что и этого номера у него не будет..
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
номера порта в самом коннекте нет


кто такой в вашем понимании "сам коннект" ?

Цитата:
не только этим номером определяется сокет


правильно. еще и IP адресом. но на одном IP, портов всего 65К.

Цитата:
а может статься так что и этого номера у него не будет..


почему? исходя из чего?

14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: niXman
кто такой в вашем понимании "сам коннект" ?


я так понимаю что здесь

Цитата: niXman

для каждого конекта сетевой стек создает локальный порт, а их всего 65к (16 бит на номер порта).


вы имели в виду connect()

Цитата: niXman

правильно. еще и IP адресом. но на одном IP портов всего 65К.
почему? исходя из чего?


IP и сокеты - вещи хоть и повсеместно рядом стоящие, но совершенно разные
да и IP может быть не один..

70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
IP и сокеты - вещи хоть и повсеместно рядом стоящие, но совершенно разные


вряд ли вы будите отрицать тот факт, что невозможно создать соединение не ассоциированное не с одним IP, в рамках текущего обсуждения сетевых сокетов.

Цитата:
да и IP может быть не один


на одной сетевухе? в этом я не в зуб ногой.

14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: niXman
вряд ли вы будите отрицать тот факт, что невозможно создать соединение не ассоциированное не с одним IP, в рамках текущего обсуждения сетевых сокетов.


можно создать например IPX соединение, без IP

Цитата: niXman
не одной сетевухе?


конечно

70K
19 октября 2011 года
niXman
20 / / 13.06.2011
ок.
давайте ближе к практике.
я имею localhost, и хочу создать на нем слушающий сокет на 70000 порту:
Код:
#include <unistd.h>
#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 порту.


спасибо :)
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
можно накатать похожий пример с accept`ом, который записывает адрес подключившегося в такую же структуру sockaddr_in. скажите, каким образом accept сохранит в этой структуре номер порта более 65К?

зы
подсказочка: на IPV6 потолок портов намного выше. но мы ведь говорим про IPV4 ;)
14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Что-то я не пойму, я разве где-то говорил что можно создать TCP/IP сокет с номером порта = 70000?
14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
У IPv6 потолок портов такой же
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
а тема-то о чем?
и ваша цитата:
Цитата:
ограничение сокетов все же не 65536 на карточку



в общем, ваша позиция ясна.

http://stackoverflow.com/questions/113224/what-is-the-largest-tcp-ip-network-port-number-allowable-for-ipv4

70K
19 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
У IPv6 потолок портов такой же


да, сорри, спутал с адресом. у IPV6 фишка в том что под адрес отводится 128бит, в сравнении с IPV4 - 32 бит.

14
19 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Тема о лимите количества потоков в сервере я полагаю :)
Просто раньше вы высказались относительно количества сокетов, а теперь о номере TCP (я полагаю) порта.
А это как сравнить мягкое со сладким.
Я с высказываниями о максимальном номере TCP порта не спорил вроде.
260
19 октября 2011 года
Ramon
1.1K / / 16.08.2003
1. По количеству TCP соединений и их взаимосвязи с кол-вом портов: читаем и удивляемся тому, что соединение идентифицируется не только номером порта
2. Максимальное кол-во системный потоков в пингвине не равно кол-ву потоков в процессе
3. RTFM про пулы потоков и асинхронный ввод/вывод
70K
19 октября 2011 года
niXman
20 / / 13.06.2011
не нужно отсылать. я привел пример который не может работать так, как от него ожидают. это все о чем я тут до сих пор говорил(пытался).
260
20 октября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: niXman
не нужно отсылать. я привел пример который не может работать так, как от него ожидают. это все о чем я тут до сих пор говорил(пытался).


Вы привели пример бреда, простите за прямоту.

70K
20 октября 2011 года
niXman
20 / / 13.06.2011
Цитата: Ramon
Вы привели пример бреда, простите за прямоту.


в чем бред,

Цитата:
Вы привели пример бреда,


?

7
20 октября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: niXman
я имею localhost…

О ужас!Но ладно,смотрим дальше

Цитата: niXman
…и хочу создать на нем слушающий сокет на 70000 порту
но еще на стадии компиляции, компилятор говорит мне: warning: large integer implicitly truncated to unsigned type
ладно, запускаем и смотрим что выводится: 7011

О,дальше–лучше
Делаем так:70000-65536=4464→0x1170.Ничего не угадывается?
[COLOR="#e0e0e0"]да-да,при отладке надо смотреть,в какой системе вывод идёт…[/COLOR]

70K
20 октября 2011 года
niXman
20 / / 13.06.2011
Цитата:
Делаем так:70000-65536=4464→0x1170.Ничего не угадывается?
да-да,при отладке надо смотреть,в какой системе вывод идёт…


ты же посмотри как я вывожу, и задумайся над тем, что же я хотел сказать этим, о великий просветитель.

и где же ты там увидел отладчик? разуй глаза и посмотри код. это вывод в консоль. накой мне там десятичные?
или просто тролота?

7
20 октября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: niXman
my_addr.sin_port = htons(70000);

printf("%hx\n", my_addr.sin_port);

:facepalm:

[COLOR="silver"]отмазки пошли ☺[/COLOR]
Ну ладно,без отладчика.Однако моё высказывание «надо смотреть,в какой системе вывод идёт»,тем не менее,в силе остаётся
И да,я же не писал,что увидел отладчик.Отладчик–инструмент,отладка–процесс(не всегда с участием отладчика)

260
20 октября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: @pixo $oft
:facepalm:



*Поднял палец*

PS:

Цитата: @pixo $oft

Однако моё высказывание «надо смотреть,в какой системе вывод идёт»,тем не менее,в силе остаётся



Скорее какие спецификаторы вывода используются :D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог