このページの翻訳:
ソースの表示
最近の変更サイトマップ

FreeBSDのkern.random.harvest.maskについて

FreeBSDのネットワークチューニングについて調べてると「random harvestを最適化せよ」という指示が随所で出てくる。ネットワークなのに乱数?と不思議に思って調べたメモ。ここで書くことは、全て一次ソースのrandom(4)random_harvest(9)に書いてあり、FreeBSD 12.1-RELEASE時点での情報である。

まずはrandom harvestについて。

FreeBSDは乱数を返すスペシャルファイル/dev/randomを持つが、通常、その実態は擬似乱数生成器となっている。つまり数式で求められた確定的な乱数っぽい数値を返しているに過ぎず、乱数っぽさの維持にはエントロピーの質が重要となる。FreeBSDでは、エントロピーの収集のことをrandom harvestと呼んでいるようだ。良質なエントロピーを育み利用する、という感じなので“harvest”はなかなか的を射た呼び方だと思う。

そのエントロピー収穫先を制御するのがkern.random.harvest.maskカーネル変数というわけ。

値は収穫先ごとのビットフラグで、1ならエントロピー源として使う、0なら使わないことを意味する。10進数のマスク値を見ても良くわからないので、エイリアスであるmask_symbolicやmask_binを見た方がいいだろう。うちの環境では以下のとおりだった。

$ sysctl kern.random
kern.random.fortuna.minpoolsize: 64
kern.random.harvest.mask_symbolic: PURE_RDRAND,[UMA],[FS_ATIME],SWI,INTERRUPT,NET_NG,NET_ETHER,NET_TUN,MOUSE,KEYBOARD,ATTACH,CACHED
kern.random.harvest.mask_bin: 00000010000000111111111
kern.random.harvest.mask: 66047
kern.random.random_sources: 'Intel Secure Key RNG'

mask_binがmask値の2進数表現、mask_symbolicがmaskを更に読みやすくしたシステムで利用可能なエントロピー源の一覧で、[]で囲まれた収穫先は使われていないことを意味する。FreeBSD 12.1-RELEASE時点で、24個のエントロピー源が定義されているようだ(sys/sys/random.h)。

ご覧の通りNET_ETHERもエントロピー源として使われている。それがなぜネットワーク性能に影響するかというと、エントロピー収穫の際のロック競合が少なくない影響を及ぼしているとのことだ。とりわけ、10ギガビット以上の高速ネットワークではバカにならないそうで。なるほどねー。

参考サイト

世界最安の40GbE対応スイッチCRS326-24S+2Q+RMがやってきた!

真っ当な流通ルートで購入できるものでは世界最安1)と思われる40GbE対応スイッチ、CRS326-24S+2Q+RMがやってきた!流石は俺たちのMikroTik!!とかいいつつ、同社の製品を買うのは初めてだったりする。

このページに辿り着くくらいの人には釈迦に説法だろうけど、CRS326-24S+2Q+RMは10ギガビット対応のSFP+ポートを24個、加えて40ギガビット対応のQSFP+ポートを2つ備えながら499ドルという超破格を実現した頭おかしいスイッチである。普通に考えたら499ドルは結構な額だが、この性能でこの額は本当に価格破壊もいいところ。しかもEuroDKでは384ドルで売ってる()。マジでありえん。

というわけで誘惑に勝てずに買ってしまった。8/22(木)に注文して26(月)に配達される40GbE顔負けの高速配送っぷりだったけど、結局受け取りは週末までお預け。送料やら消費税やらで、最終的に448ドル+1900円となった。

設置場所の問題やらMPOケーブル不足やらで本格的には試せてないが、ひとまず下表環境のiperf3 (MTU=1500)で28Gbpsほど出ることは確認。

サーバ クライアント
OS FreeBSD 11.2-RELEASE (x64) Windows 10 Pro. (x64)
M/B Supermicro X10DRi MSI X370 SLI PLUS
CPU Xeon E5-2648L v3 @1.8GHz Ryzen 7 1700 @3.0GHz
RAM Registered DDR4-2400 16GB×4 (2133MHz駆動) DDR4-2666 16GB×4
NIC ConnectX-3 Pro EN (PCIe 3.0x8)

使われてるスイッチチップは98DX8332っぽい。明言はされてないけど、2.5GbE/5GbEにも対応してる予感…?ポートの速度設定画面にチェックボックスがあるんですけど……。

OSはRouterOSとSwOSのデュアル対応なので、一応L3の処理も可能。だけどスイッチチップで処理できないものはCPU処理となるうえ、内部リンクは1Gbpsなので折角の性能が死ぬ。なので素直にL2スイッチとして使うか、軽めのフィルタでWANを受けるとかに留めるのが吉。幸い10Gポートは腐るほどあるからLAG組んでL3処理は上位ルータに投げてしまえばいいかと。AT-x510-28GTXも泣いて喜ぶね!

ざっくり消費電力は以下の通り。

状況 消費電力
待機(SFPモジュールは一切挿してない状態) 13W
待機(40GBASE-SR4×2でリンクアップ) 15~16W
40GBASE-SR4でiperf実行 17W

出荷時のRouterOSバージョンではファンが結構うるさいが、6.45.5に更新したらかなり静かになった。基本は停止、内部温度に応じて回転数可変のなかなかアグレッシブな制御をしてくれるようになる。消費電力とあわせて一般のご家庭にも大変やさしい仕様と言える。ありがとうMikroTik。なお、回転時はそれなりに音がする。風切り音よりファン自体の回転音が大きい感じ。個人的には許容範囲内だけど気になる人は気になると思われる。

1)
2019年9月4日現在

FreeBSDでQSFP+トランシーバの相性によって40GBASE-SR4が再リンクしなくなる事があるっぽい

家鯖(FreeBSD 11)とメインマシン(Windows 10)をConnectX-3の40GBASE-SR4で繋ぐようになって早5ヵ月。メインマシンをスリープ&レジュームすると、40GBASE-SR4が再リンクアップせず、サーバ側のQSFP+トランシーバを抜き差しすると直る、という現象が発生することがあった。

その時は決まって、サーバ側のTXシグナルが出ていないという状況。

$ ifconfig -v mlxen0
mlxen0: flags=8947<UP,BROADCAST,DEBUG,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=ad00b9<RXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWFILTER,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6>
        ether e4:1d:2d:74:16:e0
        hwaddr e4:1d:2d:74:16:e0
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet 40Gbase-CR4 <full-duplex> (autoselect)
        status: no carrier
        plugged: QSFP+ 40GBASE-SR4 (MPO Parallel Optic)
        vendor: Mellanox PN: MC2210411-SR4 SN: MEQSRIC0115 DATE: 2015-03-23
        compliance level: Unspecified
        nominal bitrate: 10300 Mbps
        module temperature: 40.00 C voltage: 3.22 Volts
        lane 1: RX: 0.57 mW (-2.37 dBm) TX: 0.36 mW (-4.38 dBm)
        lane 2: RX: 1.06 mW (0.26 dBm) TX: 0.37 mW (-4.30 dBm)
        lane 3: RX: 0.96 mW (-0.17 dBm) TX: 0.00 mW (-30.46 dBm)
        lane 4: RX: 1.12 mW (0.52 dBm) TX: 0.37 mW (-4.20 dBm)

スリープ&レジュームで電気的に不連続状態になるメインマシン側がそうなるならまだしも、無関係なサーバ側がなんで死ぬのか全く意味がわからないのだが、結局のところQSFP+モジュールとNICとドライバの相性らしい。とりあえず10GtekのMellanox互換モジュールAMQ10-SR4-M1からAvago AFBR-79EQPZに変えて2ヵ月ほど経つが、今のところ再現はしていない。メインマシンの方は変わらずAMQ10-SR4-M1を使っていて特に問題なし。

やっぱりサーバ側の相性ということでFAで、直ったっぽい?

逸般の誤家庭で40GbEはじめますた その3(構築編)

機材が揃ったので、サーバ/クライアント直結40GBASE-SR4ネットワークを構築する。

ネットワーク概略図を示す。

クライアントとサーバを40GBASE-SR4で直結し、サーバで40GbEと1GbEをブリッジする。こうすることで、40GbE対応スイッチがなくとも、40GbEによる高速化の恩恵を受けつつ既存の1000BASE-Tネットワークとの相互運用が実現できる。サーバが落ちてると、当然ながらクライアントのネットワークが使えなくなってしまうが、うちでは常時稼働させてるので殆ど問題ない。いざって時はクライアントを従来通り1000BASE-Tで繋げばいいだけだし、そこは割り切る。

40GbEといっても、ネットワークカードは何の変哲もないPCI-Expressカードだ。ビデオカード等を取り付ける要領でマシンにNICを挿し、ドライバをインストールすれば普通のNICとして使える。

FreeBSD(サーバ)では/boot/loader.confに以下の1行を追加し再起動すると、mlxen0/mlxen1というネットワークデバイスが生えてくる。

mlx4en_load="YES"

40GbEと1GbEのブリッジは/etc/rc.confに以下の設定を追加する。このサーバではsshやSambaなどのサービスを提供しているので、igb0のIPアドレスをbridge0に付け替える。ブリッジにIPアドレスを振る場合は、必ずブリッジそのもの(ここではbridge0)に対して行う。ブリッジメンバ(ここではigb0)に振ると、一見動いているように見えてブロードキャストは到達するのにユニキャストは到達しない、といった非常に分かりにくい問題を誘発することになる。

cloned_interfaces="bridge0"
ifconfig_bridge0="ether XX:YY:ZZ:00:00:01 addm igb0 addm mlxen0 up"
ifconfig_bridge0_alias0="inet 192.168.0.1 netmask 255.255.255.0"
ifconfig_igb0="up"
ifconfig_mlxen0="up"

うまくブリッジが出来上がればifconfigが↓こんな感じになる。bhyve用のブリッジも兼用してるので余計なtapが刺さってるのは無視してくだしあ。

$ ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        description: vm-public
        ether XX:YY:ZZ:00:00:01
        inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
        nd6 options=9<PERFORMNUD,IFDISABLED>
        groups: bridge vm-switch viid-4c918@
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 8 priority 128 path cost 2000000
        member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 7 priority 128 path cost 2000000
        member: mlxen0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 4 priority 128 path cost 500
        member: igb0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 1 priority 128 path cost 2000000

クライアントのネットワークが正しく使えることを確認する。インターネットに繋いだり、サーバにsshしたり…。設定に間違いがなければ、従来と全く同じように使えるはず。

最後にSambaでファイルコピーを行ったGIF動画を貼っておく。サーバのSSD(Intel DC S3500シリーズ)の速度がボトルネックとなり10Gb/秒にも満たないが、素敵な速さだ。

逸般の誤家庭で40GbEはじめますた その2(購入編)

家のネットワークを10GBEにするつもりが結局40Gbeにすることになったのが前回。機材は以下のものを購入した。

機材 型番 購入先
Mellanox ConnectX-3 Pro EN MCX314A-BCCT ヤフオク
10Gtek 40GBASE-SR4 QSFP+ Transceiver for MMF AMQ10-SR4-M1 10Gtek
10Gtek MPOメス-メス Type-B OM3 MMFコード 20m OM3-MPO-12MPO-20M 10Gtek

NICはヤフオクでたまたま安いのが出ていたので迷わずお買い上げ。40GBASE-SR4 QSFP+トランシーバとMPOパッチコードは10Gtekから購入。MPOコードはコネクタのオスメスやらコードの極性やらがややこしい。なので10Gtekに質問メール投げたら、すぐさま適切な回答と共に「見積もる?」と来たもんだ。どういうわけか直販サイトよりも安かったので、そのままお買い上げ。

今回の注文で中華の勢いとエネルギーを垣間見た気がする。こちらが日本人客だと判明すれば、わざわざ宛名にさん付けしてくるし(日本からそれなりに注文あるんだろうね)、小口注文でも親身に対応、特注品も1つから作ってくれてそれでいて安い。そりゃ日本は負けちゃうよねーっていう…。割と本気で危機感を覚えますた。

閑話休題。

購入の時系列としては、先にNICで落札から3日で到着。トランシーバとケーブルは中国からの発送にもかかわらず、輸送期間含め5日で到着。送料20ドルのFedEx扱いで、発送の翌日には国内に入り、その翌日には配達されて現代の物流マジパネェっす。

届いた機材たちはこんな感じ。ケーブルは検査証も入っててしっかりしてるねー。

本プロジェクト開始までは名前すら知らなかったMPOコードを初めて手にしたけど、思いの外取り回しが良くてビックリ。その辺のUTPケーブルより細くて軽く、STPケーブルよりしなやかでええじゃないか。といっても、最小曲げ半径は銅線より劣るはずなので、調子に乗ってはいかん。

次でいよいよ40GBASE-SR4ネットワークを構築していく。

start.txt · 最終更新: 2019-08-19 02:45 by Decomo
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0