L3スイッチはL2スイッチとしてで使うと非効率?

2018年10月3日

はじめに

新しくCPUが3865Uのルーターを購入したのですが、目的の一つに省電力化があります。3865Uはkaby lakeに属するので、周波数が動的に変化したり、cstateと呼ばれるようなCPUのスリープ機能があります。OSとしてfreebsdを利用していますが、このステートの状態は

# sysctl dev.cpu | grep cx
dev.cpu.1.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc
dev.cpu.1.cx_usage_counters: 108898654 1835717 0
dev.cpu.1.cx_usage: 98.34% 1.65% 0.00% last 17us
dev.cpu.1.cx_lowest: C2
dev.cpu.1.cx_supported: C1/1/1 C2/2/151 C3/3/1034
dev.cpu.0.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc
dev.cpu.0.cx_usage_counters: 5461989 11682605 5116321
dev.cpu.0.cx_usage: 24.53% 52.48% 22.98% last 755us
dev.cpu.0.cx_lowest: C3
dev.cpu.0.cx_supported: C1/1/1 C2/2/151 C3/3/1034

で取得することができます。CPU0は手動で、C3を許可しています。

ここで気になるのは、CPU1が、C2まで許可されているステートの状態に入っていないことです。CPU1がスリープに入ったとしても、すぐに復旧できるC1の状態です。CPU0は許可されたC3まで落ちているので、何かしらあるのだろうと思いました。ではこのPCがやってることは何かについて考えることにします。

原因の仮説

このPCはNICが6個ついています。そのうち1つがWAN、それ以外をブリッジにしてLANとして扱っています。NICは受信したパケットをCPUに対して割り込みを行って処理します。・・・ん?これってもしかしてCPU1に対してNICが割り込みを行ってる?というより、割り込みの頻度が多すぎてCPU1がスリープに入れない?
もしそうであれば、LANからLANに転送するパケットが多ければCPUの使用率が上がる?

原因の調査

LANからLANにiperf3を利用してCPUの状態を確認してみます。

テスト前

CPU 0: 0.0% user, 0.0% nice, 0.4% system, 0.8% interrupt, 98.8% idle
CPU 1: 0.0% user, 0.0% nice, 0.0% system, 1.6% interrupt, 98.4% idle

テスト中

CPU 0: 3.9% user, 0.0% nice, 12.2% system, 0.8% interrupt, 83.1% idle
CPU 1: 4.3% user, 0.0% nice, 44.9% system, 0.0% interrupt, 50.8% idle

テスト結果

[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   107 MBytes   895 Mbits/sec
[  5]   1.00-2.00   sec   112 MBytes   941 Mbits/sec
[  5]   2.00-3.00   sec   112 MBytes   936 Mbits/sec
[  5]   3.00-4.00   sec   112 MBytes   942 Mbits/sec
[  5]   4.00-5.00   sec   111 MBytes   932 Mbits/sec
[  5]   5.00-6.00   sec   112 MBytes   941 Mbits/sec
[  5]   6.00-7.00   sec   112 MBytes   939 Mbits/sec
[  5]   7.00-8.00   sec   112 MBytes   939 Mbits/sec
[  5]   8.00-9.00   sec   108 MBytes   905 Mbits/sec
[  5]   9.00-10.00  sec   108 MBytes   905 Mbits/sec
[  5]  10.00-10.04  sec  4.43 MBytes   933 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.04  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.04  sec  1.08 GBytes   927 Mbits/sec                  receiver

以上から、ネットワーク転送を行わないブリッジであっても、CPUリソースを利用していることがわかりました。

L2スイッチを使ってみる

ではルーターにはネットワーク転送が必要となることだけしてもらい、L2スイッチに置き換えられるところは置き換えて見ます。

結果として、L2スイッチでのパケット転送はL3スイッチのCPUリソースを使用しませんでした。またL2スイッチとL3スイッチでのパケット転送能力に変化はありません。

[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   107 MBytes   895 Mbits/sec
[  5]   1.00-2.00   sec   112 MBytes   940 Mbits/sec
[  5]   2.00-3.00   sec   111 MBytes   927 Mbits/sec
[  5]   3.00-4.00   sec   112 MBytes   941 Mbits/sec
[  5]   4.00-5.00   sec   112 MBytes   935 Mbits/sec
[  5]   5.00-6.00   sec   112 MBytes   941 Mbits/sec
[  5]   6.00-7.00   sec   112 MBytes   941 Mbits/sec
[  5]   7.00-8.00   sec   111 MBytes   935 Mbits/sec
[  5]   8.00-9.00   sec   112 MBytes   941 Mbits/sec
[  5]   9.00-10.00  sec   112 MBytes   939 Mbits/sec
[  5]  10.00-10.05  sec  5.37 MBytes   918 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.05  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.05  sec  1.09 GBytes   933 Mbits/sec                  receiver

じゃあCPUは深くスリープできてるのかというと・・・

 # sysctl dev.cpu | grep cx
dev.cpu.1.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc
dev.cpu.1.cx_usage_counters: 111823634 1853675 0
dev.cpu.1.cx_usage: 98.36% 1.63% 0.00% last 3us
dev.cpu.1.cx_lowest: C2
dev.cpu.1.cx_supported: C1/1/1 C2/2/151 C3/3/1034
dev.cpu.0.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc
dev.cpu.0.cx_usage_counters: 5654525 12172826 5180620
dev.cpu.0.cx_usage: 24.57% 52.90% 22.51% last 679us
dev.cpu.0.cx_lowest: C3
dev.cpu.0.cx_supported: C1/1/1 C2/2/151 C3/3/1034

できてませんね。これは通常時のインターネット側に出るパケットが絶妙にCPUを叩き起こしているので、L2スイッチを使ったところで変化しないんでしょう。そもそもワイヤスピードの通信は家庭内であれば起きることはないはずなので、L3スイッチだけのほうが消費電力は少なくなる模様

まとめ

企業などのネットワークトラフィックが大きいところは、L3スイッチが必要なところを見極めてL2スイッチを導入しないとCPUがパンクします。家庭環境であれば、L3とL2を一つにしたほうが、電力を使用する機器が少なくなる事がわかりました。

一体誰得な情報だろう・・・