2台のワークステーションのネットワークパフォーマンスをテストしています。各ワークステーションには、2.4GHzXeonクアッドコアプロセッサとNC550SFPPCIeデュアルポート10GbEサーバーアダプタが背中合わせにリンクされています。
RAMの帯域幅(約12Gbps)を確認したので、ここでボトルネックはありません。 PCIeバス速度も問題ありません。
UDPの最小パケットサイズを使用して最大ppsをテストしていますが、結果は次のように悲惨です:2012-lpc-networking-qdisc-fastabend.pdf(申し訳ありませんが、投稿できるリンクは1つだけです)。パケットサイズとMTUを増やすと、回線速度(〜9.9Gbps)に近づくことができます。
NSTスクリプト、複数のスレッド用のmacvlanインターフェイスでpktgenを使用していますが、4つのコアすべてが100%で最大1Mppsしか得られません。
PktgenのTXパフォーマンスを改善するために、私はこのドキュメントに出くわしました: Linuxネットワークスタックでのスケーリング
私はチェックしました、そしてはい、私はmq qdiscsを持っています、それは最高のパフォーマンスをもたらすはずです:
# ip link list | grep eth3
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
問題は、1つのTXキューのみが使用されているという事実にあると思います。
# dmesg | grep be2net
[ 4.528058] be2net 0000:01:00.1: irq 47 for MSI/MSI-X
[ 4.528066] be2net 0000:01:00.1: irq 48 for MSI/MSI-X
[ 4.528073] be2net 0000:01:00.1: irq 49 for MSI/MSI-X
[ 4.528079] be2net 0000:01:00.1: irq 50 for MSI/MSI-X
[ 4.528104] be2net 0000:01:00.1: enabled 4 MSI-x vector(s)
[ 4.696026] be2net 0000:01:00.1: created 4 RSS queue(s) and 1 default RX queue
[ 4.761108] be2net 0000:01:00.1: created 1 TX queue(s)
Linuxネットワークスタックでのスケーリング から複数のTXキューを有効にする方法についてのヒントを得ました:
マルチキュー対応のドライバーNICは通常、カーネルモジュールパラメーターを提供するか、構成するハードウェアキューの数を指定します。たとえば、bnx2xドライバーでは、このパラメーターはnum_queuesと呼ばれます。 RSS構成では、デバイスが十分なキューをサポートしている場合はCPUごとに1つの受信キューを使用するか、メモリドメインが特定のメモリレベル(L1、L2、NUMA)を共有するCPUのセットである場合はメモリドメインごとに少なくとも1つを使用します。ノードなど)。
私はEmulexのbe2netドライバーのドキュメントをすべて調べましたが、運が悪かったのでメールを送信しました。また、カーネルソースをざっと読みました。
私は、NICに最新のファームウェアを備えたUbuntu 12.04に最新のカーネルバージョン(3.10)を持っています。
アイデアは誰ですか?
ありがとう!
Red Hat Enterprise Linuxボックスでも同様の(?)チャレンジがありました。私は同じ論文を読み、私の本当の問題は、すべての可能なIRQを使用してすべてのCPUをネットワークパケットの動作に関与させるというデフォルトであると結論付けました。 IRQアクティビティを利用可能なコアのサブセットに集中させ、それに応じて作業を進めました。 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
これは、Apache Webサーバーを10gbeから定義/区別するcgrules.confファイルです。これにより、想定どおりに深刻なネットワークスループットが発生する可能性があります。
Apache cpuset,cpu Apache/
そして、これが実際にサーバーを残りのCPUアクティビティから分離するcgconfig.confファイルです。
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";
}
}
デフォルト構成(IRQおよびcgroupsハックなし)では、約5Gb/sのネットワークスループットを測定しました。 IRQが集中し、ランダムネットワークIOが離れた状態で、netperfを使用してほぼワイヤスピード(9.5Gb/s)のパフォーマンスを測定しました。
n.b.ジャンボパケットは、前の番号にも後の番号にも違いはありませんでした。