Повысьте единственную переплетенную работу Asio

Я осуществляю таможенный сервер, который должен поддержать очень большое количество (100K или больше) долговечных связей. Сервер просто передает сообщения между гнездами, и он не делает никакой серьезной обработки данных. Сообщения маленькие, но многие из них получаются/посылаются каждую секунду. Сокращение времени ожидания является одной из целей. Я понимаю, что использование многократных ядер не улучшит работу, и поэтому я решил бежать, сервер в единственной нити, звоня run_one или опрос методы io_service объект. Так или иначе многопоточный сервер было бы намного более трудно осуществить.

Каковы возможные узкие места? Syscalls, пропускная способность, очередь завершения/событие demultiplexing? Я подозреваю, что посылка укладчиков может потребовать захвата (который сделан внутренне asio библиотекой). Действительно ли возможно отключить даже захват очереди (или какой-либо другой захват) в boost.asio?

Править: связанный вопрос. Работа syscall улучшается с многократными нитями? Мое чувство состоит в том, что, потому что syscalls атомный/синхронизируют ядром, добавляющим больше нитей, не улучшит скорость.

11
nl ja de
Если вы управляете всем в одной нити, вы don' t нужны любые (рукописные) замки.
добавлено автор Arne Mertz, источник
Используя многократные ядра, вероятно, улучшится, работа - посмотрите cmeerw.org/blog/748.html#748 и cmeerw.org/blog/746.html#746 для некоторых оценок я сделал в прошлом году.
добавлено автор cmeerw, источник

2 ответы

Вы могли бы хотеть читать мой вопрос от несколько лет назад, я спросил его, сначала исследовав масштабируемость Повышения. Asio, разрабатывая системное программное обеспечение для Синий суперкомпьютер Gene/Q.

Вычисление к 100k или большему количеству связей не должно быть проблемой, хотя необходимо будет знать об очевидных ограничениях ресурса, таких как максимальное количество открытых дескрипторов файлов. Если вы не прочитали оригинальное Бумага C10K, Я предлагаю читать его.

После того, как вы реализовали свое приложение, используя единственную нить и сингл io_service , я предлагаю заняться расследованиями, фонд нитей, призывающих, io_service:: управляемый() , и только тогда исследуют скрепление io_service к определенной нити и/или CPU. Есть многократные примеры, включенные в документацию Asio для всех трех из этих проектов, и несколько вопросов на ТАК с большей информацией. Знайте, что, поскольку вы вводите многократные нити, призывающие io_service:: управляемый() вы, возможно, должны осуществить берег s, чтобы гарантировать, чтобы у укладчиков был эксклюзивный доступ к структурам совместно используемых данных.

15
добавлено

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

Как правило, только узкое место для повышения:: asio - то, что epoll/kqueue реактор работает в mutex. Так, только одна нить делает epoll в то же самое время. Это может уменьшить работу в случае, если, когда у вас есть многопоточный сервер, который служит партиям и партиям очень маленькие пакеты. Но, imo это так или иначе должно быть быстрее, чем просто-singlethread сервер.

Теперь о вашей задаче. Если вы хотите просто передать сообщения между связями - я думаю, что это должен быть многопоточный сервер. Проблема - syscalls (recv/send и т.д.). Инструкция очень легка, думают, чтобы сделать для центрального процессора, но любой syscall не "очень легкая" операция (все относительно, но относительно других рабочих мест в вашей задаче). Так, с единственной нитью вы получите большой syscalls наверху, почему я рекомендую использовать многопоточную схему.

Кроме того, можно отделить io_service и заставить его работать "io_service за нить" идиома. Я думаю, что это должно дать лучшую работу, но у нее есть недостаток: если один из io_service получит слишком многочисленную очередь - другие нити не помогут ему, таким образом, некоторые связи смогут замедлиться. На другой стороне с единственным io_service - очередь наводняет, может привести к большому захвату наверху. Все, что можно сделать - делает оба варианта и измеряет пропускную способность/время ожидания. Должно быть не слишком трудно осуществить оба варианта.

9
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru