LINUX.ORG.RU

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

 


0

3

привет!

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

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

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

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

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

спасибо

Не понял, какой язык программирования используется.

Предполагаю, что в Erlang-е проблем с большим количеством тредов нет.

Если же C/C++/Java - лучше использовать polling, возможно с сочетанием нескольких потоков. К примеру, создаёшь 10 потоков, которые обрабатывают по 10 000 соединений каждый. Для polling-а в С/C++ есть select/poll/epoll/что-то ещё, в Java так же есть всё нужное.

roy ★★★★★
()

сколько тредов максимум я могу создать?

Судя по вопросу, 100k соединений тебе не нужны, наверняка.

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

язык С.

а как мне создать 10 потоков так, чтобы каждый из них обрабатывал 10 000 сокетов, используя epoll? ведь epoll я должен опрашивать в одном потоке, привет сразу все сокеты какие есть?! или я ошибаюсь?

Cinewer
() автор топика
Ответ на: комментарий от baverman

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

Cinewer
() автор топика
Ответ на: комментарий от Cinewer

> суть то в том, что не могу же я на каждый сокет создавать поток.

Почему же. В хаскеле можешь. Смотря какие потоки. Если системные, то смотря какая система. По-моему в солярисе с этим намного лучше, чем в линуксе или винде. Пусть меня поправят насчет соляриса.

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

используй libevent и смотри примеры к нему

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

Делается все просто — есть один accept'or, который принимает соединения и отдает их worker'ам. Соответственно worker уже непосредственно работает с клиентом. В каждом worker'е может быть свой event-loop.

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

[Ъ]Для каждого из протоколов TCP и UDP стандарт определяет возможность одновременного выделения на хосте до 65536 уникальных портов, идентифицирующихся номерами от 0[1] до 65535.[/Ъ]

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

Ничо что соединение идентифицируется не одним портом, а еще и saddr как минимум?

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

ну приведи пример создания 100 000 тредов, раз такой умный

Миллион:

mapM_ (forkIO . (const $ return ())) [1 .. 1000000]

правда, это нельзя воспринимать буквально :)

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

ну приведи пример создания 100 000 тредов

Зачем тебе столько? Достаточно примерно по числу железных потоков, поддерживаемых процессором.

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

Но ведь на каждый порт может быть уйма соединений? Или я что-то не так понял? (я про то, как работают apace, ftp, ssh и т.п.)

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

А клиентский сокет? Как меня поправили выше, с одного source address'а (читай машины) максимум 65536 соединений.

Reset ★★★★★
()

Для начала, хотелось бы напомнить, что сокеты в Linux это особые файлы и на них действует общее ограничение на количество открытых файловых дексрипторов. Тут я могу немного ошибаться, ибо есть подозрение, что счетчики дескрипторов для файлов и для сокетов разные, но сути это не меняет. Какой там лимит на количество открытых файлов и до какого значения его модно увеличить?

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

По-умолчанию 1024. До 100000 увеличить можно. И не забываем, что это ограничение на процесс, а не на систему.

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

А я-то думал, что можно открыть 65536 портов и на каждый по 65536 соединений...

А вот оно как. Фигвам какой-то - до сих пор из-за этого идиотского ограничения int == 16бит приходится страдать. Выходит, высоконагруженные серверы могут быть только распределенными. Плохо.

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

А вы представьте себе сферический сервер в вакууме: десятигигабитная выделенная линия; 128ГБ оперативки, 8 четырехъядерных процессоров; RAID-массив какой-нибудь сверхскоростной на пару-тройку петабайт...

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

А вот оно как.

Нет не так. Ты неправильно понял. Сокет определяется четверкой (saddr, sport, daddr, dport).

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

На кой тебе 100000 тредов? Я же уже сказал как делать надо. Могу только дополнить, что тредов-воркеров надо создавать столько же сколько ядер в системе.

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

давайте создадим тестовую утилитку, которая запускает 100 000 тредов

В jobs, позорный неосилятор. Все ссылки были дадены.

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

Да знаю, я просто думал, что там счетчик 16-битный.

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

Для такого количества клиентов одного acceptora мало. Их нужно хотя бы с дюжину.

dizza ★★★★★
()

А что за задача, если не секрет? Чатик какой-нибудь?

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

> Могу только дополнить, что тредов-воркеров надо создавать столько же сколько ядер в системе.

Все верно. Только системный тред-воркер и тред приложения могут представлять из себя совершенно разные вещи. Но предполагаю, что у парня что-то типа сей или плюсов в качестве языка реализации. Для них - да, треды-воркеры и треды приложения не могут быть разными. Ах, как все таки иногда хорош эрланг! :)

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

В принципе, в этой теме уже много ответов по делу, основной из которых - вам видимо не нужно 100к сокетов :) По крайней мере, не с такого наскоку.

Не совсем понятно, является ли программа клиентом, который открывает 100к соединений, либо сервером, который принимает 100к соединений. В любом случае, примерная архитектура может быть следующей:

Master-поток распределяет между запущенными worker-потоками (примерно по количеству ядер) сокеты, которые те хранят внутри себя и обрабатывают события с них через polling, выполняя необходимые действия. Вовсе не обязательно, чтобы polling (poll к примеру) обрабатывал все сокеты, которые открыты приложением - ему передаётся список тех сокетов, которые интересны данному потоку.

roy ★★★★★
()

Вы всё бредите, Сысоев ещё в 2007 году рассказывал как они по 150-200 тыщ коннектов без держали на фронтендах(естестно активны только часть из них, остальное keep alive). Ищите видео, оно весь инет облетело.

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

возьми и проверь, это 15-30 строк кода на питоне. первый запрос в гугле выдаёт ссылки на простые перловые скрипты чтобы это проверить.

В любом случае fs.epoll.max_user_watches как бы намекает что проблем у тебя не будет.

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

>150-200 тыщ коннектов

М.б. имеется ввиду распределенная система, кластер? А то как-то невероятно звучит

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

нет, это на каждую тачку. что тут невероятного-то? лишь бы памяти хватило. У нас тачка 700мбит ддос выдержала с сотнями тыщ соединений в conntrack, вот это невероятно. Причём абсолютно спокойно.

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

>что тут невероятного-то?

То что сокетов максимум 65535, как говорил Reset. Каждый раз, когда ты делаешь accept, один из сокетов занимается.

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