Eu tive um desafio semelhante (?) em uma caixa do Red Hat Enterprise Linux. Eu li o mesmo artigo, e concluí que meu problema real era que o padrão era usar todos os IRQs possíveis para obter cada CPU envolvida no trabalho de pacotes de rede. Concentrei a atividade de IRQ em um subconjunto de núcleos disponíveis e, em seguida, direcionei o trabalho de acordo. Aqui está o arquivo rc.local:
# Reserve CPU0 as the default default IRQ handler
for IRQ in 'grep eth0 /proc/interrupts | cut -d ':' -f 1'; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
for IRQ in 'grep eth1 /proc/interrupts | cut -d ':' -f 1'; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
for IRQ in 'grep eth2 /proc/interrupts | cut -d ':' -f 1'; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
for IRQ in 'grep eth4 /proc/interrupts | cut -d ':' -f 1'; do echo $(( (($IRQ & 1) + 1) << 2 )) > /proc/irq/$IRQ/smp_affinity; done
Aqui está o arquivo cgrules.conf que define / diferencia meu servidor web apache do 10gbe, de modo que o throughput de rede sério pode acontecer como deveria:
apache cpuset,cpu apache/
E aqui está o arquivo cgconfig.conf que realmente separa o servidor do resto das atividades da CPU:
mount {
cpuset = /cgroup/cpuset;
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
memory = /cgroup/memory;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}
group apache {
cpuset {
cpuset.memory_spread_slab="0";
cpuset.memory_spread_page="0";
cpuset.memory_migrate="0";
cpuset.sched_relax_domain_level="-1";
cpuset.sched_load_balance="1";
cpuset.mem_hardwall="0";
cpuset.mem_exclusive="0";
cpuset.cpu_exclusive="0";
cpuset.mems="1";
cpuset.cpus="4-7,12-15";
}
}
group apache {
cpu {
cpu.rt_period_us="1000000";
cpu.rt_runtime_us="0";
cpu.cfs_period_us="100000";
cpu.cfs_quota_us="-1";
cpu.shares="1024";
}
}
Uma configuração padrão (sem o IRQ e hacks cgroups) eu medi cerca de 5 Gb / s de throughput de rede. Com os IRQs concentrados e aleatórios, o IO da rede se afastou, eu medi o desempenho próximo de wirespeed (9.5Gb / s) usando netperf.
n.b. pacotes gigantescos não faziam diferença, seja para os números antes ou depois.