L3スイッチはL2スイッチとしてで使うと非効率?
はじめに
新しく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を一つにしたほうが、電力を使用する機器が少なくなる事がわかりました。
一体誰得な情報だろう・・・
ディスカッション
コメント一覧
まだ、コメントがありません