Один миллион одновременных сеансов 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 года, поэтому они все еще могут не масштабироваться до миллиона., но они определенно были бы моей отправной точкой, если бы это была моя проблема, которую нужно решить.