LINUX.ORG.RU

[практика] 100 000 сокетов

 


0

3

привет!

Интересуют следующие вопросы:

1. как организовать программу, которая бесконечно долго держит 100 000 открытых сокетов?

2. сколько тредов максимум я могу создать?(пробовал, создал 380 тредов на процесс)

3. сколько процессов максимум можно создать?

4. как с помощью тредов и процессов оптимально создать программу, которая бы держала и обрабатывала 100 000 сокетов?

спасибо



Последнее исправление: Cinewer (всего исправлений: 1)
Ответ на: комментарий от Cinewer

cat /proc/sys/fs/epoll/max_user_watches
1655685

вот столько ты могеш отслеживать через epoll

грубо говоря у задачи 2 решения - в зависимсоти просто ли следит задача за сокетами или чтото еще считает

если просто следит - то это можно сделать в один процесс - и скорее всего он будет даж быстрее чем другой вариант
просто загоняеш все сокеты в один epoll и следиш за ним

если же обработка таки есть какая то - то делаеш колво тредов равное колву железный потоков процессова-ов - и на каждый распределеяеш эти потоки - и каждый тред имеет свой epoll и слушает его

скажем 1 управляющий тред + 8 работающих
с управляющего сделано 8 пайпов которые ведут в каждый из работающих
когда на управляющий приходит коннект - он его принимает - и по одному из пайпов сообщает рабочему треду чтоб он поставил такойто FD в всвоем epoll-е и начал его обрабатывать

вот и вся стандартная задача

ae1234 ★★
()
Ответ на: комментарий от harvos

то от задачи зависит - если надо обрабатывать инфу обобщенно - то лучше и проще треды

да и передать FD в другой процесс - нетак чтоб привычное занятие

ae1234 ★★
()
Ответ на: комментарий от Eddy_Em

я куплю у вас рейд за эту сумму, остальное оставьте себе бесплатно.

anonymous
()
Ответ на: комментарий от ae1234

обобщённо — это как?

зачем передавать дескриптор? если вычисления независимы, то все процессы дёргают акцепт. дескриптор достанется кому-то одному, я гарантирую это.

anonymous
()
Ответ на: комментарий от ae1234

Вообще, все действительно работает, если несколько процессов вызывают accept на один сокет. Получается очень дешевая и простая в исполнении балансировка. Другое дело, если на слушающем сокете произошла ошибка, то придется переоткрывать его и дейтсвительно передавать другим процессам. Но это не настолько сложная процедура.

harvos
()
Ответ на: комментарий от sergej

Вообще, теоретический предел кол-ва сокетов - размер int.

Ну ещё память и ограничения протокола (64К соединений с одной машины на 1 порт другой машины для TCP)

sergej ★★★★★
()
Ответ на: комментарий от true_admin

>он бредит, об этом уже сказали в этом треде неоднократно. как минимум почитай вот это: http://pzz.livejournal.com/9564.html
веселуха начнется, когда клиенты тоже эту статью прочтут, и от одного и того же IP адреса и порта будут приходить параллельные запросы :))

xydo ★★
()

Если вам нужно одновременно 100к сокетов,

то найдите того, кто ставил вам задачу, и убейте его, благодарное человечество вас не забудет.

shimon ★★★★★
()
Ответ на: комментарий от xydo

клиенты тоже эту статью прочтут

зачем им это? :)

от одного и того же IP адреса и порта будут приходить параллельные запросы

ну второе соединение работать не будет т.к. не совпадёт sequence number. Имхо ничего страшного.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.