[GTER] Linux + ksoftirqd
Rafael Koike
koike.rafael at gmail.com
Mon Jul 27 21:59:37 -03 2015
O FreeBSD tem uma funcionalidade muito interessante chamada Polling.
*DESCRIPTION* <https://www.freebsd.org/cgi/man.cgi?query=polling&sektion=4#end>
Device polling (*polling* for brevity) refers to a technique that lets the
operating system periodically poll devices, instead of relying on the
devices to generate interrupts when they need attention. This might seem
inefficient and counterintuitive, but when done properly, *polling* gives
more control to the operating system on when and how to handle devices,
with a number of advantages in terms of system responsiveness and perfor-
mance.
In particular, *polling* reduces the overhead for context switches which is
incurred when servicing interrupts, and gives more control on the sched-
uling of the CPU between various tasks (user processes, software inter-
rupts, device handling) which ultimately reduces the chances of livelock
in the system.
*Principles* *of* *Operation*
In the normal, interrupt-based mode, devices generate an interrupt when-
ever they need attention. This in turn causes a context switch and the
execution of an interrupt handler which performs whatever processing is
needed by the device. The duration of the interrupt handler is poten-
tially unbounded unless the device driver has been programmed with real-
time concerns in mind (which is generally not the case for FreeBSD driv-
ers). Furthermore, under heavy traffic load, the system might be persis-
tently processing interrupts without being able to complete other work,
either in the kernel or in userland.
Device polling disables interrupts by polling devices at appropriate
times, i.e., on clock interrupts and within the idle loop. This way, the
context switch overhead is removed. Furthermore, the operating system
can control accurately how much work to spend in handling device events,
and thus prevent livelock by reserving some amount of CPU to other tasks.
Enabling *polling* also changes the way software network interrupts are
scheduled, so there is never the risk of livelock because packets are not
processed to completion.
Realmente as placas de rede podem gerar muitas interrupções e isso pode
sobrecarregar a CPU e dependendo do software que estiver executando e em
qual CPU a thread do programa estiver o context switch será grande.
Como outros colegas falaram o que você deveria fazer é setar afinidade do
driver de rede E do programa que utiliza esta interface a uma mesma CPU
para diminuir o context switch.
O FreeBSD desenvolveu uma solução elegante para resolver isso.
Ao invés de dar atenção as chamadas de interrupção da placa de rede ela faz
um polling de tempos em tempos e coleta os dados que chegaram.
Claro que o tempo do polling tem que ser rápido o suficiente para não
encher o buffer da placa de rede e também não gerar atrasos no
processamento da thread.
Mas se voce considerar que o polling pode ocorrer a cada ciclo de clock ou
X milissegundos você poderá ter um tradeoff de um pequeno aumento de
latência versus um throughtput muito maior.
Sem contar que com isso poderá balancear igualmente a carga de
processamento entre múltiplas CPUs.
https://www.freebsd.org/cgi/man.cgi?query=polling&sektion=4
Em 26 de julho de 2015 13:21, Marcelo Gondim <gondim at bsdinfo.com.br>
escreveu:
> Bom dia à todos,
>
> Já tem alguns anos que uso FreeBSD na minha infra e não tenho nada do que
> reclamar quanto à isso. Tudo funciona liso e redondo mas tenho uma
> curiosidade que sempre me segue. Na época que migrei de Linux para FreeBSD
> sofria em demasiado com o chamado ksoftirqd que subia à 100% quando nosso
> tráfego subia no horário de pico. Na época me lembro, mexi em hardware,
> kernel, tentei Debian e CentOS e nada resolvia. Vi diversos relatos na
> Internet com o mesmo problema e hoje, depois de 5 anos foi feito algo?
> Tenho um tráfego de quase 5Gbps hoje e fico imaginando como estaria o
> ksoftirqd nesse momento.
>
> Algum amigo conseguiu essa façanha de fazer ele segurar tanto tráfego em
> algum Linux?
>
>
> []'s
> Gondim
> --
> gter list https://eng.registro.br/mailman/listinfo/gter
>
More information about the gter
mailing list