Лучший способ создать миллионное соединение TCP - PullRequest
3 голосов
/ 06 июля 2011

Мне нужно найти лучший способ для генерации миллиона TCP-соединений. (Больше это хорошо, меньше - плохо). Как можно быстрее машинно: D

Зачем мне это нужно? Я тестирую nat и хочу загрузить как можно больше записей.

Мой текущий метод заключается в создании подсети на фиктивном eth и последовательном подключении этого фиктивного к фактическому eth к локальной сети к nat к хосту.

subnetnicfake----routeToRealEth----RealEth---cable---lan----nat---host.   
|<-------------on my machine-------------------->|

Ответы [ 4 ]

3 голосов
/ 06 июля 2011

Один миллион одновременных сеансов TCP может быть затруднен: если для создания функций вы используете стандартный API сокетов connect(2), вы собираетесь использовать lot физической памяти: для каждого сеанса потребуетсяstruct inet_sock, который включает struct sock, который включает struct sock_common.

Я быстро догадался о размерах: struct sock_common требует примерно 58 байтов.struct sock требует примерно 278 байтов.struct inet_sock требуется примерно 70 байт.

Это 387 мегабайт данных до того, как вы получите и отправите буферы .(См. tcp_mem, tcp_rmem, tcp_wmem в tcp(7) для получения дополнительной информации.)

Если вы решите пойти по этому пути, я бы посоветовал установить элементы управления памятью на сокет так низко, какони идут.Я не удивлюсь, если 4096 будет самым низким, вы можете установить его.(SK_MEM_QUANTUM равно PAGE_SIZE, сохранено в sysctl_tcp_rmem[0] и sysctl_tcp_wmem[0].)

Это еще восемь гигабайт памяти - четыре для приемных буферов, четыре для отправляющих буферов.

И это в дополнение к тому, что система требует, чтобы ваши программы открывали миллион дескрипторов файлов.(См. /proc/sys/fs/file-max в proc(5).)

Вся эта память не может быть заменена - ядро ​​закрепляет свою память - так что вы действительно решаете эту проблему только64-битный компьютер с минимум восемью гигабайтами памяти.Вероятно, 10-12 лучше.

Один из подходов, используемых инструментами Paketto Keiretsu , состоит в том, чтобы открыть необработанное соединение, выполнить все трехсторонние рукопожатия TCP с помощью одного необработанного сокета ипопытайтесь вычислить все, что нужно, а не хранить его, чтобы обрабатывать гораздо большие объемы данных, чем обычно.Старайтесь хранить как можно меньше для каждого соединения и не используйте наивные списки или деревья структур.

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

0 голосов
/ 09 июля 2011

После поиска в течение многих дней я обнаружил проблему.Видимо, эта проблема хорошо продумана, и она должна быть, так как она очень простая.Проблема была в том, что я не знал, как эту проблему назвать.Среди знающих это, по-видимому, называется проблемой c10k.То, что я хотел, это проблема c1m.Однако, кажется, что прилагаются некоторые усилия, чтобы получить C500k.или Одновременное подключение 500 тыс.

0 голосов
/ 06 июля 2011

Вы пытались использовать tcpreplay ?Вы можете подготовить или перехватить один или несколько файлов захвата сети PCAP с нужным вам трафиком, а один или несколько экземпляров tcpreplay воспроизведут их для стресс-тестирования вашего брандмауэра / NAT.

0 голосов
/ 06 июля 2011

До тех пор, пока у вас есть доступ к порту 65536 в TCP, этого невозможно достичь, если у вас нет армии серверов для подключения.

Итак, как лучше? Просто откройте как можно больше соединений на серверах и посмотрите, что получится.

...