LINUX.ORG.RU

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

 


0

3

привет!

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

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

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

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

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

спасибо



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

man SEDA

It is also worth noting that a number of recent research papers have demonstrated that the SEDA prototype (in Java) performs poorly compared to threaded or event-based systems implemented in C. This would seem to contradict the findings in my work.

История успеха, чо.

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

Давайте так. Пишем на Java? Ожидайте пониженую производительность. А то офигеть, в задаче меряются такты, а мы написали одно на Java, другое на С и делаем research paper. Детский сад. А чо, естественно nginx на Java на напишешь с такой же производительность. Тем более возможно они вообще взяли в 10 соединений скормили данные и наслаждаются своей офигенностью. Потому бред.

Если говорить о гибкости, то SEDA - общая модель. Ее простым изменением параметров можно привратить в любую другую модель. И главное подстроить под задачу. Сейчас в своем проекте начну писать экспериментальный модуль, который на лету переконфигурирует SEDA. Ресерч эдакий, как часть магистерской

vertexua ★★★★★
()

Кстати ещё - баян.

Видим, что apache держит порядка 10.000 конкурентных соединений, yaws - порядка 100.000. И тот и другой работают на одной машине.

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

Видим, что apache держит порядка 10.000 конкурентных соединений, yaws - порядка 100.000. И тот и другой работают на одной машине.

Бедный апач кто только не пинал уже. Не стыдно? Найди лучше как yaws уделывает nginx.

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

Если вы понимаете что такое SEDA, то вот в чем оверхеад при нормальной реализации понять тяжело. Возможно автор написав что-то на Java сразу думал что оно обгонит отточеные и простые как лопата серваки на С++. SEDA - это гибкость для админа системы, конфигурируемость потока данных искаропки.

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

Чорд, я представил лица архитекторов если я скажу что нужно заюзать сервак на Erlangе. Вижу как они прокусывают палец, рисуют пентаграму на земле и вызывают программиста на Erlang из демонического измерения.

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

Найди лучше как yaws уделывает nginx.

Зачем? Тот тест - пример обслуживания 100.000 параллельных соединений на одной машине (о чём, собственно, тред).

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

Видим, что apache держит порядка 10.000 конкурентных соединений

вообще-то там написано «мы запустили 4тыщи апачей для обслуживания 4тыщ соединений и у нас умерла система».

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

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

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

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

«мы запустили 4тыщи апачей для обслуживания 4тыщ соединений и у нас умерла система».

Это какая фраза в оригинале?

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

>Nope. Не путай сокеты и порты.

1)Ну так, один сокет - один порт. В другом случае (нескольких сокетов на один порт) из сокетов будет читаться поочередно. Например,

socket
bind
listen
fork

Это ерунда.

2)В заголовке TCP нет никаких идентификаторов удаленного слушателя, кроме порта.

http://ru.wikipedia.org/wiki/TCP#.D0.97.D0.B0.D0.B3.D0.BE.D0.BB.D0.BE.D0.B2.D...

Один порт - одно приложение-получатель. В случае нескольких приложений, они все равно не могут работать параллельно.

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

Ну так, один сокет - один порт. В другом случае (нескольких сокетов на один порт) из сокетов будет читаться поочередно.

Выдыхай. Ты где этой фигни нахватался?

В заголовке TCP нет никаких идентификаторов удаленного слушателя, кроме порта.

ЛОЛИЩЕ! А в заголовке IP?

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

>Выдыхай. Ты где этой фигни нахватался?

По заголовку TCP понятно, я же тебе дал ссылку.

ЛОЛИЩЕ! А в заголовке IP?

А при чем тут заголовок IP??? Разговор идет о транспортном уровне.

IP доставляет пакет до хоста. TCP - до нужного приложения внутри хоста.

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

С этими сокетами все равно нельзя работать параллельно.

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

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

>можно там всё.

Если можно, давай пруф helloworld на тему.

ты же не подумал что они мильён соединений до одного компа и одного порта устанавливают?

До одного компа и 65535 портов. С большим числом параллельно работать нельзя.

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

>Сокетами рулит OS.

Ты куда-то не в ту степь пошел. К чему ты это сейчас сказал?

Сначала в сторону IP полез, теперь OS хочешь примешать.

Давай по-существу.

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

Следи за моим движением:

1) Сокет создается OS

2) Уникальность сокета определяется по (saddr, sport, daddr, dport)

3) Приложение в accept, получает сокет.

4) …

5) Так сколько сокетов можно принять?

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

2) Уникальность сокета определяется по (saddr, sport, daddr, dport)

Это так, наверное, на Марсе :) У нас на Земле он идентифицируется следующим:

struct sockaddr_in { 
  sa_family_t           sin_family;     /* Address family               */
  __be16                sin_port;       /* Port number                  */
  struct in_addr        sin_addr;       /* Internet address             */

  /* Pad to size of `struct sockaddr'. */
  unsigned char         __pad[__SOCK_SIZE__ - sizeof(short int) -
                        sizeof(unsigned short int) - sizeof(struct in_addr)];
};

У тебя ошибка в рассуждениях.

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

по ссылке всё есть. Я устал доказывать что я не идиот. Вы можете сколько угодно теоретизировать доказывать почему это нельзя и работать не будет. Мне всё равно, у меня всё работает.

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

Кстати, я правильно понял, по-твоему, приложение знает только о транспортном уровне?

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

У нас на Земле он идентифицируется следующим:

абсолютно левый и нерелевантный кусок кода. Ищи место где входящий пакет ассоциируется с соединением, там найдёшь ответ.

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

> У нас на Земле он идентифицируется следующим:

это только половина идентификатора.

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

До одного компа и 65535 портов. С большим числом параллельно работать нельзя.

Что будет если сделать так:

ifconfig eth0:1 127.0.0.1 up
ifconfig eth0:2 127.0.0.2 up
..
ifconfig eth0:n 127.0.0.n up

?

Тогда будет доступно n интерфейсов и можно будет работать с максимум n * (2 ^ 16 - 1) клиентскими сокетами, правильно?

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

Хорошо, уникальность соединения. Сколько соединений можно принять (а об этом и идет речь), при условии разных удаленных сокетов?

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

> Выходит, высоконагруженные серверы могут быть только распределенными. Плохо.

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


И потеря 100% траффика в случае если это чудо техники упадет.

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

> Ну так я же не про «крутой» сервер говорил, а про обычную домашнюю файлопомойку.

Для домашней файлопомойки такая конфигурация - это слишком круто :)

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

> а рядом стоит запасной, делов-то :)

Учитывая описанные характеристики запасной влетит в копеечку.

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

Ну ладно, более приземленно: штуки 3 гигабитных сетевухи, два четырехъядерных процессора, 32ГБ оперативки и 100ТБ RAID. Все вместе выйдет где-то в 150т.р. А у некоторых компьютеры и подороже бывают...

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

Ты как всегда в своем репертуаре. Таких «крутых» серверов нет даже у порталов с миллиардами кликов в день. Дешевле и надежней купить много машин с обыкновенным железом.

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

Учитывая описанные характеристики запасной влетит в копеечку.

Запасной встрянет в такие же деньги как и основной. За надёжность надо платить. Никто же не жалуется что raid «неэкономно» расходует место.

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

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

Заменить 3 гигабитные сетевухи на две гигабитные, встроенные в мамку, 100Тb RAID на ~4Tb RAID и уже будет похоже на то, что реально используется.

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

Таких «крутых» серверов нет даже у порталов с миллиардами кликов в день.

Ошибаешься. Только их обычно не для веба а для СУБД, кривых приложений итп что плохо масштабируется. Если бы не было спроса то не было бы и предложения.

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

Оперативка - понятное дело, нужна. А вот зачем столько процессоров, если только мы не используем файлопомойку еще и как вычислительный сервер?

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

Я к тому, что там дохленького атома за глаза хватит две несчастные гигабитные сетевушки обеспечивать-то.

Eddy_Em ☆☆☆☆☆
()

еще вброшу, что для приема входящих соединений система может иметь несколько ip-адресов, так что на каждый из них можно принимать по 65535 соединений

а вообще лучще покопаться в исходниках ядра и так выяснить максимально возможное кол-во сокетов, все ведь от конкретной реализации зависит. Или спросить в LKML :)

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

>по ссылке всё есть. Я устал доказывать что я не идиот. Вы можете сколько угодно теоретизировать доказывать почему это нельзя и работать не будет. Мне всё равно, у меня всё работает.

где входящий пакет ассоциируется с соединением

Ладно, согласен

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

еще вброшу, что для приема входящих соединений система может иметь несколько ip-адресов, так что на каждый из них можно принимать по 65535 соединений

Вбросил, так вбросил. Аж лопасти затрещали. Назови три причины почему один ip не может принять больше 65535 соединений?

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

да я и не отрицаю, возможно и может :) но надо смотреть реализацию в ядре

еще такой момент, есть же возможность указать INADDR_ANY при вызове bind и соотв. принимать соединения на любой адрес одним сокетом, тут получается, что локальный адрес выпадает из признаков уникальности сокета :)

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

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

Из признаков уникальности bound сокета.

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