Как ограничить память Boost.Asio - PullRequest
1 голос
/ 05 мая 2020

У меня проблемы с управлением работой .post() в Boost.Asio io_context, у меня есть несколько вопросов по этому поводу (предупреждение newb ie).

Фон: Я пишу библиотеку, которая подключается к большому количеству разных хостов на короткие периоды времени каждый (подключение, отправка данных, получение ответа, закрытие), и я прикинул с помощью Boost.Asio. Документация скудна (тоже DRY?)
Мой текущий подход таков: (при условии четырехъядерного компьютера): два физических ядра выполняют синхронизацию с привязкой к ЦП c операций и post() дополнительные рабочие элементы к io_context. Два других потока - .run() обрабатывают и выполняют обработчики завершения.

1- Планировщик работ
Согласно этот замечательный ответ ,

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

Когда boost.asio что делает? На каком основании в дальнейшем обрабатываются поставленные в очередь работы?

2- Несколько производителей / несколько потребителей

Согласно Эта статья ,

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

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

3- Действительно ли нити необходимы? Как мне «отключить их»
Как подробно описано в этом ответе , boost использует неявную цепочку для каждого соединения. При создании потенциально миллионов соединений экономия памяти за счет «обхода» цепей имеет для меня смысл. Поскольку запросы, которые я делаю, независимы (разные хосты для каждого запроса), операции, которые я выполняю в рамках одного соединения, уже сериализованы (цепочка обратных вызовов), поэтому у меня нет перекрывающихся операций чтения и записи, и от Boost.Asio не ожидается никакой синхронизации. Имеет ли смысл пробовать обходить пряди? Если да, то как?

4- Подход к дизайну масштабирования (немного расплывчатый, потому что я понятия не имею) Как указано в моем фоновом разделе, я использую два io_contexts на двух физические ядра, каждое с двумя потоками, одним для записи и одним для чтения. Моя цель здесь - извергать пакеты как можно быстрее, и я уже

  • Скомпилировал asio с BoringSSL (OpenSSL - серьезное узкое место)
  • Написал свой собственный c - служба резолвера ares, чтобы избежать asyn c -i sh DNS-запросы, выполняющиеся в потоке l oop.

Но все же случается, что мой сетевой драйвер начинает тайм-аут при открытии нескольких подключений . Итак, как я динамически регулирую пропускную способность boost.asio, сетевой адаптер может с этим справиться?

Мои вопросы, скорее всего, плохо информированы, так как я не эксперт в сети программирование, и я знаю, что это сложная проблема, я был бы признателен, если бы кто-нибудь оставил мне указатели, чтобы я посмотрел, прежде чем закрыть вопрос или сделать его "мертвым".

Спасибо.

...