Оптимальное количество потоков сокетов (..) - PullRequest
0 голосов
/ 13 мая 2018

Если у меня есть массив из N сокетов, и мне нужно отправить (..) данные в каждый из сокетов с максимально возможной скоростью, какое число потоков будет оптимальным для этого?ОС - это linux.

Например, если у меня есть физические ядра C, должны ли быть потоки C, каждый из которых выполняет send (..)?Будет ли это эффективно?Другими словами, мой вопрос, как syscall send (..) обрабатывается ядром linux и как данные, поступающие на него, будут запланированы в ядре.Я помню, как читал документацию по сокетам BSD, что на самом деле все системные вызовы send (..) для сокетов помещают данные в очередь, обрабатываемую одним потоком, поэтому код:

thread1 -> send(sock1, ..)
..
threadN -> send(sockN, ..)

будет более или менееэквивалент (минус время обработки данных отправкой перед отправкой в ​​ядро) по производительности сети с кодом

thread -> send(sock1, ..), ..., send(sockN, ..)

Но это было из книги середины 1990 года, я думаю, что современные ОС должны измениться после этого времени.

1 Ответ

0 голосов
/ 13 мая 2018

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

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

Я считаю, что это лучше, чем поддерживать сотни потоков, которые спят.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...