LINUX.ORG.RU

Положить очередь стрима на определенное ядро.

 , ,


0

3

Добрый вечер. Пишу многопоточное приложение, у которого каждый поток обрабатывает данные своего сокета (потоки выставляется affinity к одному ядру). Сейчас автоматическое распределение стримов по ядрам происходит ужасно, он может положить 3 из 4 в очередь на одно ядро (смотрю по ethtool -S) из-за чего машина не справляется с обработкой. Если ли возможность исправить эту ситуацию вручную (распределить стримы по очередям)?


Я не знаю, что за говно под словом «стримы» ты имеешь ввиду, но, глобально, распределить обработку пакетов по ядрам в linux помогает технология RPS. Гугл в помощь

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

я имею ввиду поток (stream) данных, приходящих на сокет. RPS - это ведь настройка NIC в целом, а мне надо распределить только для текущего приложения (причем мне это надо сделать изнутри).

Hait
() автор топика
Ответ на: комментарий от ttnl

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

Hait
() автор топика
Ответ на: комментарий от Hait

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

У ядра нет очередей пакетов. Я думаю, что ты хочешь невозможного (и ненужного).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А что за очереди тогда выводятся по 'ethtools -S'?


     Queue[0] InPackets: 1317147894
     Queue[0] OutPackets: 743795
     Queue[0] Restarts: 0
     Queue[0] InJumboPackets: 0
     Queue[0] InLroPackets: 0
     Queue[0] InErrors: 0
     Queue[1] InPackets: 1467899339
     Queue[1] OutPackets: 1262041
     Queue[1] Restarts: 0
     Queue[1] InJumboPackets: 0
     Queue[1] InLroPackets: 0
     Queue[1] InErrors: 0
     Queue[2] InPackets: 1270359724
     Queue[2] OutPackets: 2141474
     Queue[2] Restarts: 0
     Queue[2] InJumboPackets: 0
     Queue[2] InLroPackets: 0
     Queue[2] InErrors: 0
     Queue[3] InPackets: 693602894
     Queue[3] OutPackets: 920854
     Queue[3] Restarts: 0
     Queue[3] InJumboPackets: 0
     Queue[3] InLroPackets: 0
     Queue[3] InErrors: 0
Hait
() автор топика
Ответ на: комментарий от Hait

Это надо смотреть в документации на карту или ее драйвер.

tailgunner ★★★★★
()
Ответ на: комментарий от Hait

говорите про очередь которую якобы забираете с сокета а сами выхлоп внутренности сетевки показываете

anonymous
()

Вот мне интересно - какой выигрыш приносит помещение разных потоков, работающих с одним ресурсом, на одно ядро? Планировщики в linux конечно хороши, но даже их работа чего то стоит и стоимость не есть число отрицательное, как мне мыслится.

pon4ik ★★★★★
()
Ответ на: комментарий от Hait

думаешь, tailgunner знает о чём говорит?

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

видимо, узкое место не здесь. как минимум, InErrors == 0.

anonymous
()
Ответ на: комментарий от tailgunner

Я могу ошибаться, но разве это не упомянутые выше RPS? Я как-то считал длинну бэклога и там как раз была структура per-CPU. Помню что per_cpu в enqueue_backlog был сделан как макрос и не получалось из ebpf его дергать для перехвата cpu с номером ядра для последующего вытягивания длинны списка.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

Я могу ошибаться, но разве это не упомянутые выше RPS?

Насколько я знаю, RPS - это параллельная обработка прерываний от одной карты на разных процессорах. Никогда не слышал, чтобы он предоставлял юзерспейсу назначить сокету свой процессор.

AFAIK, вручную назначить сокет на процессор невозможно. На то, что нужно ТС, больше похоже RFS, но это опять же автоматический механизм, который вручную не настраивается. Хотя фразу «он может положить 3 или 4 очереди на одно ядро» я просто не понимаю.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

SO_INCOMING_CPU

Хм, есть возможность работать мимо RFS. Да, был неправ, признаю. Похоже, всё же есть способ сделать то, что хочет ТС.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.