Информация об изменениях

Сообщение Re: Чтение из сети и обработка от 10.02.2022 0:43

Изменено 10.02.2022 0:58 Kernan

Re: Чтение из сети и обработка
Здравствуйте, tryAnother, Вы писали:

A>Вычитанные пакеты копируются каждый в свой буфер. Буферы складываются в лист. После того как вычитаны все пакеты в текущем такте обработке, данный список под критической секцией добавляется (splice) в другой и ставится event другому потоку о готовности.

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

A>Попробовал сделать вычитывание на основе синхронного и асинхронного boost::asio производительность оказалась недостаточная, стали происходить потери пакетов от железки (единицы пакетов в секунду при передаче 20000) при том что тестовый код никак больше не обрабатывал пакеты, а только смотрел за шагом номера пакета.

A>Поэтому сейчас оставлен периодически просыпающийся поток с setsockopt(sock, SO_RCVBUF, ...) и ioctlsocket(sock, FIONREAD, ...).
Пытайся предвыделять память сразу большими кусками после чего используй её как циклический буфер для входящих пакетов на протяжении жизни программы. Это значит что тебе надо сделать буфер на 100.000Кб, например, на 5секунд трафика. Размер определяется экспериментально поэтому можно и больше. Чем меньше у тебя выделений памяти, тем лучше, но в идеале их не должно быть в процессе работы. Дальше оптимизируй копирования, в идеале у тебя вся работа должна быть на этом же буфере. Потом избавься от критических секций т.к. при большом буфере вряд ли обработчик не успеет обработать данные, но надо повесить ассерты на это. Потом прибей поток который вычитывает данные из сети к одному ядру и такое же сделай для обработчиков, должно помочь с кэш мисами. Естественно, все сокеты должны быть асинхронные, никаких "поток просыпается раз в 20мс" быть не должно.

A>В общем может кто подскажет интересные решения

Профилируй, посмотри сколько раз выделяется память, сколько копирований, что за алгоритм сортировки у тебя используется и как он работает.
Re: Чтение из сети и обработка
Здравствуйте, tryAnother, Вы писали:

A>Вычитанные пакеты копируются каждый в свой буфер. Буферы складываются в лист. После того как вычитаны все пакеты в текущем такте обработке, данный список под критической секцией добавляется (splice) в другой и ставится event другому потоку о готовности.

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

A>Попробовал сделать вычитывание на основе синхронного и асинхронного boost::asio производительность оказалась недостаточная, стали происходить потери пакетов от железки (единицы пакетов в секунду при передаче 20000) при том что тестовый код никак больше не обрабатывал пакеты, а только смотрел за шагом номера пакета.

A>Поэтому сейчас оставлен периодически просыпающийся поток с setsockopt(sock, SO_RCVBUF, ...) и ioctlsocket(sock, FIONREAD, ...).
Пытайся предвыделять память сразу большими кусками после чего используй её как циклический буфер для входящих пакетов на протяжении жизни программы. Это значит что тебе надо сделать буфер на 100.000Кб, например, на 5секунд трафика. Размер определяется экспериментально поэтому можно и больше. Чем меньше у тебя выделений памяти, тем лучше, но в идеале их не должно быть в процессе работы программы. Дальше оптимизируй копирования, в идеале у тебя вся работа должна быть на этом же буфере. Потом избавься от критических секций т.к. при большом буфере вряд ли обработчик не успеет обработать данные, но надо повесить ассерты на это. Потом прибей поток который вычитывает данные из сети к одному ядру и такое же сделай для обработчиков, должно помочь с кэш мисами. Естественно, все сокеты должны быть асинхронные, никаких "поток просыпается раз в 20мс" быть не должно.

A>В общем может кто подскажет интересные решения

Профилируй, посмотри сколько раз выделяется память, сколько копирований, что за алгоритм сортировки у тебя используется и как он работает.