<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ref="http://purl.org/rss/1.0/modules/reference/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
	<channel rdf:about="http://xmms.jp/blog/rss.rdf">
		<title>PC Junkie Rev3.0</title>
		<link>http://xmms.jp/blog/index.php</link>
		<description><![CDATA[<a href=static.php?page=about_copyright>about copyright</a>]]></description>
		<items>
			<rdf:Seq>
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry241208-071620" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry240328-001302" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry240112-034641" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry240112-021611" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry230306-160036" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry221113-092103" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry220325-204409" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry200817-003557" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry200812-194208" />
				<rdf:li resource="http://xmms.jp/blog/index.php?entry=entry190909-221818" />
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry241208-071620">
		<title>【HW】 Proxmox VEでInfiniband+NFS over RDMAを使う</title>
		<link>http://xmms.jp/blog/index.php?entry=entry241208-071620</link>
		<description><![CDATA[※2025/10 追記<br />改めて検証して手順だけまとめました。こちらのほうが読みやすいです。<br /><a href="https://xmms.jp/confluence/pages/viewpage.action?pageId=101122062" >https://xmms.jp/confluence/pages/viewpage.action?pageId=101122062</a><br />一応過去のものも残しておきます<br /><br /><a href=images/s-IMG_20241208_063941.jpg class=lb><img src=images/s-IMG_20241208_063941.jpg width=1000px></a><br><br /><br />　かなり長いことInfinibandを使っていますが、Infinibandで試そうと思いつつ全く試していなかったことがあります。それがNFS over RDMAです。<br /><br /> ESXiでIB+NFSoRDMAに対応していれば試していたのですが、これが非対応だったことと<a href="https://xmms.jp/blog/index.php?entry=entry221113-092103" >SRPが速すぎて</a>それ以上追求するモチベーションがわかなかったことが理由でした。<br /><br /> しかし、最近PVEを検証する機会があり、その中でどうもPVEのストレージとしてIB+NFS+RDMAがいけそうだというのがわかったものの、ほかを探しても一切の情報がないので検証してみました。<br /><br /><br />　PVEに行く前にそもそもNFSoRDMAってどう使うの?という疑問があり色々ググりましたが、NFSサーバ側には svcrdmaモジュールが必要で、クライアント側にはxprtrdmaが必要になるみたいですが、<br />Debian12ではrpcrdma.koのエイリアスとしてすでにInboxでドライバをもっていることがわかりました。<br /><a href="https://enterprise-support.nvidia.com/s/article/howto-configure-nfs-over-rdma--roce-x" >https://enterprise-support.nvidia.com/s/article/howto-configure-nfs-over-rdma--roce-x</a><br /><br /><blockquote> root@debian:~# modinfo svcrdma<br />filename:       /lib/modules/6.1.0-28-amd64/kernel/net/sunrpc/xprtrdma/rpcrdma.ko<br />alias:          rpcrdma6<br />alias:          xprtrdma<br />alias:          svcrdma<br />license:        Dual BSD/GPL<br />description:    RPC/RDMA Transport<br />author:         Open Grid Computing and Network Appliance, Inc.<br />depends:        sunrpc,ib_core,rdma_cm<br />retpoline:      Y<br />intree:         Y<br />name:           rpcrdma<br />vermagic:       6.1.0-28-amd64 SMP preempt mod_unload modversions<br />sig_id:         PKCS#7<br />signer:         Debian Secure Boot CA<br />sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43<br />sig_hashalgo:   sha256<br />signature:      15:83:F8:C8:E4:FE:CB:21:AA:92:43:39:E8:FC:5F:61:0C:D9:3E:F9:<br />                28:1D:9A:1C:35:25:58:08:0C:DB:8E:D5:07:36:CD:E4:D5:1E:30:2A:<br />                61:FE:20:AB:DF:98:C0:55:C5:F6:6E:B8:8B:32:42:D4:D5:9A:58:44:<br />                E5:EB:5A:FB:B6:06:E9:1E:B2:0A:F6:D1:FC:64:B1:F9:68:DF:55:06:<br />                D3:70:DB:13:35:99:FF:2B:6C:42:8C:D0:1D:C7:D6:3A:BC:55:04:08:<br />                0A:7D:1D:6A:EF:D6:70:32:BB:A4:B5:D3:2A:62:2E:1A:1C:F9:D4:B4:<br />                B6:87:4E:FF:F8:C3:96:3E:09:2A:86:4C:41:F3:2B:9E:AA:AE:07:0D:<br />                98:A4:EA:D4:5F:5F:E3:CC:DF:42:1F:79:FF:F7:B6:77:DF:09:BF:38:<br />                74:6F:1B:18:D0:48:BF:61:02:DC:25:7A:CE:6D:91:79:06:4B:A2:02:<br />                28:85:A4:D3:7A:21:79:80:31:6C:98:B9:6F:E2:94:BA:CB:AB:A9:03:<br />                6A:A8:17:3F:26:4B:91:42:E0:5C:53:6E:B2:D3:99:63:24:04:FD:32:<br />                3A:FF:2D:48:A5:B5:D4:89:B9:DD:D5:FC:FA:15:5E:1D:35:06:C0:46:<br />                F6:C7:CE:0F:B7:4E:1F:38:F2:5E:A5:46:8E:1C:7C:9C<br />root@debian:~# modinfo xprtrdma<br />filename:       /lib/modules/6.1.0-28-amd64/kernel/net/sunrpc/xprtrdma/rpcrdma.ko<br />alias:          rpcrdma6<br />alias:          xprtrdma<br />alias:          svcrdma<br />license:        Dual BSD/GPL<br />description:    RPC/RDMA Transport<br />author:         Open Grid Computing and Network Appliance, Inc.<br />depends:        sunrpc,ib_core,rdma_cm<br />retpoline:      Y<br />intree:         Y<br />name:           rpcrdma<br />vermagic:       6.1.0-28-amd64 SMP preempt mod_unload modversions<br />sig_id:         PKCS#7<br />signer:         Debian Secure Boot CA<br />sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43<br />sig_hashalgo:   sha256<br />signature:      15:83:F8:C8:E4:FE:CB:21:AA:92:43:39:E8:FC:5F:61:0C:D9:3E:F9:<br />                28:1D:9A:1C:35:25:58:08:0C:DB:8E:D5:07:36:CD:E4:D5:1E:30:2A:<br />                61:FE:20:AB:DF:98:C0:55:C5:F6:6E:B8:8B:32:42:D4:D5:9A:58:44:<br />                E5:EB:5A:FB:B6:06:E9:1E:B2:0A:F6:D1:FC:64:B1:F9:68:DF:55:06:<br />                D3:70:DB:13:35:99:FF:2B:6C:42:8C:D0:1D:C7:D6:3A:BC:55:04:08:<br />                0A:7D:1D:6A:EF:D6:70:32:BB:A4:B5:D3:2A:62:2E:1A:1C:F9:D4:B4:<br />                B6:87:4E:FF:F8:C3:96:3E:09:2A:86:4C:41:F3:2B:9E:AA:AE:07:0D:<br />                98:A4:EA:D4:5F:5F:E3:CC:DF:42:1F:79:FF:F7:B6:77:DF:09:BF:38:<br />                74:6F:1B:18:D0:48:BF:61:02:DC:25:7A:CE:6D:91:79:06:4B:A2:02:<br />                28:85:A4:D3:7A:21:79:80:31:6C:98:B9:6F:E2:94:BA:CB:AB:A9:03:<br />                6A:A8:17:3F:26:4B:91:42:E0:5C:53:6E:B2:D3:99:63:24:04:FD:32:<br />                3A:FF:2D:48:A5:B5:D4:89:B9:DD:D5:FC:FA:15:5E:1D:35:06:C0:46:<br />                F6:C7:CE:0F:B7:4E:1F:38:F2:5E:A5:46:8E:1C:7C:9C[ </blockquote><br /><br /><br />　もう一つNFS関連で試そうと思って試していなかったこととしてNFSのセッショントランク/マルチパス(pNFSと勘違いしていた)もあったので、どうせならこれも試してみようと思い今回以下のものを試してみました。<br /><br />・IPoIB NFS<br />・IPoIB NFS マルチパス<br />・NFSoRDMAマルチパス<br /><br /><br /><h2>検証環境について</h2><br /><a href=images/s-IMG_20241208_063941.jpg class=lb><img src=images/s-IMG_20241208_063941.jpg width=1000></a><br><br />　今回の検証環境は以下となります<br /><br />NFSサーバ<br /><blockquote>OS周り<br />root@debian:~# uname -a<br />Linux debian 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64 GNU/Linux<br /><br />root@debian:~# lsb_release -a<br />No LSB modules are available.<br />Distributor ID: Debian<br />Description:    Debian GNU/Linux 12 (bookworm)<br />Release:        12<br />Codename:       bookworm<br /><br />ハードウェア周り<br />X11SPW-TF<br />CPU:Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz 1ソケット<br />RAM:DDR4 2400 64GB LRDIMM *4 (256GB)<br />IB HCA;MCX354A-QCBT (QDR Dual port IB HCA@PCIE 3.0 x8) </blockquote><br /><br />PVE01/02<br /><blockquote>OS周り<br />root@pve01:~# uname -a<br />Linux pve01 6.8.12-4-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-4 (2024-11-06T15:04Z) x86_64 GNU/Linux<br /><br />root@pve01:~# pveversion<br />pve-manager/8.3.1/fb48e850ef9dde27 (running kernel: 6.8.12-4-pve)<br /><br />PVE1/2 ハードウェア周り<br />JGINYUE B650I NIGHT DEVIL<br />CPU:16 x AMD Ryzen 7 7700 8-Core Processor (1 Socket)<br />PVE01 RAM:DDR5 4800 16GB*2 (32GB)<br />PVE02 RAM:DDR5 4800 8GB*2 (16GB)<br />IB HCA:MCB194A-FCAT (Connect-IB FDR Dual port HCA@PCIE 3.0x16)</blockquote><br /><br />スイッチ<br /><blockquote>Mellanox SX6036</blockquote><br /><br />　今回はIBの最大性能を見たいため、NFSサーバはtmpfsなどのオンメモリなファイルシステムを使っても余裕のあるマシンということでLRDIMMが使えるマシンにしました。<br />Xeon Gold 6138はシングルスレッドの性能的に若干不安がありますが、RDMAが有効ならCPUの性能がなくても十分な性能を発揮するはずです。<br />HCAについては本来はこちらも MCB194A-FCATを使いたかったのですが、拡張スロットにx16がない(エッジレスx8スロットもない)のとそもそも在庫がないのでCX354Aを使っています。<br /><br />　QDRが40Gbpsの8b/10b税を払うと32Gbpsとなり、2ポート合計の実効が64GbpsなのでPCIE3.0 x8の帯域ぴったりになりますが、オーバーヘッドを考えると若干足りてない気がします。<br />そのため、とりあえず効果があるかを確認するためにシングルポートQDR以上の帯域が出れば良いことにします。<br />ちなみにFDRでリンクしたい場合、ケーブルもFDR対応のものを使わないとQDRになってしまうようです。手持ちのケーブルだと直結してもFDRにはなりませんでした。以前無駄にハマりました。<br /><br /><br />　そこに接続するマシンはシングルスレッドの性能がほしいため、デスクトップ向けのCPUを搭載したマシンを使っています。<br />今回はAliExpressで何故か安く出ていて買ってしまったRyzen 7 7700を搭載したマシンを2台用意しています。<br />マザボも同じくAliで安く出ていた<a href="https://jginyue.com/index/Article/show/cat_id/25/id/132" > JGINYUE B650I NIGHT DEVIL </a>というITXの板を利用しています。2台とも石、板、箱がAE調達というAEビルドマシンです。<br /><br /> 板のメーカーについては全く未知ですが、なにげにあとから9000系の対応BIOSを出しているなど、ある程度やる気はあるようで、今のところ素直に動いています。<br /><br /><h2>前提条件</h2><br />　OSのインストールなどが終わり普通に使える状態で、どこかでOpenSMなどのサブネットマネージャが動いていて、リンクが上がっていることとします<br /><br /><blockquote>root@pve01:~# apt install ibutils<br />root@pve01:~# ibstat<br />CA &#039;mlx5_0&#039;<br />        CA type: MT4113<br />        Number of ports: 2<br />        Firmware version: 10.14.2066<br />        Hardware version: 0<br />        Node GUID: 0x5849560e5cbc0401<br />        System image GUID: 0x5849560e5cbc0401<br />        Port 1:<br />                State: Active<br />                Physical state: LinkUp<br />                Rate: 40<br />                Base lid: 19<br />                LMC: 0<br />                SM lid: 1<br />                Capability mask: 0x26516848<br />                Port GUID: 0x5849560e5cbc0401<br />                Link layer: InfiniBand<br />        Port 2:<br />                State: Active<br />                Physical state: LinkUp<br />                Rate: 40<br />                Base lid: 20<br />                LMC: 0<br />                SM lid: 1<br />                Capability mask: 0x26516848<br />                Port GUID: 0x5849560e5cbc0409<br />                Link layer: InfiniBand </blockquote><br /><br /><h2>NFSサーバの準備</h2><br /><br />　そのままではipoibが使えないので、ib_ipoibモジュールを読み込みibp~というリンクが生えていることを確認します。検証環境のためIP体系が変ですが、通常は192.168.1.0/24、192.168.2.0/24～とかで大丈夫です。<br /><br /><blockquote>#初期状態<br />root@debian:~# ip l<br />1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000<br />    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />2: eno1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000<br />    link/ether ac:1f:6b:bd:03:30 brd ff:ff:ff:ff:ff:ff<br />    altname enp25s0f0<br />3: eno2: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000<br />    link/ether ac:1f:6b:bd:03:31 brd ff:ff:ff:ff:ff:ff<br />    altname enp25s0f1<br /><br />#モジュール読み込み<br />root@debian:~# modprobe ib_ipoib<br /><br />#ipoibインターフェースが生えたか確認<br />root@debian:~# ip l<br />1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000<br />    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />2: eno1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000<br />    link/ether ac:1f:6b:bd:03:30 brd ff:ff:ff:ff:ff:ff<br />    altname enp25s0f0<br />3: eno2: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000<br />    link/ether ac:1f:6b:bd:03:31 brd ff:ff:ff:ff:ff:ff<br />    altname enp25s0f1<br />#ipoibインターフェース<br />4: ibp179s0: &lt;BROADCAST,MULTICAST&gt; mtu 4092 qdisc noop state DOWN mode DEFAULT group default qlen 256<br />    link/infiniband 80:00:02:08:fe:80:00:00:00:00:00:00:e4:1d:2d:03:00:49:2c:61 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff<br />5: ibp179s0d1: &lt;BROADCAST,MULTICAST&gt; mtu 4092 qdisc noop state DOWN mode DEFAULT group default qlen 256<br />    link/infiniband 80:00:02:09:fe:80:00:00:00:00:00:00:e4:1d:2d:03:00:49:2c:62 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff </blockquote><br /><br />　まずNFSサーバ側に生えたIFにIPを割り振ります。例として 10.111.1.200/24と 10.111.2.200/24を割り振ります。<br />IBはVLANなどの概念はないので同一スイッチの同一サブネット上に2つのIP系ができることになります。<br /><br /> 一応、IBにもPartitionというものがあるものの、あくまでマルチパスを貼るための都合上の2つのIP体系なので問題ないです。<br /><br /><blockquote>#雑にインターフェースのIP設定<br />root@debian:~# ip a add dev ibp179s0 10.111.1.200/24<br />root@debian:~# ip a add dev ibp179s0d1 10.111.2.200/24<br />#リンクを有効化<br />root@debian:~# ip l se up ibp179s0<br />root@debian:~# ip l se up ibp179s0d1 </blockquote><br /><br />次にtmpfsでNFSベンチマーク用のオンメモリディレクトリを作成します。今回はRAM領域を240GB作成しています。<br /><br /><blockquote>root@debian:~# mkdir /exports<br />#240GBのRAM領域を作成<br />root@debian:~# mount -t tmpfs -o size=240G tmpfs /exports/<br />#確認<br />root@debian:~# mount|grep exports<br />tmpfs on /exports type tmpfs (rw,relatime,size=251658240k,inode64) </blockquote><br /><br /><h3>RAM上のFIOベンチマーク</h3><br />　NFSでマウントされる前に、まずはサーバ上での上限を確認します。<br /><br /><blockquote>root@debian:~# cd /exports/<br />root@debian:/exports# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  MiB/s): min= 3063, max= 3208, per=100.00%, avg=3187.67, stdev=31.30, samples=19<br />   iops        : min=392128, max=410708, avg=408021.58, stdev=4006.29, samples=19<br /><br /><br />root@debian:/exports# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=18787, max=22317, per=100.00%, avg=22060.57, stdev=119.99, samples=152<br />   iops        : min=2404778, max=2856698, avg=2823753.89, stdev=15358.64, samples=152<br /><br /><br />root@debian:/exports# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  MiB/s): min= 1726, max= 3838, per=100.00%, avg=2622.56, stdev=1016.40, samples=19<br />   iops        : min=221000, max=491292, avg=335687.05, stdev=130099.60, samples=19<br /><br /><br />root@debian:/exports# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=11517, max=16850, per=100.00%, avg=14898.87, stdev=168.53, samples=152<br />   iops        : min=1474194, max=2156870, avg=1907055.58, stdev=21572.48, samples=152</blockquote><br /><br />　RAM上ではO_DIRECTがないので(当然)direct=1を外していますが、Q1T1だとRandRead408K IOPS、RandWrite335K IOPSで、Q8T8だとRandRead2.8M IOPS、RandWrite1.9M IOPSでした。<br /><br /><br /><h3>exportsの設定</h3><br />　作成した/exportをNFSの領域に設定します。検証なので*で雑に設定しています。マルチパスを使いたいのでNFS4のオプションである fsid=0にて、/exportsの下をNFSクライアントから見た/(ルートディレクトリ)とします。その下にNFSクライアントからみた/nfs1となるnfs1ディレクトリを作成します。<br />[追記]<br />べつにfsid0を指定する必要はありませんでした。fsid0を省略した場合、nfs v4でもマウントポイントはサーバーの実ディレクトリと同じ/exports/nfs1になります。<br /><br /><br /><blockquote>root@debian:~# echo &#039;/exports *(fsid=0,rw,insecure,no_root_squash,no_subtree_check)&#039; &gt;&gt; /etc/exports<br />root@debian:~# mkdir /exports/nfs1<br />root@debian:~# exportfs -avr<br />exporting *:/exports</blockquote><br /><br /><br /><h2>PVE側のNFSの設定</h2><br />　ipoibを読み込ませる以外は普通と同じです。ipoibを読み込ませるとNICがリンク一覧に出てくるので、そこからIPを設定します。<br />ターミナルからipコマンドから同じように設定することもできますが、ipコマンドの設定だとWebUIから設定を変更したタイミングで揮発するのでWebUIを正としたほうが無難です。<br />再起動時にipoibを読み込ませたい場合は/etc/modulesに追記しておきます<br /><br /><blockquote>root@pve01:~# modprobe ib_ipoib<br />root@pve01:~# echo ib_ipoib&gt;&gt;/etc/modules</blockquote><br /><br />　IFが生えたらIPとサブネットだけ設定します。<br /><br /><a href=images/ss2024-12-07-073226.png class=lb><img src=images/ss2024-12-07-073226.png ></a><br><br /><br /><br />　その後、NFSの設定をします。ただのNFSであればvers=3でよいですが、このあとマルチパスを使いたいので4.2を指定します。<br />PVE特有の話ではなくLinuxでの話になりますが、fsid=0を指定するとNFS3と4でルートディレクトリの始まりが変わるので注意が必要です。<br />(ちなみに上記設定でv3を使う場合は/export/nfs1になります。nfsサーバ側でfsid0を省略した場合はNFS3と同じ/exports/nfs1です。)<br /><br /><a href=images/ss2024-12-07-075120.png class=lb><img src=images/ss2024-12-07-075120.png ></a><br><br /><br /><br /><h2>IPoIB上のNFSのベンチマーク</h2><br />　VMを経由せず、まずはマウントしたクライアントから直接fioを実行して性能を確認します<br /><br /><blockquote># read<br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  KiB/s): min=69104, max=89968, per=100.00%, avg=84469.05, stdev=3966.55, samples=19<br />   iops        : min= 8638, max=11246, avg=10558.63, stdev=495.82, samples=19<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  KiB/s): min=135712, max=190992, per=100.00%, avg=165444.00, stdev=1502.60, samples=160<br />   iops        : min=16964, max=23874, avg=20680.50, stdev=187.83, samples=160<br /><br /><br />root@pve01:/mnt/pve/rdma#  fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randread --bs=1M --size=1G --numjobs=8 --group_reporting<br />   bw (  KiB/s): min=305152, max=432128, per=100.00%, avg=371507.20, stdev=3970.09, samples=160<br />   iops        : min=  298, max=  422, avg=362.80, stdev= 3.88, samples=160<br /><br />#write<br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  KiB/s): min=   16, max=1170816, per=100.00%, avg=559240.53, stdev=486898.18, samples=15<br />   iops        : min=    2, max=146352, avg=69905.07, stdev=60862.27, samples=15<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=   82, max=13513, per=95.40%, avg=3327.49, stdev=630.16, samples=155<br />   iops        : min=10592, max=1729712, avg=425919.08, stdev=80659.95, samples=155<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randwrite --bs=1M --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=  316, max=16376, per=95.07%, avg=3116.83, stdev=768.83, samples=156<br />   iops        : min=  316, max=16376, avg=3116.83, stdev=768.83, samples=156 </blockquote><br /><br />　表にまとめると以下です。<br /><br /><table border=1>
    <tr>
        <td></td>
        <td>IOPS avg</td>
        <td>BW avg (MiByte/s)</td>
        <td>BW avg in Gbps</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ1T1 8k</td>
        <td>10558</td>
        <td>80.5</td>
        <td>0.675283105</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ8T8 8k</td>
        <td>20680</td>
        <td>161.5</td>
        <td>1.354760515</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ8T8 1M</td>
        <td>362</td>
        <td>354.3</td>
        <td>2.972084523</td>
    </tr>
    <tr>
        <td>　</td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ1T1 8k</td>
        <td>69905</td>
        <td>546.1</td>
        <td>4.581019921</td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ8T8 8k</td>
        <td>425919</td>
        <td>3327.4</td>
        <td>27.91226091</td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ8T8 1M</td>
        <td>3116</td>
        <td>3116.8</td>
        <td>26.14561965</td>
    </tr>
</table><br /><br /><br />　Readに対してWriteおかしくない?????????と思いましたが、何回試してもこの数字でした。atopの通信帯域を見ていましたが、こちらはなぜか16Gbps以上カウントされませんでした。<br />async writeみたいな動きをしていますが、それならreadももっと上がってもいいような気がします。thinking_faceみたいになりながら色々見ましたが何もわかりません…IPoIB特有の動きでしょうか…。まじで情報がないです…<br /><br /><h2>マルチパスを試す</h2><br />　NFSのマルチパスについて探し方が悪いのかLinuxでの情報がほんとに見つかりませんでしたが、動きを見ているとmax_connectを指定したあと違うIPの同じExportsを違うディレクトリにマウントすると有効化されるようでした。<br /><a href="https://thinksystem.lenovofiles.com/storage/help/index.jsp?topic=%2Fontap_nfs-trunking%2Fclient-mount-task.html&amp;cp=1_14_3_5_3_1_3" >https://thinksystem.lenovofiles.com/storage/help/index.jsp?topic=%2Fontap_nfs-trunking%2Fclient-mount-task.html&amp;cp=1_14_3_5_3_1_3</a><br /><br />　NFSサーバ側で/export/nfs1と/export/nfs2を作り、PVEからマウントします。先程と同様/exportにfsid0が指定されているのでPVEの設定に落とすと以下になります。<br />ストレージの設定をWebUIから変えてもoptions以下の内容は変更されないので、contentをISOやContainerなどに変更しても都度optionsの書き直しは不要でした。<br /><br /><blockquote>nfs: rdma<br />        export /nfs1<br />        path /mnt/pve/rdma<br />        server 10.111.1.200<br />        content images<br />        options vers=4.2,max_connect=2<br />        prune-backups keep-all=1<br /><br />nfs: rdma2<br />        export /nfs1<br />        path /mnt/pve/rdma2<br />        server 10.111.2.200<br />        content images<br />        options vers=4.2,max_connect=2<br />        prune-backups keep-all=1 </blockquote><br /><br />その後、データストアを無効化し、アンマウントしたあとに再度有効化すると新しい設定が入るようでした。すぐに入らないので少し待つ必要がありました<br /><br /><blockquote>#まずはストレージの無効化<br />root@pve01:~# pvesm set rdma2 --disable 1<br />root@pve01:~# pvesm set rdma --disable 1<br />#無効化だけだとアンマウントされないので手動アンマウント<br />root@pve01:~# umount /mnt/pve/rdma<br />root@pve01:~# umount /mnt/pve/rdma2<br />#ストレージを有効化して暫く待つと、いつの間にかマウントされているので手動のマウントは不要<br />root@pve01:~# pvesm set rdma2 --disable 0<br />root@pve01:~# pvesm set rdma --disable 0 <br />#しばらくまつ</blockquote><br /><br /><br />　成功すると違うマウントを指定したはずなのに同じIPでマウントされます。この状態が本当にあっているのかわかりませんが、<br />少なくともatopなどでNICの利用状況を見ていると一つのディレクトリに対する操作を行ったときにそれぞれのNICで通信が発生していました。なんか…違う気がする…<br /><br /><br /><blockquote> root@pve01:~# mount|grep nfs<br />10.111.2.200:/nfs1 on /mnt/pve/rdma2 type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,max_connect=2,timeo=600,retrans=2,sec=sys,clientaddr=10.111.2.201,local_lock=none,addr=10.111.2.200)<br />10.111.2.200:/nfs1 on /mnt/pve/rdma type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,max_connect=2,timeo=600,retrans=2,sec=sys,clientaddr=10.111.2.201,local_lock=none,addr=10.111.2.200</blockquote><br /><br />　とりあえずベンチを回して差が出たか確認します。<br /><br /><blockquote> ### nfs multipath<br /># read<br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  KiB/s): min=70656, max=86496, per=100.00%, avg=82204.63, stdev=3661.31, samples=19<br />   iops        : min= 8832, max=10812, avg=10275.58, stdev=457.66, samples=19<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  KiB/s): min=249520, max=474544, per=99.54%, avg=393720.42, stdev=5737.21, samples=152<br />   iops        : min=31190, max=59318, avg=49215.05, stdev=717.15, samples=152<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randread --bs=1M --size=1G --numjobs=8 --group_reporting<br />   bw (  KiB/s): min=550912, max=1323008, per=100.00%, avg=808895.33, stdev=20944.35, samples=158<br />   iops        : min=  538, max= 1292, avg=789.94, stdev=20.45, samples=158<br /><br />#write<br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  KiB/s): min=   32, max=1161296, per=100.00%, avg=616809.41, stdev=469939.92, samples=17<br />   iops        : min=    4, max=145162, avg=77101.18, stdev=58742.49, samples=17<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=  256, max=12827, per=100.00%, avg=4207.57, stdev=578.61, samples=149<br />   iops        : min=32824, max=1641910, avg=538569.22, stdev=74061.61, samples=149<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randwrite --bs=1M --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=  484, max=19754, per=98.44%, avg=4232.42, stdev=820.85, samples=156<br />   iops        : min=  484, max=19754, avg=4232.42, stdev=820.85, samples=156</blockquote><br /><br />　シングルとの差分を表にまとめるとこうなります<br /><br />
<table border=1>
    <tr>
        <td></td>
        <td>IOPS avg</td>
        <td>BW avg (MiByte/s)</td>
        <td>BW avg in Gbps</td>
        <td>Multipath_efficiency (%)</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ1T1 8k</td>
        <td>10558</td>
        <td>80.5</td>
        <td>0.675283105</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randreadQ1T1 8k</td>
        <td>10275</td>
        <td>80.3</td>
        <td>0.673605383</td>
        <td>99.7515528</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ8T8 8k</td>
        <td>20680</td>
        <td>161.5</td>
        <td>1.354760515</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randreadQ8T8 8k</td>
        <td>49215</td>
        <td>384.5</td>
        <td>3.225420545</td>
        <td>238.0804954</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ8T8 1M</td>
        <td>362</td>
        <td>354.3</td>
        <td>2.972084523</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB  con=2 randreadQ8T8 1M</td>
        <td>789</td>
        <td>789.9</td>
        <td>6.626163039</td>
        <td>222.9466554</td>
    </tr>
    <tr>
        <td>　</td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ1T1 8k</td>
        <td>69905</td>
        <td>546.1</td>
        <td>4.581019921</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randwriteQ1T1 8k</td>
        <td>77101</td>
        <td>602.3</td>
        <td>5.052459803</td>
        <td>110.2911555</td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ8T8 8k</td>
        <td>425919</td>
        <td>3327.4</td>
        <td>27.91226091</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randwriteQ8T8 8k</td>
        <td>538569</td>
        <td>4207.6</td>
        <td>35.29591544</td>
        <td>126.4530865</td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ8T8 1M</td>
        <td>3116</td>
        <td>3116.8</td>
        <td>26.14561965</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randwriteQ8T8 1M</td>
        <td>4232</td>
        <td>4232.4</td>
        <td>35.50395296</td>
        <td>135.7931211</td>
    </tr>
</table>
<br /><br />　相変わらず書き込みの速度だけはぶっ壊れていますが、パスが増えたことによって複数スレッドでの読み込みの速度の増加が確認できたので、マルチパスの効果はあるようです。<br />しかしそれ以上にやはりIPoIBはなにかある気がします。もともと大して期待はしていませんでしたが、それにしても読み込みがポート理論合計が80Gbpsに対して実測6Gbpsというのは悲しいです。<br />ただ、効果があるのは確かなので、イーサネットの場合には意味があると思います。<br /><br /><h2>NFSoRDMAを検証する</h2><br />　IPoIBの挙動が謎すぎて時間を取られてしまいましたがようやくメインディッシュです。サーバ側に svcrdmaを、クライアント側に xprtrdmaを読み込ませ、RDMAを有効化していきます。<br /><br /><blockquote> root@debian:~# modprobe svcrdma<br />root@debian:~# systemctl restart nfs-kernel-server </blockquote><br /><br /><br />　このままだとproto=rdmaを指定してRDMAで接続をしようとしたときに接続拒否されるので、portlistにrdmaの標準ポートである20049を追加します。<br /><br /><blockquote> root@debian:~# cat /proc/fs/nfsd/portlist<br />tcp 2049<br />tcp 2049<br />root@debian:~# echo rdma 20049 &gt; /proc/fs/nfsd/portlist<br />root@debian:~# cat /proc/fs/nfsd/portlist<br />rdma 20049<br />rdma 20049<br />tcp 2049<br />tcp 2049 </blockquote><br /><br />　オンザフライでの変更ではなく、設定ファイルで変更する場合は/etc/nfs.confにてrdma=yを有効にしたあとにサービスの再起動が必要になります。<br /><br /><blockquote># /etc/nfs.conf<br />[nfsd]<br /># debug=0<br /># threads=8<br /># host=<br /># port=0<br /># grace-time=90<br /># lease-time=90<br /># udp=n<br /># tcp=y<br /># vers3=y<br /># vers4=y<br /># vers4.0=y<br /># vers4.1=y<br /># vers4.2=y<br />rdma=y<br />rdma-port=20049<br /><br />root@debian:~# systemctl restart nfs-kernel-server<br />root@debian:~# cat /proc/fs/nfsd/portlist<br />rdma 20049<br />rdma 20049<br />tcp 2049<br />tcp 2049 </blockquote><br /><br /><br />　次に、PVE側の設定を行います。事前にコマンドラインからmountコマンドでproto=rdmaで接続できることは確認したので、sotrage.confに合う設定を入れます。<br />今回はRDMAの最大速度を見たいのでいきなりマルチパスで行います<br /><br /><br /><blockquote>#/etc/pve/storage.cfg <br />nfs: rdma<br />        export /nfs1<br />        path /mnt/pve/rdma<br />        server 10.111.1.200<br />        content images<br />        options vers=4.2,max_connect=2,proto=rdma<br />        prune-backups keep-all=1<br /><br />nfs: rdma2<br />        export /nfs1<br />        path /mnt/pve/rdma2<br />        server 10.111.2.200<br />        content images<br />        options vers=4.2,max_connect=2,proto=rdma<br />        prune-backups keep-all=1<br />#[追記]<br />#proto=rdmaを指定した場合、モジュールは読み込まれるので以下は不要でした<br />root@pve01:~# modprobe xprtrdma<br />root@pve01:~# echo &quot;xprtrdma&quot; &gt;&gt; /etc/modules<br />#↑いらなかった<br /><br />root@pve01:~# pvesm set rdma2 --disable 1<br />root@pve01:~# pvesm set rdma --disable 1<br /><br />root@pve01:~# umount /mnt/pve/rdma<br />root@pve01:~# umount /mnt/pve/rdma2<br /><br />root@pve01:~# pvesm set rdma2 --disable 0<br />root@pve01:~# pvesm set rdma --disable 0 </blockquote><br /><br />　しばらく待ち、NFSのマウントオプションにproto=rdmaがある状態でNFSがマウントされたかを確認します。<br /><br /><blockquote>root@pve01:~# mount|grep &quot;proto=rdma&quot;<br />10.111.1.200:/nfs1 on /mnt/pve/rdma type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=rdma,max_connect=2,port=20049,timeo=600,retrans=2,sec=sys,clientaddr=10.111.1.201,local_lock=none,addr=10.111.1.200)<br />10.111.1.200:/nfs1 on /mnt/pve/rdma2 type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=rdma,max_connect=2,port=20049,timeo=600,retrans=2,sec=sys,clientaddr=10.111.1.201,local_lock=none,addr=10.111.1.200) </blockquote><br /><br /><br />　まずはPVE01で直接IOを発行してベンチマークをかけます<br /><br /><blockquote>### nfs over RDMA<br />#read<br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  KiB/s): min=106624, max=131440, per=99.95%, avg=128103.58, stdev=5284.67, samples=19<br />   iops        : min=13328, max=16430, avg=16012.95, stdev=660.58, samples=19<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randread --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min= 1092, max= 1991, per=99.85%, avg=1828.98, stdev=30.13, samples=152<br />   iops        : min=139790, max=254956, avg=234109.58, stdev=3856.49, samples=152<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randread --bs=1M --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min= 2964, max= 3824, per=99.77%, avg=3633.37, stdev=33.98, samples=152<br />   iops        : min= 2964, max= 3824, avg=3633.37, stdev=33.98, samples=152<br /><br /><br /><br />#write<br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=1 --group_reporting<br />   bw (  KiB/s): min=245120, max=1139216, per=98.00%, avg=782675.37, stdev=331891.63, samples=19<br />   iops        : min=30640, max=142402, avg=97834.42, stdev=41486.45, samples=19<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=8 --time_based --runtime=10 --rw=randwrite --bs=8k --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min=  903, max=13740, per=100.00%, avg=5349.23, stdev=563.43, samples=158<br />   iops        : min=115650, max=1758800, avg=684700.85, stdev=72119.49, samples=158<br /><br /><br />root@pve01:/mnt/pve/rdma# fio --name=fiotest --ioengine=io_uring --iodepth=1 --time_based --runtime=10 --rw=randwrite --bs=1M --size=1G --numjobs=8 --group_reporting<br />   bw (  MiB/s): min= 2088, max=16382, per=100.00%, avg=6476.16, stdev=562.35, samples=158<br />   iops        : min= 2088, max=16382, avg=6476.16, stdev=562.35, samples=158</blockquote><br /><br /><br />　IPoIBマルチパスとの比較を表にまとめます<br /> <table border=1>
    <tr>
        <td></td>
        <td>IOPS avg</td>
        <td>BW avg (MiByte/s)</td>
        <td>BW avg in Gbps</td>
        <td>RDMA_efficiency (%)</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ1T1 8k</td>
        <td>10558</td>
        <td>80.5</td>
        <td>0.675283105</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randreadQ1T1 8k</td>
        <td>10275</td>
        <td>80.3</td>
        <td>0.673605383</td>
        <td></td>
    </tr>
    <tr>
        <td>RDMA con=2 randwriteQ1T1 8k</td>
        <td>16012</td>
        <td>128.103</td>
        <td>1.074606107</td>
        <td>159.5305106</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ8T8 8k</td>
        <td>20680</td>
        <td>161.5</td>
        <td>1.354760515</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randreadQ8T8 8k</td>
        <td>49215</td>
        <td>384.5</td>
        <td>3.225420545</td>
        <td></td>
    </tr>
    <tr>
        <td>RDMA con=2 randwriteQ8T8 8k</td>
        <td>234109</td>
        <td>1828.98</td>
        <td>15.34259992</td>
        <td>475.6775033</td>
    </tr>
    <tr>
        <td>IPoIB single randreadQ8T8 1M</td>
        <td>362</td>
        <td>354.3</td>
        <td>2.972084523</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB  con=2 randreadQ8T8 1M</td>
        <td>789</td>
        <td>789.9</td>
        <td>6.626163039</td>
        <td></td>
    </tr>
    <tr>
        <td>RDMA con=2 randwriteQ8T8 1M</td>
        <td>3633</td>
        <td>3633.3</td>
        <td>30.47833671</td>
        <td>459.9696164</td>
    </tr>
    <tr>
        <td>　</td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ1T1 8k</td>
        <td>69905</td>
        <td>546.1</td>
        <td>4.581019921</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randwriteQ1T1 8k</td>
        <td>77101</td>
        <td>602.3</td>
        <td>5.052459803</td>
        <td></td>
    </tr>
    <tr>
        <td>RDMA con=2  randreadQ1T1 8k</td>
        <td>97834</td>
        <td>782.675</td>
        <td>6.565555332</td>
        <td>129.9477005</td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ8T8 8k</td>
        <td>425919</td>
        <td>3327.4</td>
        <td>27.91226091</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randwriteQ8T8 8k</td>
        <td>538569</td>
        <td>4207.6</td>
        <td>35.29591544</td>
        <td></td>
    </tr>
    <tr>
        <td>RDMA con=2  randreadQ8T8 8k</td>
        <td>684700</td>
        <td>5349.23</td>
        <td>44.87260427</td>
        <td>127.1325696</td>
    </tr>
    <tr>
        <td>IPoIB single randwriteQ8T8 1M</td>
        <td>3116</td>
        <td>3116.8</td>
        <td>26.14561965</td>
        <td></td>
    </tr>
    <tr>
        <td>IPoIB con=2 randwriteQ8T8 1M</td>
        <td>4232</td>
        <td>4232.4</td>
        <td>35.50395296</td>
        <td></td>
    </tr>
    <tr>
        <td>RDMA con=2  randreadQ8T8 1M</td>
        <td>6476</td>
        <td>6476</td>
        <td>54.32463836</td>
        <td>153.0101125</td>
    </tr>
</table><br /><br />　ReadQ1T1がもう一声欲しいですが、サーバ側のatopを見ていると1コアのCPU使用率が張り付くことがあり、1セッションのIOはシングルスレッドの性能に依存するようでした。<br />そのため、サーバ側のXeonSP 6138の限界かもしれません。それ以外は圧倒的に速いです。<br />特に弱かったReadが増強され、Q8T8においては200k IOPSを達成できました。Writeの速度に関しては54Gbpsを記録しました。NFSでこれだけの性能が出たら十分すぎます。<br /><br /><h2>VMを立てて検証してみる</h2><br />　RDMAなストレージが十分に速いことが確認できたら、その上でWindowsVMを立てて実際に速いのか試してみます。<br />Windowsのセットアップの注意点としては、VirtIOを使わないと性能が出ないためSCSIコントローラにVirtIO SCSI Singleを選択する必要があります。<br />また、それに伴いOSインストール時にドライバの読み込みが必要になるので、virtio-driverの入ったISOをマウントするために2つ目のCDROMが必要になります。<br />SATAでセットアップしてから後でVirtIOに変更することもできますが、トラブルを防ぐため正攻法でセットアップしました。<br /><br />　上記の設定をしてインストールを進めていく中で、まず速度の差を実感しました。<br />Win11のセットアップは時間がかかりますが、明らかに速いです。<br />もっとも、これはRyzen 7 7700が速いという気もしますが、IOがネックになっていないというのも大きいと思います。<br /><br />　なんやかんやしてWindowsのセットアップが終わったら、いつものCDMをまわします。以下がその結果で、それぞれMiB/sとIOPSです。<br /><br /><a href=images/ss2024-12-08-41002.png class=lb><img src=images/ss2024-12-08-41002.png ></a> <a href=images/ss2024-12-08-040952.png class=lb><img src=images/ss2024-12-08-040952.png ></a> <br><br /><br /><br />　Q1T1については4kで12k IOPSが出ているのでfioのテスト結果と一致しますが、<br />fioで8Q8Tを実行したときには234k IOPSが出ているのに対してVM上では174k IOPSと、十分ではあるもののもう少し出てもいいかと思いました。<br /><br />　帯域についてはQDRの理論上限値32Gbpsで、MB/sに直すと4000MB/sとなり、マルチパスがうまく使えてない気もします。<br />ただ、perfqueryやatopのIBリンクの情報を見ていると、両ポートでパケットの送受信は行われているようです。<br />複数ディスクでのIOが発生したらまた違うのかもしれません。<br /><br />　Writeについては値がぶっ壊れることもなかったので、fioのテスト方法が正しくなかったか、上記のマルチパスがうまく使えていないという問題がある気がします。<br />[追記]<br />複数のディスクでストライプしても帯域は変わりませんでした。マルチパスが効いているのかいないのか…。<br /><br />　virtioの上限についてはPVEホストにtmpfsを作成してVMからRAM上に作成したドライブにベンチマークをした限りはもっと高い値が出たので、仮想化とvirtioがボトルネックになっているわけではなさそうです。<br />何かしらチューニングがあるのかもしれないですが、ぱっと検証した限りはUnsafe WBを使う以外の方法ではこれが限界でした。<br /><br />　ちなみに今回初めてRyzen 7 7700をVMホストとして使いましたが、やっぱりレスポンスがいいので<a href="https://www.passmark.com/products/performancetest/index.php" > PassMark PerformanceTest </a>をまわしてシングルスレッドの性能を見てみました。<br />その結果、VMでもシングルスレッド4k超えとかなり調子が良いことがわかりました。<br /><br /><a href=images/ss2024-12-08-070111.png class=lb><img src=images/ss2024-12-08-070111.png ></a><br><br /><br /><br />　ちなみにPassmarkのシングルスレッドの数値と個人的なWindowsを使う感覚としては<br />　～700　なにするのもつらい<br />　1000～1500　もたつくがIOが十分に速ければコア数によってはなんとか使える<br />　1500～2400　IOが速ければそれなりに使える<br />　2400～3000　はやい<br />　3000～4000　目に見えて速い<br />　4000～　　　　新世界<br />　という感じです。　<br /><br />　AMDのCPUの場合、95度に張り付くまでクロックと電圧を上げてカツカツを攻めるという動きをするので、使用しているCPUクーラーと外気温によって大きくスコアが変わります。<br />ハードウェアを変えず外気温がだいたい同じ状態でWindowsをベアインストールして試していたときは、シングルスレッドはだいたい4100-4200くらいだったと思います。<br /><br />　なので、多少の仮想化税はありますが、それでも十分速いと思います。<br />ちなみにこのITXの筐体には<a href="https://www.thermalright.com/product/axp90-x47-full/" >AXP90-X47 FULL</a>というFull copperなクーラーを使っています。<br />#もともと先に組んだPVE02の筐体に組み込もうとしたのですがクーラーの高さが僅かに高く、箱に入り切らずSHURIKEN 3を買うことに…。<br /><br /><h2>マイグレーションを試してみる</h2><br />　もう一つ気になることとして、PVEでライブマイグレーションをするために正しく共有ストレージとして認識されているか、RAM転送でIBを使うように設定してうまくいくのか、というのがあったので試してみました。ようやくPVE02の出番です。<br /><br />　基本的には01と同じ設定を行い、01側でクラスターを作成して02を参加させました。クラスターを作成するときに、裏LANがあるとそれを追加できるので、IPoIBのインターフェースも追加します。<br />画像では0,1がIBで2がEtherですが、これは数値が高いほうが優先されるという動きになるので、これで作ったあとに間違いに気が付き10.111.1.201を20、10.111.2.201を10、172.20.1.51を1に変えました。<br /><br /><a href=images/ss2024-12-08-033600.png class=lb><img src=images/ss2024-12-08-033600.png ></a><br><br /><br /><br />　参加した段階でproto=rdmaが書かれたstorage.cfgが02側にも配布されるので、クラスタに参加した時点でNFSのRDMAマウントができていました。<br /><br />　ここでハマったのが何故かライブマイグレーションの通信に1G Etherを使われてしまうということでした。<br />RAM転送により広帯域なIBが使われず困ったのですが、Datacenter→OptionsにMigration settingsという項目があり、どのIPを使うか指定する必要がありました。<br />これをIBの裏LANアドレスを指定することにより、IPoIBですがIBが使われるようになりました。<br /><br /><a href=images/ss2024-12-08-043522.png class=lb><img src=images/ss2024-12-08-043522.png ></a><br><br /><br /><blockquote>2024-12-08 04:38:18 use dedicated network address for sending migration traffic (10.111.1.202)<br />2024-12-08 04:38:18 starting migration of VM 101 to node &#039;pve02&#039; (10.111.1.202)<br />2024-12-08 04:38:18 starting VM 101 on remote node &#039;pve02&#039;<br />2024-12-08 04:38:19 start remote tunnel<br />2024-12-08 04:38:20 ssh tunnel ver 1<br />2024-12-08 04:38:20 starting online/live migration on unix:/run/qemu-server/101.migrate<br />2024-12-08 04:38:20 set migration capabilities<br />2024-12-08 04:38:20 migration downtime limit: 100 ms<br />2024-12-08 04:38:20 migration cachesize: 1.0 GiB<br />2024-12-08 04:38:20 set migration parameters<br />2024-12-08 04:38:20 start migrate command to unix:/run/qemu-server/101.migrate<br />2024-12-08 04:38:21 migration active, transferred 656.7 MiB of 8.0 GiB VM-state, 813.8 MiB/s<br />2024-12-08 04:38:22 migration active, transferred 1.4 GiB of 8.0 GiB VM-state, 801.0 MiB/s<br />2024-12-08 04:38:23 migration active, transferred 2.1 GiB of 8.0 GiB VM-state, 803.5 MiB/s<br />2024-12-08 04:38:24 migration active, transferred 2.9 GiB of 8.0 GiB VM-state, 778.9 MiB/s<br />2024-12-08 04:38:25 migration active, transferred 3.6 GiB of 8.0 GiB VM-state, 1.0 GiB/s<br />2024-12-08 04:38:26 migration active, transferred 4.3 GiB of 8.0 GiB VM-state, 783.7 MiB/s<br />2024-12-08 04:38:27 migration active, transferred 5.2 GiB of 8.0 GiB VM-state, 856.8 MiB/s<br />2024-12-08 04:38:27 xbzrle: send updates to 36484 pages in 27.2 MiB encoded memory, overflow 2013<br />2024-12-08 04:38:27 average migration speed: 1.1 GiB/s - downtime 86 ms<br />2024-12-08 04:38:27 migration status: completed<br />2024-12-08 04:38:30 migration finished successfully (duration 00:00:12)<br />TASK OK</blockquote><br /><br /><br />　ストレージは正しく共有と認識されたので、RAMだけの転送となりました。<br />8GBのRAMを割り当てたWindowsをマイグレしたところ大体10GbpsくらいでRAMの転送がされ、12秒で終わりました。<br />マイグレ中もあえてリモデから色々やっていましたが、一瞬マウスカーソルにラグのようなものが出たと思ったら終わっていました。はやい。<br /><br /><br /><br /><h2>検証した感想</h2><br />　NFSのMPIOやRDMAなどを初めて設定しましたが、かなり良い結果がでたとおもいます。<br />PVE自体は触り始めて1ヶ月経っていないのでお作法的な部分がまだよくわかっていないですが、<br />中身がDebianという15年の付き合いのあるOSなので個人的には非常に取り掛かりやすいです。<br /><br />　PVEはVMwareとは違ってハードウェアの対応の広さや、困ってもLinux的に色々とどうにかできるのが良いと思いました。<br />周辺環境としてもHAレプリケーションやVMwareでいうVDPがより使いやすいPBSとして提供されているなど、非常によくできていると感じました。<br /><br />　そのなかでPVE自体にvSAN的なCephもあり、「今更ストレージとコンピュートノードを分けるなや!!時代はHCIやで!!!」　という思想も感じます。<br />ただ、個人環境だとマシン側のPCIE物理スロットやPCIEレーン数の都合、搭載するCPUやメモリ量によってはOSD自体のIOコンピュートコストが馬鹿にできないこともあり、<br />できればIOはストレージマシンに専業させ、PVEホストにはVM/Containerの処理に専念してもらいたい、ということもあります。<br /><br />　商用環境などで合計100コア以上のXeonSP/EPYCと数TBのRAMと、有り余るSSDと100GbEを搭載したマシンが10台以上ある、というような構成ならともかく、<br />家で使うとなるとそこまでの環境を用意して常時動かすというのはなかなか厳しいものがあります。cephを使おうとするとホスト間のストレージの構成などもなるべく対称にしなければならないというのも厳しいです。<br /><br />　なので、家で使う分にはSPoFができることを承知でストレージはストレージマシンにまとめ、ホスト側はIBと10Gと起動用SATA DOMに相当するものを積んでおけばとりあえず快適に使える、というのは便利です。<br />特にIOを良くしようとするとノードごとにそれなりに高性能なm.2やU.2のNVMEストレージを揃えなければいけない、U.2については熱の考慮をしなければならない、ホスト追加削除するたびにそのへんを揃え直さなければならない…というのをやりたくありませんでした。<br /><br />　今回の検証で、この辺を省いてほぼディスクレスでもIBさえ繋いでおけばSATA SSDより速い大容量な集約ストレージが使える事がわかったというのはかなり嬉しいです。<br /><br />　また、特にWindowsなどの検証をするとIOの速さが利用度の快適さに直結するので、IOの速さというのは譲れない要件でもあります。<br />ストレージマシンが死ぬと地獄を見るというのは回避できませんが、クラスター型ストレージが死なないかと言われるとまたそれも微妙なところで、メタデータに問題が起きるとこれも地獄になります。<br />そういった面で問題が起きたときにシンプルさが強さになることもあります。<br /><br />　更に、共有ブロックストレージ+クラスター型ファイルシステムではなく、NFSというファイルベースストレージなのもシンプルでよいです。色々トラブルを踏むとシンプルさに帰結する気がします。<br />VMFSなどでフォーマットされたディスクではなくファイルベースであるということはNFSホストからでもアクセスできるので、万が一のときにはNFSサーバ自体や他のLinuxマシンでもローカルマウントしてアレコレできる、ということになります。<br /><br />　代償としてNFSは細かいIOが苦手、というのがありますが、今回のRDMAの結果からすると十分実用域だと思います。<br /><br /><br />　ただ、散々IBについて話してきましたが、今からお家でInfinibandをおすすめできるか、というと、微妙…むしろやめといたほうが無難、と言わざるを得ないです。<br />以前も書いたように、IB自体はL2で使う限りはスイッチやHCA含め、帯域に対しての消費電力がかなり低いのでいい面があるのですが、<br />IBはIBでありイーサネットではないので、利用できる用途がかなり限られます。自分もほぼストレージ用インターフェースとしてしか使っていません。<br /><br />　やはり用途が限られるのとIB特有の必要な知識があまり表面に出てこないので、何かコアなことを調べるとなかなか情報がありません。<br />一般的な使いにくさから、IBまわりは本当に需要がなく、国内外で捨て値で売られています。今回検証に使ったスイッチのSX6036なんて3000円で買っています。<br />元が底値なので、仮にこれから一から揃えるとしても、手放すときには再販価値はない、という前提になります。<br /><br />　まあ共有ストレージとして16/32Gb FC-SANを始めたいと思うのであればそれよりも安価ですが、FC-SANはドライバさえあれば確実にブロックデバイスとして認識できるというメリットもあります。<br />あまりにもコアなメリットですが、特定のときに刺さります。<br /><br />　しかし、IB自体に一般的に価値がないということは、鍛えられたオタクからすると二束三文で高速IOを手に入れられるというメリットでもあります。<br />「もうIBやめたい」と思いながらも「使えれば」超高速なことと、物が安いので抜け出せず、なんだかんだ物が増えてしまいました。<br /><br />　その中で「一部のSASケーブルはIBのQSFPケーブルとしても使える(※ただしQDRのみ)」というしょうもない知識を手に入れたので、<br />ケーブルなどもかなり安く手に入れられるようになりました。一度嵌ると抜け出せない沼です。<br /><br /><br /><br />　総評としては、<br />「確かにIBとRDMAはかなり高速でこれに依存すればノードの構成が楽になるものの、これを目当てに新規でIB一式を揃えようとするのは覚悟が必要になるので手放しでお薦めはできない」<br />でしょうか。<br /><br />　もう少し使ってみたうえで問題が起きたらまた記事にしようと思います。<br /><br />以上!<br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry240328-001302">
		<title>【その他】リモートデスクトップでrdpファイルにselectedmonitorsの記述をしてもうまく動かないときの確認点</title>
		<link>http://xmms.jp/blog/index.php?entry=entry240328-001302</link>
		<description><![CDATA[<a href=images/IMG_20240327_235901_R.jpg class=lb><img src=images/IMG_20240327_235901_R.jpg width=500px></a><br> <br /><br />  Windowsのリモートデスクトップですが、実はマルチモニター環境で特定の画面だけにまたがって全画面表示する、という機能があります。この機能を使ってとあるVMで作業するときに「1枚の全画面だと微妙に使いにくいけどマルチモニタすべての画面をリモデに使いたくない」という要件を満たすべく2枚の画面だけを使うようにしていました。<br /><br /><a href="https://www.hanselman.com/blog/how-to-remote-desktop-fullscreen-rdp-with-just-some-of-your-multiple-monitors" >https://www.hanselman.com/blog/how-to-remote-desktop-fullscreen-rdp-with-just-some-of-your-multiple-monitors</a><br /><a href="https://qiita.com/yusuke-sasaki/items/5f70dc266caf13021838" >https://qiita.com/yusuke-sasaki/items/5f70dc266caf13021838</a><br /><br />　先に結論を書くと、 RDPで複数画面が使えない!というときは、使いたいディスプレイ同士が0pxで隣接しているかを確認する必要があります。以下、検証のメモです。<br /><br /><br />　実際のモニターのセットアップはこうなっています。グラボの出力順を考慮していないのでぐちゃぐちゃになっていますが、この中から5,6を使ってRDPを全画面表示する、ということをしていました。<br /><br /><a href=images/multimonitor1.jpg class=lb><img src=images/multimonitor1.jpg width=500px></a><br><br /><br /> 今までこれは動いていたのですが、モニターのつながっているグラボの出力端子を入れ替えたタイミングで画面をまたがっての表示が動かなくなってしまいました。<code> mstsc /l</code>で調べてみると、端子が入れ替わったことによってモニターのIDが変わっていたので、IDを確認してrdpファイルに書かれている順番を入れ替えれば動くだろう、と思いました。しかし、若干の移動はあったもののIDは大きく変わっておらず、何をやってもモニタをまたがって全画面表示ができずプライマリモニタだけ全画面で表示される挙動を示しました。<br /><br />　よくわからないので一度マシンを再起動し、もう一度mstsc /lをすると今度は何故かモニターIDが大きく変わっていた(1,3,10,11,12,13から0,1,2,3,4,5になっていた)のですが、それを直しても動かず、色々検証すると下記設定の赤字0,2の2画面表示と2,4及び5,3の2画面表示は問題なく動き、なぜか2,4,5,や4,5と横一列にしようとしたときに5を含むと動かなくなるということがわかりました。<br /><br /><a href=images/multimonitor2.png class=lb><img src=images/multimonitor2.png width=500px></a><br><br /><br />　検証に使った最低限の要素だけ含めたrdpファイルは以下になります。<br /><br /><blockquote>## NG ##<br />full address:s:VM1<br />use multimon:i:1<br />selectedmonitors:s:4,5<br />dynamic resolution:i:0<br /></blockquote><br /><br /><blockquote>## OK ##<br />full address:s:VM1<br />use multimon:i:1<br />selectedmonitors:s:0,2<br />dynamic resolution:i:0<br /></blockquote><br /><br />　プライマリモニタがRX7900XTXにつながっていることもあり、最初はRadeon仕草かと思いましたが、<code> mstsc /l</code>の値をよく見るとmstsc側ID(画像赤文字)の5の起点座標がおかしい事に気が付きました。この場合、0,0から3839,2159が4の値なので5が3840から始まらないといけないのですが、なぜか3853となっており、赤字4と5の間に13ピクセルの隙間があるいうことがわかりました。<br /><br />　カッコ内部の値はそれぞれプライマリモニタ(この場合は赤字の4)の左上を0,0として右下に向けて座標がプラスになり、プライマリモニタより左にモニタがあればxはマイナスに、プライマリモニタより上にモニタあればyがマイナスになります。<br /><br />　Windowsの仕様として隣り合うモニタ同士はどこかでくっついていないといけないのですが、赤字5は赤字3とくっついているという扱いになり、4と5は13ピクセル離れている、という認識になっているようです。出力端子を入れ替えたのがちょうど赤字の5にあたるものだったのですが、Windowsで画面の位置を移動したときにそれがズレたようです。わかるかそんなモノ…。<br /><br />　離れてるのであればマウスの移動もできないのではと思いましたが、ある程度の加速度があると多少の隙間を乗り越えて隣のモニタに行けるようです。逆に、隙間があるととてもゆっくりマウスを動かしてモニタの境界線をまたごうとするとブロックされます。密着しているとマウスカーソルの加速度が1px/sでも境界をまたげるようです。たまに感じた違和感はこれだったのか…。<br /><br /><a href=images/multimonitor3.png class=lb><img src=images/multimonitor3.png width=500px></a><br><br /><br />　ディスプレイのスナッピングとの格闘の末、最終的に一回り小さい赤字の1以外は0pxで整列できたのですが、どうしても最後の1つが完全密着になりませんでした。1の値は1279,ｰ1440,3840,ｰ1になるべきなのですが、Windowsのディスプレイ設定は2辺と隣り合うことを想定していないのか、赤字の3の左辺、もしくは4の上辺のどちらかにしかスナップせず、逆にどちらかにスナップすると絶対にもう一方は合わないという動きをしていました。<br /><br />　ただ、赤字の0,2,4,5の横一列は整列されたので、当初赤字4,5の2画面でリモデが使えないという問題は解決しました。現状、赤字の1,3を使って画面をまたいでリモデをする、ということができませんが、このパターンはないと思うので諦めました…。座標を使ってディスプレイの場所を指定できる方法があればいいんですが…。<br /><br /><br /><br />　変な環境でディスプレイを出力していてRDPで複数画面が使えない!というときは、使いたいディスプレイ同士が0pxで隣接しているかを確認する必要がある、という、ほんとに使い所のないナレッジを得たのでここに供養します。<br /><br />追記:<br />　その後またディスプレイポートの差し替えがありスナッピングと格闘していましたが、それを便利にするDPEditというツールがあるのを知りました。<br />　<a href="https://github.com/programmer2514/DPEdit" >DPEdit -A simple Windows command line utility to accurately set the relative position of displays in a dual- or multi-monitor setup - </a><br /><br />　dpedit /L でつながっているディスプレイ一覧を取得できます。<br /><br /><blockquote> dpedit /L<br /><br />Display #5<br />Device name: \\.\DISPLAY5<br />Device string: AMD Radeon RX 7900 XTX<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {3840, 0}<br /><br />Display #6<br />Device name: \\.\DISPLAY6<br />Device string: AMD Radeon RX 7900 XTX<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 4<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {0, 0}<br /><br />Display #10<br />Device name: \\.\DISPLAY10<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {-7680, 0}<br /><br />Display #11<br />Device name: \\.\DISPLAY11<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {2560, 1440}<br />Position: {1280, -1440}<br /><br />Display #12<br />Device name: \\.\DISPLAY12<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {-3840, 0}<br /><br />Display #13<br />Device name: \\.\DISPLAY13<br />Device string: NVIDIA Quadro M2000<br />Active: 1<br />Mirroring: 0<br />Modes pruned: 0<br />Primary: 0<br />Removable: 0<br />VGA compatible: 0<br />Dimensions: {3840, 2160}<br />Position: {3840, -2160}</blockquote><br /><br />　<code>dpedit ［ディスプレイ番号] [x座標] [y座標] </code> でディスプレイを一つづつ、もしくは複数指定して配置を指定できます。上記の内容を5,6,10,11,12,13の順で一発で指定しようとすると以下のようになります<br /><br /><blockquote> dpedit 5 3840 0 6 0 0 10 -7680 0 11 1280 -1440 12 -3840 0 13 3840 -2160</blockquote><br /><br />　複雑な配置を行っている場合にピクセルパーフェクトで配置できずにツラミを感じている人は他にもいるようなので、そのうちPowerToysに入るかもしれません<br />　<a href="https://github.com/microsoft/PowerToys/issues/2652" > Fine-tune multi-monitor positioning tool #2652 - microsoft / PowerToys - </a><br /><br />　いずれにしても、これで不毛なイラつきがなくなったのでまた一つPCの利用が快適になりました。<br /><br /><br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry240112-034641">
		<title>【HW】複数枚のGPUを搭載したWindowsのGPUの扱いについて</title>
		<link>http://xmms.jp/blog/index.php?entry=entry240112-034641</link>
		<description><![CDATA[複数GPUを搭載している環境だと、WindowsのバージョンによってセカンダリGPUの扱いが違うというのがあるのでそのメモです。<a href="comments.php?y=24&amp;m=01&amp;entry=entry240112-021611" >前回の内容</a>に入れようと思った内容だったのですが長くなりすぎたので分けました。<br /><br /><h2>昔は表示しているディスプレイごとに使うGPUが違った</h2><br />　古のXPからWin7、W10の何処かのバージョンまでは、グラボが複数あってそれぞれ画面を出力している場合、その画面を表示しているGPUが実際にその内容を処理していました。　そのため、ゲーム用に使うGUPは画面を1枚だけつなぎ、それ以外の雑多な内容を表示するためのをGPUを別に搭載することによって一種の負荷分散が出来ました。<br />　少なくとも、1080を買った直後は「ゲーム用GPUは画面を1枚だけ出すのが一番パフォーマンスが出る」という動きをしていた記憶があります。<br /><br />　逆に、セカンダリGPUが貧弱だと、ウィンドウモードで起動したゲームをセカンダリ側に持っていくとカクカクになるという動きをしていました。XPや7ではウィンドウモードで起動したゲームが少しでもディスプレイの境界をまたぐとFPSがガタ落ちしたのを覚えています。<br /><br /><h2>すべての処理がプライマリGPU処理に</h2><br />　それがWindows10のどこかのバージョン(20H2くらい?)からすべての内容はプライマリGPUで処理し、その結果を各ボードのRAMにコピーする、という挙動になっていました。その結果、 利点としてはHEVCなどの重いコーデックを使った動画やウィンドウモードで起動したゲームなどを、低性能なセカンダリGPUにつながっているディスプレイ領域にもっていってもそれなりに動く、という挙動になりました。<br /><br /><a href=images/ARK-Windowed.jpg class=lb><img src=images/ARK-Windowed.jpg width=500px></a><br><br /><br />　上記はゲーム性能としてとしては貧弱なM2000に繋がったディスプレイにARKという重いゲームをウィンドウモードで起動して持ってきていますが、実態としては7900XTXで処理しているので100FPSを超えて表示できています。<br />　ラグなどもなく、ディスプレイのリフレッシュレート以上のFPSが出ているので、詳しくないとその事に気が付かないくらい違和感がありません。<br /><br />　昔Twitterなどで「GPUが搭載されていてもオンボード側のHDMIなどにディスプレイを繋いでいて意味がない!」というような投稿がありましたが、その状態でもプライマリGPUがディスクリートGPUに指定されているならVRAMコピーを挟むもののGPU性能の8割位は出ていたと推測できます。<br />　非効率ではあるものの上記のARKの例のようにゲームなどは普通に動くので、実際のところ気がついていなかったのではないかと思います。Win7とか10のでたての頃は明らかにパフォーマンスが出なかったと思いますが。<br /><br />　この仕組みの欠点としては、どうやってもプライマリGPUの負荷だけが上がるようになってしまうこと、ある程度以上のセカンダリを積んでいると、GPUのその余ったリソースを有効活用できないことです。<br />　また、マルチモニタ環境でセカンダリGPUに繋がったディスプレイでなにか作業をすると、まずプライマリGPUで描写→セカンダリGPUのVRAMにコピーという無駄なステップが増えてしまうという問題もありました。<br /><br /><h2>無理やりプログラムが使うGPUを指定する</h2><br />　プロセスが利用するGPUは、プロセスが立ち上がるときにWindowsでプライマリになっているディスプレイ(「このディスプレイをメインディスプレイにする」に指定されているディスプレイ)がつながっているGPUとなります。<br /><br />　ずっと起動しているとあまりにもプライマリGPUのVRAMを消費するので、その仕組を利用して、ブラウザなどを起動する前にセカンダリGPUに繋がっている適当なモニタをプライマリにする→ブラウザなどを起動する→もとに戻す、という手順でVRAMを食うブラウザなどが利用するGPUを無理やり変更していたこともありました。<br />　ただ、これをするとFirefoxがWebGLやGoogleMapをレンダリングできなくなるというような問題があったので微妙なところでした。<br /><br />　まあ、こまめに再起動すればいいという話はありますが、基本起動しっぱなしだと、作業中の窓やブラウザのタブを閉じたくないのでVRAMの負荷分散をしたいという動機が強くなります。<br /><br /><h2>Win10から処理するGPUを指定できるようになったが…</h2><br />　Windows10の21H2くらいからプロセスを処理させるGPUを指定できたのですが、試したところ省電力、高パフォーマンスというくくりは、UDHグラフィックスなどのiGPUを省電力GPU、それ以外のディスクリートGPUは高パフォーマンスGPUというくくりでした。<br />　なので、両方ともディスクリートであるM2000と1080という組み合わせの場合、どちらかを省エネグラボに指定する、ということは出来ませんでした。<br /><a href="https://forest.watch.impress.co.jp/docs/news/1270962.html" >https://forest.watch.impress.co.jp/docs/news/1270962.html</a><br /><br />　M2000を省電力、1080を高パフォーマンスと指定できる方法がないかと探したのですが、結局iGPU以外は省電力GPUとして指定することは出来ませんでした。<br /><br /><h2>Win11でいつの間にかプロセスのGPU割当機能が追加された</h2><br />　7900XTXに換装後も4k複数枚でブラウザを起動したままにしていると相変わらずVRAMを10GBとか消費することがある(ブラウザを閉じてもDWMが4GBくらい抱えたままになる)のは解消しませんでした。メモリに余裕があるとはいえ流石にどうにかしたいです。<br /><br />　WindowsUpdateを当てたらマシにならないかとWindowsUpdateを当てることにしたのですが、上記のグラフィックスのInsider previewを試すためにDevチャンネルにしたままなのを忘れていて、久しぶりにUpdateを当てたらWin11のInsider previewが降ってくるという事故を起こしてしまいました。<br />　意図せずWin11(のInsider preview)になってしまったのですが、ロールバックする前に今の環境をWin11にした場合の挙動を確認することにしました。<br /><br />　仕事では13世代のi5を使う関係でW11を使っていますが、W10に比べてすべての動作が緩慢なのでW11をメイン機に入れたくないと思っていたところ、いざ実際に普段のマシンで使ってみると「あれ…なんか逆に調子いい?」という感じだったので、そのまま利用を続行しました。CPUはRyzen 5 5600XなのでP/Eコアというものはなく、OSはどちらを使っても問題ないはずなのですが…。<br /><br />　そして、いろいろな設定を巡っているといつの間にかプログラムを処理するGPUを指定できるようになっていました。<br /><br /><a href=images/AssignGPUonW11.jpg class=lb><img src=images/AssignGPUonW11.jpg width=500px></a><br><br /><br /> 　W11も初期のバージョンはこの「特定のGPU」という選択肢がなかったように思いますが、いつの間にか増えていました。確認したバージョンは Insider Preview Build 23612 (Dev Channel)となりますが、ビルド的に多分22H2くらいにも入っている気がします。<br /><br />　その結果、ブラウザでなにか調べたり動画を見たりするときにはセカンダリGPUのVRAMやビデオデコーダがが使われるようになり、いい感じに動くようになりました。<br /><br /><a href=images/GPUpining-win11.jpg class=lb><img src=images/GPUpining-win11.jpg width=500px></a><br><br /><br />　もっと前にこれができるようになっていてほしかったですが、ようやく欲しかった機能が実装されました。<br /><br /><h2>まとめ</h2><br />　プライマリGPUがミドルクラス〜ローエンドのグラボを使っていて、補助GPUを使って少しでもプライマリ側の負荷を下げたい、というときにはこのオプションは有効だと思います。 <br /><br />　現行のミドルクラスならベース性能がかなり上がっているのでその必要もない気はしますが、VRAMが8GBクラスのものだとゲーム用にメモリを空けるためにブラウザ処理用の補助GPUが欲しくなる気もします。<br />　ちなみに4kだとゲームを起動すると8GB位のメモリはあっという間に使うので、4kでゲームをしたいなら12GB、できれば16GB以上は必要だと感じました。<br /><br />　動画のHWエンコードソフトから使うGPUを選べないような場合も、強制的に使うGPUを指定することによって負荷分散ができるようになります。1080とM2000を組み合わせたときにはOBSやD3DGearのHEVC録画はGPUを分けたほうがゲームのFPSは安定していました。<br /><br />　また、プライマリGPUの性能が高いのであれば、CPUがiGPUを持っている場合マザボ側のポートもそれなりに使えるようになること、<a href="https://www.elsa-jp.co.jp/products/detail/nvs810/?tab=overview" > NVS810 </a>のような1スロットで8枚DPをはやせるGPUを使うときに、GPUの性能としては低くてもプライマリGPUの性能を借りることによってある程度快適に使えるので、ある種のディスプレイハブとして使うといった柔軟性がかなり高くなったと思います。<br />　<br /><br />　こういったカーネル周りに手が入って良くなっている感じはするので、事故で上げてしまったW11はW10に戻さずに使うことにします。<br /><br />以上<br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry240112-021611">
		<title>【HW】グラボの消費電力を下げるためにFSR/RSRを使う</title>
		<link>http://xmms.jp/blog/index.php?entry=entry240112-021611</link>
		<description><![CDATA[<a href=images/F9iCAGsaAAAdrml.jpg class=lb><img src=images/F9iCAGsaAAAdrml.jpg width=500px></a><br><br />　普段使っているモニタを4k*4枚に変更したのですが、ふとゲームをしようと思ったら今まで使っていたGTX1080では処理能力が足りなくなったためグラボを変えようと思っていたところに、じゃんぱらでRadeon RX7900XTXがなぜか特価で出ていたため久々のRadeonにしました。その時に色々検証したのでその時のメモです。<br /><br /><h2>ことの発端</h2><br />　仕事でモニタを使うときに、置く場所の関係であまり多くのモニタを置くことができなかったので、モニタの中に極限まで情報をぶち込みたいという欲求から27インチの4Kモニタをスケーリング無しで使っていました。目を潰しながら4kを使っているうちに慣れてきたので、家で使っているモニタも4kにしようとすべて置き換えました。 <br />　1枚だけ変えると色味が合わないとかベゼル位置が合わないというような微妙なストレスが嫌なので 4kを複数枚買いましたが、使ってて思うのは個人的には27インチWQHDくらいの解像度がベストだと思います。 <br />　27インチ4kモニタは11インチのFHDモバイルモニタを4枚並べたときとDPI的に同じになるのでスケーリングなしにするとまあまあ厳しいですが、現代のITエンジニアは眼球に可能な限り多くの情報を詰め込む必要があります。<br /><br />　モニタを変えてからしばらくは忙しくゲームをする暇と気力がなくてオフィス用途でしか使っていませんでしたが、ふとARK: Survival Evolvedを起動してみたところ、すべてEpicの状態で4kネイティブで起動すると20FPSくらいしか出ないという状態でした。<br />　ゲームしたいときに出来ないというのは問題なのと、4k複数枚の環境だと普通に使っていてもDWMプロセスやFirefoxなどのブラウザがVRAMを消費していって8Gのうちの5GBを消費しているようなことがあったので、いい加減グラボを変えたいという思いが強かったので新しいものを買うことにしました。<br /><br /><h3>グラボ選定</h3><br />　最初は4080を買おうと思っていたのですが、じゃんぱらで7900XTXが特売されていたのでVRAMが24GBと多いという利点からこれも候補に上がりました。色々比較すると、<br /><br /><blockquote>・純粋な3D処理能力は4080よりも高い場面も結構ある<br />・すべてのタイトルでDLSSなどの機械学習が使える訳では無い<br />・7900XTXの特価は12万だったが4080はどうしても18万くらいになる<br />・RTX5000シリーズが先送りになったのでRTX4000シリーズの価格が下る要素がなくなってしまった<br />・VRAMが多いので雑に使っても心の余裕がある</blockquote><br /><br />　となり、過去散々ATiのグラボで色々踏んだ事があってもまあいいかなと思えたのでポチりました。<br /><br />　VRAMがそんなに必要になるか、と思うかもしれないですが、3ヶ月位(下手すると1年)再起動せずにブラウザのタブやウィンドウを大量に開いたまま使っているとVRAMの使用量が肥大化していき、VRAMが足りなくなるとブラウザやOSの挙動がおかしくなり、すべてのブラウザを閉じるという必要が出てきます。<br />　ブラウザをすべて閉じても今度はWindowsのDWMがVRAMを握ったままになり、その状態でゲームをするとスワップのような挙動になる事があり、解消には結局再起動が必要になってストレスだったりします。<br /><br />　使い方が悪いのでは??というのはそうなんですが、原状どうにもならないのでこの使い方だとスペックによるパワーで押し切るしかないです。また、4kという解像度が1枚でFHDディスプレイ4枚分の表示面積があるので、それを複数枚となると相応のスペックが必要になります。<br />　27インチで4kの解像度でゲームをする必要があるのかと言われると、別に画質を求めているわけではないのですが、フルスクリーンの解像度変更によって開いているウィンドウがめちゃくちゃになるのが嫌なので、どうしてもネイティブの解像度で出したくなります。<br /><br />　ただ、こういった変な要求がなければ現在では性能や値段、発熱や消費電力の扱いやすさから4070あたりが妥当だと思います。また、自分は今のところ常用デスクトップ機で機械学習をさせるつもりはないのでRadeonも候補になりましたが、普段機ででお絵かきAIも動かしたいというような要望があると必然的にGeforceが候補になるかと思います。<br /><br /><br /><h2>わかっていたけど高い消費電力</h2><br />　グラボを換装した感想ですが、4kでもARKなど今までやってきたゲームがコマ落ちせずかなり快適に動くので1080との性能差を実感しました。ただ、それに比例して消費電力が増えたので、 AMD Software: Adrenalin EditionというAMD謹製のGPUのモニタリング、チューニングをするツールから消費電力を監視し、これを下げる方向にチューニングする方法を模索することにしました。<br /><br /><a href=images/Adrenalin.jpg class=lb><img src=images/Adrenalin.jpg width=500px></a><br><br /><br /><h2>フレームレート制限で消費電力を下げる</h2><br />　ARKを遊んでいるとGPUだけで350Wくらい行ってしまうので、どうにかこれを下げられないかとアレコレしていると、当然ながら負荷が下がればそれに伴って消費電力も下がることがわかりました。60Hzのディスプレイなので、それ以上のフレームレートは無駄になってしまうため、まずはフレームレートの固定を行いました。<br /><br /><a href=images/Adrenalin2.jpg class=lb><img src=images/Adrenalin2.jpg width=500px></a><br><br /><br />　HL2やL4D2などでゲームからV-Syncを有効にすると明らかな入力ラグが出るので今まではティアリング上等で200FPSなどのフレームレートを出していましたが、FreeSync対応モニタなのが有効なのかドライバが賢くなったのかわかりませんが、Adrenalineからフレームレートの制限をかけると気になるラグは出ませんでした。<br />　80-90FPS出ていて350W消費していたのが60固定にすることによって300Wくらいに落ちたので、もう少し下げられないか試してみました<br /><br /><h2>RSRなどのアップスケーリングを試す</h2><br />　Adrenalineの設定にRadeon Super Resolution(RSR)という項目があったのでこれについて調べてみると、ゲームの解像度をネイティブ以下に設定したフルスクリーンゲームを起動した際にドライバ側でネイティブまでアップスケーリングして出力する、という機能だとわかり、試しにゲームから解像度をWQHDにしてRSRを有効にしてみるとかなり効くことがわかりました。<br />　具体的にはRSRを使うことによりフレームレート制限と合わさりGPU負荷が80%まで下がり、消費電力が一気に180W程度にまで落ちました。ただ、ゲーム自体はネイティ解像度以下で出力されるため、開いているウィンドウがぶっ飛ぶ問題は起きてしまいました。<br /><br />　よく見てみるとAdrenalineの説明にFSRをドライバレベルで実行するのがRSRである、という文言があったのでこのFSRについても調べてみましたが、FSRとは FidelityFX Super Resolutionの略であり、こちらは出力するテクスチャの解像度を内部的に落としたあと、グラボでアンチエイリアシングなどの処理をしたあとにアップスケーリングをかけるという技術になるようです。<br />　ただ、FSRについてはゲーム側の対応が必要になるようなので、そもそもARKなどは対応していないのでは?と思いましたが、ゲームのオプションにあるResolution scaleというのがアップスケーリング前に描写するテクスチャの画像になるようです。しらなかった…<br /><br /><a href=images/ARK-FSR.jpg class=lb><img src=images/ARK-FSR.jpg width=500px></a><br><br /><br />　FSRについては思いっきり解像度を下げると流石にテクスチャの不鮮明さが目についてしますが、27インチ4kであれば7-8割位のスケーリングならネイティブと遜色ないレベルになりました。<br />　60FPSの制限の中では画質と消費電力のトレードオフになりますが、違和感のないところでWQHDのRSRと同じ180Wかそれよりも若干高い200W程度で落ち着きました。もとの350Wに比べたらだいぶマシになりました。<br /><br /><h2>ついでにDLSSなどについても調べてみる</h2><br />　AMDのグラボなのでNVIDIAの技術であるDLSSは使えないのですが、こちらについても調べてみたところ、やっていることとしてはFSRと同じ低解像度テクスチャのアップスケーリングだとわかりました。<br />　違いとしては、FSRはスケーリング処理をシェーダーとして扱うため特殊なコアが必要ないという特徴がありますが、DLSSはその処理をTensorコアなどの専用プロセッサで行うので対応したグラボが必要になる、ということみたいです。<br />　事実、FSRは1080でも利用できたようなので、実はこれで誤魔化せばグラボを買わなくても耐えられたのでは…という思いはありますが、FSRを行うにもグラボ側の余裕がないと効果がないようなので多分意味はあったと信じます。まあ、VRAMが足りない問題は出ていたので…<br /><br />　DLSSの進化系であるDLSS-FG(Frame Generation)は、実際のレンダリングフレームの間にTensorで(描写済みのテクスチャからいわば画像として)作成したフレームを挟むことによりフレームレートを上げる処理になるようです。同じような技術がFSR3でも実装されるようです。<br />　ただ、補完フレームを挟む必要があるので入力から出力までのバッファが必要になり、入力のレイテンシ低減にはならず、むしろ増える方向になるようです。FSR/DLSSは実際の描写が軽くなるためこれを有効にすることによって入力レイテンシが下がるらしいです。<br /><br /><iframe width="900" height=500 src="https://www.youtube.com/embed/4YERS7vyMHA" title="DLSS 3 Frame Generation - You're Doing It Wrong" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> <br /><br />　フレームレートと入力遅延が一致しないというのはなかなか難しいですが、GPUの性能が足りずそもそもコマ落ちするレベルでレイテンシが上がっているようなときにはDLSS-FGのレイテンシのほうがマシになる可能性はあります。<br /><br /><h2>まとめ</h2><br />　昔は<a href="https://pc.watch.impress.co.jp/docs/column/zenji/1483093.html" >「ドライバのフィルタ処理で正しくテクスチャを描写してない!手抜きだ!チートだ!」 </a> みたいなことを言っていた時期がありましたが、今となっては「クソ真面目に描写するのは馬鹿らしいからAI使って補完しようぜ!」みたいなことを言い始めるあたり時代を感じます。まあ前者についてはただの言いがかりですが。<br /><br />　フレームレートを増やす技術というのは言い換えれば同じフレームレートなら負荷が下がる技術ということになるので、極端な高フレームレートディスプレイを使っていないのであれば消費電力を下げる恩恵があるというのを実感しました。<br />それなら下位のモデルでもいいのではないかと思うかもしれませんが、これらの技術が (RSRは原理的に使えそうではありますが) すべての場面で使えるわけではないというのと、ベーストルクがあるからこそできる余裕というのもあるので、グラボを買うなら個人的にはある程度の上位モデルをおすすめしたいです。<br /><br />　ただ、11月ごろに7900XTXを買ったのですが、2月に4080Superが15万くらいで出るらしいというのを見て「それならそっちにしたわ…」みたいな気持ちはあります…。まあ、こんなことでもないとRadeonを買うこともなかったと思いますし、使ってみたら改めて知ることも多く、AI以外の用途なら悪くないというのがわかったので良しとします。<br />　7900XTXも出始めの頃のドライバの出来は相変わらず散々だったようなので、他人におすすめするときは「Geforce買っておけ」と言いますが…。<br /><br />　FSPカウンタなどで高いフレームレートを見ると気持ちがいいですが、逆に消費電力を減らす方に振ってみるのも面白いと思いました。<br /><br />以上<br /><br /><br /><br /><br /><h3>余談:過去のATiで踏んだもの</h3><br />　3870を2枚でCrossFireしていたときが一番ひどかったです。CFを使うとどのドライバでも何かしらおかしかったので、その出来の悪いドライバから一番マシなのはどれかを探すのが大変でした。ジャンク漁りかな?<br />　どれも出来が悪いので、毎月出るCatalystドライバに今抱えている問題が直らないかという僅かな願いをかけて更新するのですが、ひどいものだと入れたら最後、青くなって戻ってこれなくなるということが多々ありました。月刊Catalyst!今月号の付属はきれいな青画面つき!!!みたいな感じでした。<br />　まあ、そのあとGTX295を使いましたが 結局nVidiaでもデュアルチップはうまく動かない事が多く、その後使ったHD4890は安定していました。<br /><br /><br /><h3>余談:買ったモニタ</h3><br />　モニタについてはそこまでこだわりがないのですが、1枚だけ変えると色味が合わないとかベゼル位置が合わないというような微妙なストレスが嫌なので、使っていた4枚をすべて交換する前提で安いものを探していました。するとAliで162ドルのものが見つかりました。 (今は絶版になってますが) <br /><br /><a href=images/Anmite-27inchmonitor.jpg class=lb><img src=images/Anmite-27inchmonitor.jpg width=500px></a><br><br /><br />　モバイルモニタなどの中国製モニタをいくつか試した経験から、今の中国製のモニタのパネルはそれなりに品質が高いという経験則と、ベゼルに変な文字が入っていないのと、何故かこれだけ大きいにも関わらず送料が無料だったので 、試しに1枚買って1ヶ月検証したのですが、そこそこ良かったので計4枚買いました<br /><br />　まあ買った時期によって(もともとできるとは書いていなかった)入力のPiPができるリビジョンとできないリビジョンが混ざっていたとか、 旧リビジョンのモニタについてきたACが公称消費電力が45Wに対して12V/3.33A=40Wという微妙に出力の足りないACで「大丈夫かこれ」とか思っていたら案の定1ヶ月でACが壊れたとか、解像度をWQHDにすると144Hz駆動にする裏オプションが存在するとか、大陸しぐさ満載でしたが、鍛えられてくるとむしろそれが楽しくなってきます。 色んな意味でシビレますね。 <br /><br />　ちなみにACについては汎用的な2.2/5.5mm径のACなので在庫が家にくさるほどあり、12V/5Aのものに交換して無事に動きました。それを口実に紛争を開始して部分的な返金を受けられたので良しとします。向こうも知ってか後期リビジョンではACが最初から12V/5Aのものになっていました。色については初期は黄色みが強いですがOSDで調整すればいい感じの発色になりました。<br /><br /><br /><br />]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry230306-160036">
		<title>【Monitoring】 ZabbixからESXiホストに刺さってるMegaRAIDの状態をLLDで動的に取得して監視する</title>
		<link>http://xmms.jp/blog/index.php?entry=entry230306-160036</link>
		<description><![CDATA[　個人でESXiを動かしていると、何かとLSIのRAID情報を取得したいと思うことがありますが、LSAではなくて既存のZabbixからデータを取得したいと思うことがあります。ありますよね(同調圧力)。<br />　何かいい方法がないかと見ていたらstorcliがjsonでデータを出力できることに気がついたので、ZabbixのLLDと組み合わせていい感じにデータを監視する方法を作りました。先にテンプレートのJSONを置いておきます。<br /><br /><a href=data/Template_LSI-storcli.json>Template_LSI-storcli.json</a><br><br /><br /> storcliが動けばLinuxであっても情報を取得できるので、agentのsystem.run形式で作ったものも同梱しておきます。storcliの実行にroot権限が必要になるので、storcliにスティッキービットをつけたりsudoを許可したりagent自体をrootでうごかしたりしていい感じに対応してください。<br />　system.runは悪だ!!!!!という方は、最終的にjsonが取れればいいので、userparameterにしたりrootのcronでstorcliを実行して結果をテキストデータとして出力してログ監視するなど、linuxであればやりようはいくつもあるのでいい感じに工夫してください。<br />　まあ、linuxでエージェントが入っているようであれば/var/log/kernelなどをmegaraid_sasといったようなキーワードで監視していれば大体のイベントが取得できますが…。<br /><br />　ESXi用のテンプレートはSSHで接続してstorcliの実行結果を取得するので、Zabbix-agentが入っていないLinuxを監視したい場合にも使えます。<br /><h2>前提条件</h2><br />　利用するにあたり、以下の前提条件が必要になります。<br /><br /><blockquote>Zabbixのバージョンが6系であること<br />監視対象上でstorcliが動かせること<br />作成したLDに対して名前がついていること<br />ssh接続が有効になっていること<br />ESXiホストの/etc/ssh/sshd_configのPasswordAuthentication が yesになっていること</blockquote> <br /><br />　注意点としては、LLDとJSONのクエリの関係で、作成した論理ディスクに対して名前が必要になります。デフォルトではついていないので、storcliで監視対象全てで被らない一意な名前をつけてあげてください<br /><br /><blockquote>/opt/lsi/storcli/storcli  /call/vall show all #一覧を確認<br />/opt/lsi/storcli/storcli  /c0/v0 set name=myhost01-boot #/c0/v0に対して名前を付ける</blockquote><br /><br /> ESXi側のSSHに関しては共通鍵認証でもいいですが、テンプレートの変更が必要なのでそのへんの設定は今回は省きます。デフォルトのkeyboard-interactiveになっていても動きそうな気がしますがテストしてません。<br />　また、テンプレートの形式がZabbix6形式になっているので4系では入らない気がします。LLDのためにJSONpathとカスタムスクリプトでJSを使っているので、これを元に一から作る場合であっても、Zabbix側のカスタムスクリプトでJSの拡張がされていないと動かない気がします。<br /><br />　いずれにしても、4系の環境がもうないのでテストしてないですが、JSONpathは4系でも使えたはずなのでなにかのヒントにはなるかと思います。<br /><br /><h2>利用方法</h2><br />　まず、Zabbixに監視するためのホストを作ります。ESXiの場合はSSHで接続するので、インターフェースは参照しないので127.0.0.1のままでOKです。ホスト名だけ入れてください。<br /><br /><a href=images/Zabbix_storcli-1.jpg class=lb><img src=images/Zabbix_storcli-1.jpg width=500px></a><br><br />　次に、マクロに色々仕組みます。利用しているマクロは以下になります<br /><br /><blockquote>{$IP}　接続先IP<br />{$PASS} SSHの接続パスワード<br />{$STORCLI} Storcliの配置先　ESXiデフォルトは/opt/lsi/storcli/storcliのはず<br />{$USER} SSHの接続ユーザ</blockquote><br /><br /><a href=images/Zabbix_storcli-2.jpg class=lb><img src=images/Zabbix_storcli-2.jpg width=500px></a><br><br /> 今思うと{$IP}はホスト作るときにIPで作って{#HOST.IP}でも良かったのでは??という気がしますが、作ってしまったのでそのままにします。また、PASSについてはデバッグが終わったあとであればSecret textに変更可能ですが、最初はクリアテキストでデータが取れるかを見たほうがいいです。<br /><br />　作成したホストに今回のテンプレートをリンクさせ、<code>LD Data from Storcli</code>を<code>Execute now</code>で実行します。正しく設定されていれば、LLDが発動してアイテムが増えるはずです。LDが増えない場合、上記の制限事項にある手順の<code>storcli  /cx/vx set name=uniquename</code> で名前をつけたか確認してください。Latest dataでデータが取得できているのにLDが増えない場合おそらくこれが原因です。<br />　同じく<code>PD Data from Storcli</code>を実行すると、刺さっている物理ディスクの一覧が取得できると思います。<br /><br />　Latest dataが取れない場合、ZabbixからESXiにSSHが届くか、storcliのパスが合っているかなどを確認してください。<br /><h2>制限事項</h2><br />　物理ディスクの監視ですが、ディスク、HBAのファームウェアのバージョンによっては取得できない項目があります。<code>BBM Error count</code>や<code>Shield State Count</code>などはある程度のクラスのディスクでないと値を持っていないので、ディスクによっては取得できないかもしれません。その場合は取得不可のマークが付きますが、影響がないのでそのままにするかLLDで作成されたアイテムから監視の無効化をしてください。<br /><br /><a href=images/Zabbix_storcli-3.jpg class=lb><img src=images/Zabbix_storcli-3.jpg width=500px></a><br><br /><br />　また、物理ディスクの監視のために実行している<code>storcli /call/eall/sall show all j</code>で応答するJSONがかなり大きいため、搭載ディスク本数が24本などの巨大なマシンの場合はうまく取れないかもしれません。<br /><br />　Zabbix6系ではTEXT型アイテムの場合、history_textテーブルに格納され、使っているDBがMariaDBであればmediumtext型で格納されるため1回のデータ取得で16MBまでは入りますが、使っているDBの種類によっては入り切らない可能性があります。参考までに、ディスクを8本搭載したマシンで<code>storcli /call/eall/sall show all j</code>を実行すると22KBのJSONが出来上がります。<br /><br />　調べた限り、Zabbixは1つのセッションで1GBくらいのデータを流せるようなので、おそらくSSHからのデータ取得で問題になることは少ないかと思いますが、場合によってはタイムアウトの時間を伸ばす必要があるかもしれません。　<br /><br /><strike>　<code>storcli /call/eall/sall show all j</code>の結果については依存アイテムを分解するために実行しているだけなので、Zabbixが6系であればヒストリを「Do not keep history」にしてもLLD分解後のデータ取得は可能です。<br />　もともとデバッグのために1時間しか保持していませんが、コマンド実行に問題がなさそうであればstorcliの履歴については取得しない設定でも問題ないです。</strike><br />→テンプレートの微調整の際にデフォルトではstorcliの実行結果を保存しないようにしました。storcliのコマンド実行結果を眺めたい場合は <code>PD Data from Storcli</code> のアイテムヒストリをnoneから適宜変更してください<br /><br /><br /><h2>技術的内容(うらみつらみ)</h2><br />　今回、JSONとLLDを使うにあたってかなり多くの問題にあたりました。まず1つめはstorcliの返すJSONの作りが悪すぎること、そして2つめはZabbix側のJSONの処理がイケてないことです。両方じゃねーか!!!<br /><h3>ZabbixのJSONの扱いが微妙</h3><br />　ZabbixでJSONを扱うときに2つの問題がおきます。まず1つ目は、LLDでJSONを扱う場合、見つかったキーが<code>[&quot;LLDNAME&quot;]</code>とダブルクオートとブラケットに囲まれた状態で取得します。中身だけ見つけてくれ…と、せめてどうにか値に対してtrimやiregsubなどが使えないか試したのですが、どうやらここをどうにかする方法はないようです。<br /><br />　そのため、アイテム名を整形するために<code>Temperture of {{#MR_PD_NAME}.iregsub(&quot;\[\&quot;(.*)\&quot;\]&quot;, \1)}</code>というような正規表現をところどころで書く必要がありイケてないです。<br />　LLDで見つかったアイテムのキーについても<code>mrstat.pd.temp.[&quot;[\&quot;/c0/e252/s0:WDC WD1005FBYZ-01YCBB1:WD-WMC6M0F4M8WN\&quot;]&quot;]</code>というような状態で入ってしまうのですが、どうせこれは他では使わないしもういいや…と諦めました。<br /><br />　2つ目は、LLDを実行するときにJSONから複数の値が見つかった場合、それぞれ<code>[{&quot;key&quot;: &quot;value&quot;},{&quot;key&quot;: &quot;value&quot;}]</code>で返答する必要があり、<code>[&quot;value&quot;,&quot;value&quot;]</code>だとイテレータが動いてくれないという点です。<br /><a href="https://www.zabbix.com/forum/zabbix-help/419391-utilizing-jsonpath-to-setup-an-lld-macros" >https://www.zabbix.com/forum/zabbix-help/419391-utilizing-jsonpath-to-setup-an-lld-macros</a><br />　これもハマりましたが、上記のスレッドのカスタムスクリプトに助けられました。なおしておいてくれ～～～～～<br /><br /><h3>storcliのJSON構造がカス</h3><br />　storcliのJSONの構造で苦労したのは物理ディスクの応答内容がカスなことです。一例としては以下のようになります<br /><br /><blockquote> {<br />  &quot;Controllers&quot;: [<br />    {<br />      &quot;Response Data&quot;: {<br />        &quot;Drive /c0/e252/s0&quot;: [<br />          {<br />            &quot;DG&quot;: 0,<br />            &quot;DID&quot;: 14,<br />            &quot;EID:Slt&quot;: &quot;252:0&quot;,<br />            &quot;Intf&quot;: &quot;SATA&quot;,<br />            &quot;Med&quot;: &quot;HDD&quot;,<br />            &quot;Model&quot;: &quot;WDC WD1005FBYZ-01YCBB2&quot;,<br />            &quot;PI&quot;: &quot;N&quot;,<br />            &quot;SED&quot;: &quot;N&quot;,<br />            &quot;SeSz&quot;: &quot;512B&quot;,<br />            &quot;Size&quot;: &quot;931.000 GB&quot;,<br />            &quot;Sp&quot;: &quot;U&quot;,<br />            &quot;State&quot;: &quot;Onln&quot;,<br />            &quot;Type&quot;: &quot;-&quot;<br />          }<br />        ],<br />        &quot;Drive /c0/e252/s0 - Detailed Information&quot;: {<br />          &quot;Drive /c0/e252/s0 Device attributes&quot;: {<br />            &quot;Coerced size&quot;: &quot;931.000 GB [0x74600000 Sectors]&quot;,<br />            &quot;Connector Name&quot;: &quot;Port 0 - 7 x1&quot;,<br />            &quot;Device Speed&quot;: &quot;6.0Gb/s&quot;,<br />            &quot;Firmware Revision&quot;: &quot;RR07    &quot;,<br />            &quot;Link Speed&quot;: &quot;6.0Gb/s&quot;,<br />            &quot;Logical Sector Size&quot;: &quot;512B&quot;,<br />            &quot;Manufacturer Id&quot;: &quot;ATA     &quot;,<br />            &quot;Model Number&quot;: &quot;WDC WD1005FBYZ-01YCBB2&quot;,<br />            &quot;NAND Vendor&quot;: &quot;NA&quot;,<br />            &quot;NCQ setting&quot;: &quot;Enabled&quot;,<br />            &quot;Non Coerced size&quot;: &quot;931.012 GB [0x74606db0 Sectors]&quot;,<br />            &quot;Physical Sector Size&quot;: &quot;512B&quot;,<br />            &quot;Raw size&quot;: &quot;931.512 GB [0x74706db0 Sectors]&quot;,<br />            &quot;SN&quot;: &quot;WD-WMC6M0J95THT&quot;,<br />            &quot;WWN&quot;: &quot;50014EE0AF2FC003&quot;,<br />            &quot;Write Cache&quot;: &quot;N/A&quot;<br />          },<br />          &quot;Drive /c0/e252/s0 Policies/Settings&quot;: {<br />            &quot;Certified&quot;: &quot;No&quot;,<br />            &quot;Commissioned Spare&quot;: &quot;No&quot;,<br />            &quot;Connected Port Number&quot;: &quot;7(path0) &quot;,<br />            &quot;Cryptographic Erase Capable&quot;: &quot;No&quot;,<br />            &quot;Drive position&quot;: &quot;DriveGroup:0, Span:0, Row:0&quot;,<br />            &quot;Emergency Spare&quot;: &quot;No&quot;,<br />            &quot;Enclosure position&quot;: &quot;1&quot;,<br />            &quot;FDE Type&quot;: &quot;None&quot;,<br />            &quot;Last Predictive Failure Event Sequence Number&quot;: 0,<br />            &quot;Locked&quot;: &quot;No&quot;,<br />            &quot;Multipath&quot;: &quot;No&quot;,<br />            &quot;Needs EKM Attention&quot;: &quot;No&quot;,<br />            &quot;PI Eligible&quot;: &quot;No&quot;,<br />            &quot;Port Information&quot;: [<br />              {<br />                &quot;Linkspeed&quot;: &quot;6.0Gb/s&quot;,<br />                &quot;Port&quot;: 0,<br />                &quot;SAS address&quot;: &quot;0x4433221107000000&quot;,<br />                &quot;Status&quot;: &quot;Active&quot;<br />              }<br />            ],<br />            &quot;SED Capable&quot;: &quot;No&quot;,<br />            &quot;SED Enabled&quot;: &quot;No&quot;,<br />            &quot;Sanitize Support&quot;: &quot;Not supported&quot;,<br />            &quot;Secured&quot;: &quot;No&quot;,<br />            &quot;Sequence Number&quot;: 2,<br />            &quot;Successful diagnostics completion on&quot;: &quot;N/A&quot;,<br />            &quot;Wide Port Capable&quot;: &quot;No&quot;<br />          },<br />          &quot;Drive /c0/e252/s0 State&quot;: {<br />            &quot;BBM Error Count&quot;: 0,<br />            &quot;Drive Temperature&quot;: &quot; 32C (89.60 F)&quot;,<br />            &quot;Media Error Count&quot;: 0,<br />            &quot;Other Error Count&quot;: 0,<br />            &quot;Predictive Failure Count&quot;: 0,<br />            &quot;S.M.A.R.T alert flagged by drive&quot;: &quot;No&quot;,<br />            &quot;Shield Counter&quot;: 0<br />          },<br />          &quot;Inquiry Data&quot;: &quot;7a 42 ff 3f 37 c8 10 00 00 00 00 00 3f 00 00 00 00 00 00 00 20 20 20 20 57 20 2d 44 4d 57 36 43 30 4d 39 4a 54 35 54 48 00 00 00 00 00 00 52 52 37 30 20 20 20 20 44 57 20 43 44 57 30 31 35 30 42 46 5a 59 30 2d 59 31 42 43 32 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 80 00 40 00 2f 01 40 00 00 00 00 07 00 ff 3f 10 00 3f 00 10 fc fb 00 00 5d ff ff ff 0f 00 00 07 00 &quot;<br />        }<br />      }<br />    }<br />  ]<br />}</blockquote><br /><br />　各情報について、なぜ変動する値がキーになっているのか、微妙に違うキーに値を入れるのやめろ、と言いたくなります。例えば、ディスクの温度とシリアルを取りたい場合のデータの位置は以下になります。<br /><br /><blockquote> json.Controllers[0][&quot;Response Data&quot;][&quot;Drive /c0/e252/s0 - Detailed Information&quot;][&quot;Drive /c0/e252/s0 State&quot;][&quot;Drive Temperature&quot;] = &quot; 32C (89.60 F)&quot;;<br />json.Controllers[0][&quot;Response Data&quot;][&quot;Drive /c0/e252/s0 - Detailed Information&quot;][&quot;Drive /c0/e252/s0 Device attributes&quot;].SN = &quot;WD-WMC6M0J95THT&quot;;</blockquote><br /><br />　なぜ以下のようにしなかったのか…<br /><br /><blockquote>json.Controllers[0][&quot;Response Data&quot;][&quot;PhysDrive&quot;][0][&quot;Path&quot;]= &quot;/c0/e252/s0&quot;;<br />json.Controllers[0][&quot;Response Data&quot;][&quot;PhysDrive&quot;][0][&quot;SN&quot;] = &quot;WD-WMC6M0J95THT&quot;;<br />json.Controllers[0][&quot;Response Data&quot;][&quot;PhysDrive&quot;][0][&quot;Detailed Information&quot;][&quot;State&quot;][&quot;Drive Temperature Celsius&quot;] = 32</blockquote><br /><br />　もともとディスクのシリアルと型番を元にクエリを投げて温度を取ろうと思い、上記のような構造であればJSONだけでクエリが完結したのですが、このような構造のためLLDのキーに色々仕込む必要がありました。<br />　内容としてはカスタムスクリプトに正規表現でパスを取り出すものを仕組み、LLDの名前として取得して、LLDのアイテムプロトタイプで正規表現で取り出す、という内容です。<br /><br />　LLDのカスタムスクリプト<br /><br /><blockquote>var array = JSON.parse(value)<br />var drives = []<br />for (var a in array) {<br />    for (var ar in array[a]){<br />        if ( ar.indexOf(&quot;Detailed Information&quot;) != -1){<br />            prefix=ar.replace(/(Drive\s\/[\w\/]+)\s.*/,&quot;$1&quot;);<br />            path=ar.replace(/Drive\s(\/[\w\/]+)\s.*/,&quot;$1&quot;);<br />            detail=prefix+&quot; Device attributes&quot;;<br />            drive=path+&quot;:&quot;+array[a][ar][detail][&quot;Model Number&quot;].trim()+&quot;:&quot;+array[a][ar][detail].SN<br />            drives.push(drive)<br />        }<br />    }<br />}<br /><br />var len = drives.length;<br />var x = 0<br />output = &quot;{ \&quot;data\&quot; :[&quot;<br />for (; x &lt; len - 1; x++){<br />output += &quot;{\&quot;Name\&quot;: \&quot;&quot; + drives[x] + &quot;\&quot;},&quot;<br />}<br />output += &quot;{\&quot;Name\&quot;: \&quot;&quot; + drives[x] + &quot;\&quot;}&quot;<br />output += &quot;]}&quot;<br />return output </blockquote><br /><br />　上記のカスタムスクリプトでこのような名前が取れるので、これをLLDで見つかったディスクとして認識させます。<br /><br /><a href=images/Zabbix_storcli-4.jpg class=lb><img src=images/Zabbix_storcli-4.jpg width=500px></a><br><br /><br /> そして、LLDのアイテムプロトタイプにて、JSONpathでデータを取得する際に<code>.iregsub(&quot;\[\&quot;([0-9a-z\/]+):.*\&quot;\]&quot;, \1)}</code>で一番最初のスロットナンバーの情報を切り出してJSONのキーに埋め込んでいます。<br /><br /><blockquote> $.Controllers..[&quot;Response Data&quot;]..[&quot;Drive {{#MR_PD_NAME}.iregsub(&quot;\[\&quot;([0-9a-z\/]+):.*\&quot;\]&quot;, \1)} State&quot;][&quot;Drive Temperature&quot;]</blockquote><br /><br />　イケてねえ…。まあイケてないものをイケてない方法でどうにかしようとしているので汚くなるのは必然ですが…。<br /><h2>まとめ</h2><br />　Zabbixは仕事でもプライベートでも使うことが多く、いろいろな意味で一番柔軟性が高い監視方法だと感じています。特定のログを検知しても水曜日の6-7時だけは検知を除外する、というような要求でも、Zabbixであればそれなりに複雑なトリガーの条件式で対応できますが、他の監視方法だとかなりキツイ、もしくはそんな方法はない、という事なりがちで、良くも悪くも使い込めば使い込むほど他のものが使えなくなります。<br /><br />　Zabbixは以前の仕事でそれなりに使っていたつもりだったのですが、今回やった内容は全く知らず、「え、そんなことできたの…」という発見もかなりありました。Zabbixはパズルですが、どうにかする方法はあるのでみんなで沼に沈みましょう。<br /><br />　おそらく、今回の方法ももう少しスマートな方法がある気がしますが、とりあえず動いたので参考にはなるかと思います。<br /><br />追記:<br />　その後実際に役に立ってしまったので動作については問題ないと思います。また、storcliのデータについてはデフォルトではヒストリを取らない設定に変更し、ディスクのステータスの追加のデータを取るように変更しました。何が起きてるかを知りたいときには手動でヒストリの取得を有効にしてください。<br />　また、コントローラーが複数存在する場合に、2台目以降のコントローラーのデータが上手くパースできていない問題も修正しました。<br /><br /><a href=images/Zabbix_storcli-5.jpg class=lb><img src=images/Zabbix_storcli-5.jpg width=500px></a><br>]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry221113-092103">
		<title>【HW】 おうちでinfinibandを使う 2022 / SCSTのビルド</title>
		<link>http://xmms.jp/blog/index.php?entry=entry221113-092103</link>
		<description><![CDATA[<a href=images/PXL_20221111_155619890_R.jpg class=lb><img src=images/PXL_20221111_155619890_R.jpg width=500px></a><br><br /><br />　普段便利に使っているESXiの環境ですが、ESXi7x以降になるとvmkAPIのバージョンが上がり、ネイティブドライバが配布されていないとドライバの認識ができないため、古いマイナーなハードウェアがだいぶ認識できなくなります。こちらの環境では未だにストレージがInfinibandとSRPに依存しているので6.7から進めずにいます。<br /><br /><a href=images/FailedCMDs.jpg class=lb><img src=images/FailedCMDs.jpg width=500px></a><br><br /><br />　そんな中、普段動いているストレージのIB接続がESXiからみてesxtopでFCMD/sが跳ね上がるときがあり、なんかストレージが調子が悪い、ということが稀に起きるようになってきました。問題が起きるとストレージ自体の再起動をしてもだめな時があり、VMホストを再起動しても解消しないことがありました。いろいろな検証の結果、どうやらVMホストに刺さっているHCAは問題ないようで、ストレージホストに刺さっているHCAがなにか悪そうな感じでした。<br />　このIB HCAも相当長く使っているので、そろそろ交換してみようと思い、手元にCX2の在庫があるもののebayを見てみたら、FDRなHCAが9ドルで売っていたので買ってしまいました。もうIBは買わないと思っていたのですが…。<br /><br /><h2>ハードウェアについて</h2><br /><a href=images/PXL_20221111_155834522_R.jpg class=lb><img src=images/PXL_20221111_155834522_R.jpg width=500px></a><br><br /><br />　対象のHCAはEC33という型番で売られており、Connect-IBのDPモデルのようです。ちなみにCX2とブラケットの互換があったため、DDRなCX2からブラケットをはいで使いまわしました。<br /><br /><a href=images/PXL_20221111_155933586_R.jpg class=lb><img src=images/PXL_20221111_155933586_R.jpg width=500px></a><br><br /><br />　燦然と輝くFRU PN / NAの文字。謎が多いです。<br /><br /><a href=images/EC33.jpg class=lb><img src=images/EC33.jpg width=500px></a><br><br /><br />　Connect-X4などはEtherとしても動かせるためまだ需要があるのですが、Connect-IBは完全にIB専用のため、かなり不人気です。9ドルでもいらないというのが全てですが、こちらの環境だと逆にスイッチがEtherを使えないので都合が良いです。<br /><br /><h3>IBについて</h3><br />　IBは基本は広大なL2で使うという単純な作りがゆえ、QDRな32ポート40Gスイッチ(Voltaire Grid Director)であってもポートをたくさん使っても消費電力が70-100W程度と非常に低く、ストレージインターコネクトとして使うにはとても優秀です。<br />　ただ、IBにはL3ルーティングやVLANなどがない(パーティションを分けるためのP keyがあるといえばあるものの…)うえ、SubnetManagerなど独特な作法があり使いづらいし、ネットワーク的にみんなほしいのは結局Etherだよね、となり、EtherでRoCEなどを使うのが今どきのRDMAですが、自宅環境で使おうとすると新しくスイッチとNICを買わないといけない、スイッチを買っても40GだとIBからそこまで変わらない、40Gスイッチで多ポートのものになると消費電力がかなり上がる、などの理由があり、用途次第では未だにIBにはメリットがあります。<br /><br />　FCがそこそこまともに動けばよいのですが、8G-FCでLinuxターゲットを作ったときにはあまりパフォーマンスが出なかったので、結局全て売ってしまいました。その時はLIO+targetcliで検証しましたが、32G-FCとCSCTならもしかしたら改善しているのかもしれません。しかし、FC HBAをイニシエーターではなくターゲットとして動かすには多少の手間があり、かつまだそこまで32G-FCが出回っていないので現在どの程度出るのかは不明です。ただ、RDMAの高速性、低負荷性を見てしまうと微妙な気がします。<br /><br /><h2>SCSTでSRPターゲットが動くのか2022</h2><br />　現在動いているストレージはDebian9までは上げましたが、それからは塩漬けになっています。現在のDebian11はカーネルが5.10となり、カーネルモジュールとしてib_srptを読み込むSCSTはカーネルとの兼ね合いがありそうで無事に使えるのか、Connect-IBはドライバとしてmlx5をつかむのでこれもいけるのか、という疑問がありました。LinuxはINBOXでib_sprtドライバを持っているのですが、LIO+targetcliだとずっと使っているとSRPがなにかのタイミングで刺さるということが多々あり、パフォーマンスもSCSTのほうがかなり良かったので過去の経験からSCSTを使っています。LIOももしかしたら良くなっているのかもしれませんが、過去から現在の実績があるのでSCSTにこだわります。<br /><br />　様々な検証をした結果、結論から言いますと無事に動いています。以下にSCSTのビルド方法などを書きます。<br /><br /><h2>SCSTのビルド</h2><br /><br />　昔は小細工が色々必要でしたが、今は素直にビルドできるようになっています。まずはgit,make,gcc,linux-headersを入れます。<br /><br /><blockquote> root@debian:~# apt install git make gcc linux-headers-amd64</blockquote><br /><br />　次に、gitからソースをダウンロードし、makeします。make allでもいいのですが、FCターゲットなど通常使わないものも含まれているため、一つ一つ指定して作ったほうが早く終わります。今回はSCSTに必要なパッケージ、srpt、iscsiモジュールをビルドします。ここで注意が必要なのは、順番的にscst_installを先に持ってこないと他のビルドがコケます<br /><br /><blockquote>root@debian:~# git clone <a href="https://github.com/SCST-project/scst.git" >https://github.com/SCST-project/scst.git</a><br />root@debian:~# cd scst/<br />root@debian:~/scst# make scst_install scstadm_install iscsi_install srpt_install </blockquote><br /><br />　ビルドが終わったら、depmodで新しく追加されたモジュールを反映します。<br /><br /><blockquote> root@debian:~/scst# depmod -a</blockquote><br /><br />　これで、SCSTの前準備が完了しました。正しくモジュールが入ったか、modinfoで確認します。import_nsがSCSTになっていれば問題なくビルドできています。<br /><br /><blockquote>root@debian:~# modinfo ib_srpt<br />filename:       /lib/modules/5.10.0-10-amd64/extra/ib_srpt.ko<br />import_ns:      SCST<br />license:        Dual BSD/GPL<br />description:    SCSI RDMA Protocol target driver v3.7.0-pre#in-tree (11 January 2022)<br />author:         Vu Pham and Bart Van Assche<br />depends:        scst,ib_core,rdma_cm,ib_cm<br />retpoline:      Y<br />name:           ib_srpt<br />vermagic:       5.10.0-10-amd64 SMP mod_unload modversions<br />sig_id:         PKCS#7<br />signer:         SCST Kernel Modules </blockquote><br /><br /><h2>設定ファイルの作成</h2><br />　昔はscstadminで色々やっていましたが、設定ファイルをある程度作って読み込ませたほうが楽なので以下にサンプルを置きます。SCSTのIBのGIDは/sys/class/infiniband/mlx5_0/ports/1/gids/0などにあるので、こちらをcatなどで開きます。<br /><br /><blockquote> root@debian:~# cat /sys/class/infiniband/*/ports/*/gids/0<br />fe80:0000:0000:0000:5849:560e:5c50:0401<br />fe80:0000:0000:0000:5849:560e:5c50:0409</blockquote><br /><br />　以下のサンプルはFCでいうところのLUNマスキングをしていない、すべての接続を受け入れてマウントを許可する設定になっています。場合によってはマスキングをしないと意図しないマウントが発生してファイルシステムが壊れるので注意してください。今回はVMFSとESXiからの利用のみを想定しています。TARGET_DRIVER copy_managerは無くてもscstadminが勝手に増やすものなので正直なんだかよくわかりませんが、書いておかないとターゲットの更新をするときなどに--forceをつけて読み直したときに色々終わるので必要なものになります。<br /><br /><blockquote> cat /etc/scst.conf<br />HANDLER vdisk_fileio {<br />        DEVICE ram0 {<br />                filename /ramdisk/ram.img<br />        }<br />}<br />TARGET_DRIVER copy_manager {<br />        TARGET copy_manager_tgt<br />}<br /><br />TARGET_DRIVER ib_srpt {<br /><br />        TARGET fe80:0000:0000:0000:5849:560e:5c50:0401{<br />                enabled 1<br />                rel_tgt_id 1<br />                LUN 0 ram0<br />        }<br />        TARGET fe80:0000:0000:0000:5849:560e:5c50:0409{<br />                enabled 1<br />                rel_tgt_id 2<br />                LUN 0 ram0<br />        }<br />}<br />#TARGET_DRIVER iscsi {<br />#<br />#        enabled 1<br />#<br />#        TARGET iqn.2022-11.dev-debian-04.sn.1234 {<br />#                QueuedCommands 128<br />#                LUN 0 ram0<br />#                enabled 1<br />#<br />#        }<br />#<br />#} </blockquote><br /><br />　一度これでSCSTを起動します。systemctl start scst.serviceだとなぜかscst_vdiskが読み込まれないので、手で読み込みます<br /><br /><blockquote> root@debian:~# for a in  scst scst_vdisk ib_srpt  ; do modprobe $a ; done</blockquote><br /><br />　その後、scst_adminで設定を直接読み込んで起動します。<br /><br /><blockquote> root@debian:~# scstadmin -config /etc/scst.conf</blockquote><br /><br />　これでESXiにOFEDが入っていればそのうちディスクが見えるはずです。<br /><br /><h2>ESXiからマウントして確認する</h2><br />　LUNマスキングをしていないため、SRPが有効になったESXiがいるIBファブリックにつなぐと定期的にクエリが飛んでいるので勝手にターゲットを認識して未使用ディスクとしてESXiにマウントされます。非公式ながらSRPを使えるESXiは6.7U3が最終です。予め<a href="/confluence/pages/viewpage.action?pageId=9240589" >必要なセットアップ</a>をしたESXiから見てみます。スペックは以下です。<br /><br /><blockquote>ターゲット<br />Dell T5810<br />CPU Xeon　E5-1620 v3<br />RAM 8*4GB @ 2133MHz (32GB)<br />HCA: Connect-IB@PCIE 3.0 x16接続 (デュアルポート接続)<br />RAMDISK 25GB<br /><br />VMホスト<br />Supermicro X10SRL-F<br />CPU Xeon E5-2697 v4<br />RAM: 8*32GB@2133MHz (256GB)<br />OFED:MLNX-OFED-ESX-1.8.2.5-10EM-600.0.0.2494585<br />HCA: ConnectX-3　(not VPI/Pro) @PCIE 3.0 x8接続 ( マルチパス) </blockquote><br /><br />その結果が以下です。<br /><br /><a href=images/SRP_CX3_MBs.jpg class=lb><img src=images/SRP_CX3_MBs.jpg ></a> <a href=images/SRP_CX3_IOPS.jpg class=lb><img src=images/SRP_CX3_IOPS.jpg ></a><br><br /><br />　速い(確信)<br />　QDRなスイッチに接続されているため、理論値的には80Gbps*0.8 in MB/sで8GB/sが最大ですが、CX3がPCIE 3.0のx8でリンクしているため、PCIEの最大が64Gbpsとなり、それの0.8倍となると6.4GB/sが理論値になるのでかなり近いところまで出ています。もう少しIOPSが出てもいい気がしたので、以下のシステムでも検証してみました。<br /><br />VMホスト<br /><br /><blockquote> Supermicro C9Z390-PGW<br />CPU Core i5 9600K @ AllCore4.8GHz<br />RAM: 4*32GB@2666 MHz (128GB)<br />OFED:MLNX-OFED-ESX-1.8.2.5-10EM-600.0.0.2494585<br />HCA: ConnectX-2　 @PCIE 2.0 x8接続  (マルチパス)</blockquote><br /><br />　その結果が以下です。<br /><br /><br /><a href=images/SRP_CX2_MBs.jpg class=lb><img src=images/SRP_CX2_MBs.jpg ></a> <a href=images/SRP_CX2_IOPS.jpg class=lb><img src=images/SRP_CX2_IOPS.jpg ></a><br><br /><br />　速い(確信)<br />　刺さっているのがConnectX-2というPCIE2.0の化石なので帯域は頭打ちになっていますが、CPUのクロックが高いのでIOPSがかなり出ています。<br /><br /><h2>Connect-IBをESXiで使いたい人生だった</h2><br />　Connect-IBはmlx5ドライバを使うため、6.7などでOFEDを入れても認識しません。しかし、デバイスにパススルーをかけてLinux VMでSRPを受け付け、そのディスクをもう一度内部のvmkスイッチとiSCSIで接続することによりストレージプロクシとして動かせば見えるのでは??というスケベ心が起きてしまったので試してみました。これが動けばESXiの上で動くドライバ依存がなくなるので、ESXi8も使えるようになります。センスのない絵にすると以下のような感じになります。SRPドライブはVMによりiSCSIに変換され、ESXiの内部ループバック接続によってDatastoreとしてマウントされます。<br /><br /><a href=images/loopbackmount_poc.jpg class=lb><img src=images/loopbackmount_poc.jpg width=500px></a><br><br /><br />　結論から言うと、動くには動いたのですが、何故かPCIパススルーをかけたLinuxVM上からのSRPドライブに対してそもそもののパフォーマンスが出ないため、あまり意味がありませんでした。ddなどで負荷をかけるとSRPドライブそのものに対するアクセスが物理環境と比べて負荷が高いように見えました。<br />　とはいえ、ストレージプロクシ経由のESXi8.0環境でも1.4GB/sと10Gbps以上は出ていたので、何かしらのチューニングにより改善する可能性はあります。ただ、物理環境では問題なくてもパススルーVM環境だとib_read_bwが通らなかったりなど、なにか一癖ありそうな雰囲気がありました。起動オプションになにか必要なのかもしれません。<br />　また、SRPドライブをiSCSIでエクスポートし直してファイルシステムがこわれないのか、という疑問については問題ありませんでした。ただし、DEVICEの名前を元の名前と揃えておかないとESXiからマウントしたときのeuiが変わってしまうため、これを合わせる必要はありました。<br /><br /><blockquote> root@debian:~# cat /etc/scst.conf<br />HANDLER vdisk_blockio{<br />        DEVICE ram0{ #←ここ<br />                filename /dev/sdb<br />        }<br />}<br /><br />TARGET_DRIVER iscsi {<br />        enabled 1<br />        TARGET iqn.2022-11.dev-debian-iscsiloop.sn.1234 {<br />                allowed_portal 10.11.1.1<br />                QueuedCommands 128<br />                LUN 0 ram0<br />                enabled 1<br /><br />        }<br /><br />}</blockquote><br /><br /><h2>まとめ</h2><br />　Connect-IBについてはIBで使う限りはなかなか良いのですが、ESXiについてはやはり6.7+CX3止まりということになりそうです。IBは損切りしたいのですが、いかんせん速いので結局これを使い続けることになりそうです。今どきのシステムだとハイパーコンバージドな構成でローカルに高速ストレージを積むのが流行りですが、自宅環境だと最低必要台数とハード構成の縛りが結構きつく、多少の冗長化を捨ててもコンピュートノードとストレージノードを分けられたほうがそれぞれに特化した構成が作れるので都合がいいことが多いです。<br /><br />　とはいえ、そろそろNVMeOFとかiSER使いたいので誰か低消費電力な100Gスイッチください…]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry220325-204409">
		<title>【HW/NW】SAXA SS3000で遊ぶ</title>
		<link>http://xmms.jp/blog/index.php?entry=entry220325-204409</link>
		<description><![CDATA[<a href=images/SS3k-1.jpg class=lb><img src=images/SS3k-1.jpg width=500px></a><br><br /><br />　 随分前にとある場所で「鉄(マテリアル)として廃棄する」というSAXA SS3000が大量にあり、試しに一つもらって遊んでみたところ、なかなか面白かったので鉄くずにするには惜しいと思い、更にいくつか買ってみました。(粗鉄として)　ハードウェア的にも超今更感ありますが、用途によってはまあまあ使えるので情報をまとめてみます。<br />　なにげにかなり更新をサボっていたので久々の更新になりました。WFHが始まってから文字を打つことが多くて、Blogを書く気力がわかなかったです…。<br /><br /><h2>ハードウェア構成について</h2><br /> CPUにはAtom C2338 が搭載され、そこにSoCから3本のGbEとPCIEから2本のNICが生えているファンレス構成です。MBは「CASwell, Inc. COB-H500」とありますが、CASwellのページには該当するような箱は見つかりませんでした。この手の箱は大体ホワイトボックスを作ってるメーカーから似たようなものが見つかるのですが、今回は該当しなかったので、箱の削り出しとカスタマイズをしているのかもしれません。強いて言うなら<a href="https://www.caso.co.jp/product/caf-1020.html" >CAF-1020</a>がどことなく似ていますが、構成は全く違います。箱の質感も結構お金かかってる感じがします。<br /><br />　ACは12Vで、もとは大きめの4Aのものを使うようですが、消費電力的には2-3Aくらい流せれば十分だと思います。ACアダプタは抜けどめを気にしなければ外形5.5mmで内径3.3mmの汎用的なものが使えます。内径が2.2mmではないので注意が必要です。<br /><br />　Linux上の認識は以下のようになります。<br /><blockquote><br />owner@SS3K-VPN:~$ lscpu<br />Architecture:        x86_64<br />CPU op-mode(s):      32-bit, 64-bit<br />Byte Order:          Little Endian<br />Address sizes:       36 bits physical, 48 bits virtual<br />CPU(s):              2<br />On-line CPU(s) list: 0,1<br />Thread(s) per core:  1<br />Core(s) per socket:  2<br />Socket(s):           1<br />NUMA node(s):        1<br />Vendor ID:           GenuineIntel<br />CPU family:          6<br />Model:               77<br />Model name:          Intel(R) Atom(TM) CPU  C2338  @ 1.74GHz<br />Stepping:            8<br />CPU MHz:             1750.071<br />BogoMIPS:            3500.14<br />Virtualization:      VT-x<br />L1d cache:           24K<br />L1i cache:           32K<br />L2 cache:            1024K<br />NUMA node0 CPU(s):   0,1<br />Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch cpuid_fault epb pti tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms dtherm arat<br /><br />owner@SS3K-VPN:~$ lspci<br />00:00.0 Host bridge: Intel Corporation Atom processor C2000 SoC Transaction Router (rev 02)<br />00:01.0 PCI bridge: Intel Corporation Atom processor C2000 PCIe Root Port 1 (rev 02)<br />00:02.0 PCI bridge: Intel Corporation Atom processor C2000 PCIe Root Port 2 (rev 02)<br />00:03.0 PCI bridge: Intel Corporation Atom processor C2000 PCIe Root Port 3 (rev 02)<br />00:04.0 PCI bridge: Intel Corporation Atom processor C2000 PCIe Root Port 4 (rev 02)<br />00:0e.0 Host bridge: Intel Corporation Atom processor C2000 RAS (rev 02)<br />00:0f.0 IOMMU: Intel Corporation Atom processor C2000 RCEC (rev 02)<br />00:13.0 System peripheral: Intel Corporation Atom processor C2000 SMBus 2.0 (rev 02)<br />00:14.0 Ethernet controller: Intel Corporation Ethernet Connection I354 (rev 03)<br />00:14.1 Ethernet controller: Intel Corporation Ethernet Connection I354 (rev 03)<br />00:14.2 Ethernet controller: Intel Corporation Ethernet Connection I354 (rev 03)<br />00:16.0 USB controller: Intel Corporation Atom processor C2000 USB Enhanced Host Controller (rev 02)<br />00:18.0 SATA controller: Intel Corporation Atom processor C2000 AHCI SATA3 Controller (rev 02)<br />00:1f.0 ISA bridge: Intel Corporation Atom processor C2000 PCU (rev 02)<br />00:1f.3 SMBus: Intel Corporation Atom processor C2000 PCU SMBus (rev 02)<br />01:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)<br />02:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)<br /></blockquote><br /><br /> 腑分けするとこんな感じです。<br /><br /><a href=images/IMG_20220323_211250_505.jpg ><img src=images/IMG_20220323_211250_505.jpg width=500px></a><br><br /><br /><a href=images/IMG_20220323_210137_192.jpg ><img src=images/IMG_20220323_210137_192.jpg width=500px></a><br><br /><br /><h2>シリアルピンについて</h2><br />　シリアルについては変態^H^H先駆者より情報をいただきました。このピンがシリアルピンです。白ポチより横にシリアルの1-5ピンに相当するので(3.3Vではない)通常のシリアルを適当なジャンプワイヤーなどでつなぐとOS上のttyS0にアクセスできます。<br /><br /><a href=images/IMG_20220323_232829_208.jpg class=lb><img src=images/IMG_20220323_232829_208.jpg width=500px></a><br><br /><br />　ただし、uEFIへのアクセスはファームウェアにパスワードがハードコートされているため、通常はアクセスできません。<br /><br /><a href=images/SS3k-uefi.png class=lb><img src=images/SS3k-uefi.png width=500px></a><br><br /><br />　先駆者がEEPROMをダンプしてパスワード解析をしていましたが、Boot方式をBIOS/MBRからEFIにできること、無効になってるTurboを有効化できる(300MHzあがる)こと、PXEなどを有効化できること以外は特にいじるところはない気がしました。まあ、TBも(排熱などの)理由があって無効化されているはずですし、有効化しても上がり幅が300MHzだと違いがほぼないので、uEFIに入る理由はほぼないです。。<br /><br />　あとはSATAはコネクタを実装すれば使えるそうです。どれだけアンペアが引けるのか不明ですが、シリアルピンの並びにあるPROにちょうど5Vが来ているのでSSDの電源ソースにいい感じに使えそうです。SATAの横の未実装スルーホールは15Vと3Vだったので微妙にそのまま使えそうにはありませんでした。USBのピンヘッダもあるので、そっちから5Vを引けるかもしれません(こちらでは電圧を確認できませんでしたが…)<br /><br /><a href=images/IMG_20220323_232934_679.jpg class=lb><img src=images/IMG_20220323_232934_679.jpg width=500px></a><br><br /><br />　それ以外にも色々ピンが生えているのですが、自分の知識では何がどれにつながっているのかまでは解析できませんでした。実はパスワードバイパスピンがあるのではないかといろいろテスタを当てながらショートさせてみたりしたのですが、結局謎でした。<br /><br /><h2>各シリーズについて</h2><br />　SS3kには無印/II/Proとそれぞれありますが、ハード的にはほぼ違いはなく、ProのみMiniPCIEより11nのWLANが生えているので、そのアンテナのためのSMA端子があります。また、搭載されているSSDにも何種類かあり、8GBモデルと16GBモデル、及びTranscend製MSM610シリーズとInnodisk製3ME2シリーズがあるようです。SSDの中身については完全に消去されてしまっていたため、OSの違いについては不明です。SSDについてはInnodiskのほうがデータシート上の耐久値は高いのですが、ddコマンドなどで連続書き込みすると途中でバッファ切れで失速するような動きをするので、Transcendのほうが動きは素直でした。まあ、どちらにしても期待するようなIOPSや帯域は出ませんが。ただ、後述のCPUエラッタがあるのでリカバリ観点からUSBからの起動を推奨します。<br /><br /><h2>NIC周りについて</h2><br />　かなりクソ^H^H混乱を招く構成になっています。ハードウェア的には、SoCから2本Marvellの88E6320に伸びており、それがそれぞれLAN2、LAN3となっています。88E6320をSoCのPHYを取り出すために使っていると予測しますが、その間が常に接続済みとなり、ケーブルを刺していなくてもLAN2とLAN3は常にUP扱いになります。そのため、ケーブルが抜けたことを検知できません。そして残りの1本が88E6176と接続されており、88E6176からハードウェアスイッチとしてLAN4-7があります。<br /><br /><a href=images/IMG_20220323_210324_859.jpg class=lb><img src=images/IMG_20220323_210324_859.jpg width=500px></a><br><br /><br />　LAN4-7はNECのIXシリーズのように分割して扱うことはできず、Linuxであればenp0s20f1の下にぶら下がります。イメージとしてはBuffaloの小さいGbスイッチに繋がれている感じです。小さい構成だと時としてこの構成は使いやすいですが、VLANタグなどを一切使えないアクセスポートとして使う以上のことはできません。幸い、VLANを喋れる独立したポートが他にあるのでなんとかなりますが…。<br /><br />　WANとLAN1についてはSoCとは別にPCIEにI211が生えている構成になります。注意しないといけないのはこのポートはバイパスポートになっており、SS3kの電源が切れるとリレーにより内部で結線されます。Softetherのtap/ブリッジのVPN専用ポートとして使うときなど、WANとLAN1を同じLANにつなぐようなことになるとループが発生するので注意してください。(1敗)　また、そのような構成のため、pfsenseなどを入れるときにはWANとLAN1を使うと思わぬ接続になりかねないので、バイパスされないWANとLAN2以降を使うことをおすすめします。LAN1/LAN2をOS上でブリッジさせ、そこにtcpdump/tsharkなどをかませてこっそりパケットキャプチャする、LAN1とLAN2でブリッジした上でNICごとに違うパケットフィルタルールを仕掛けて透過FWを作る、など、アイディア次第では色々できそうです。<br /><br />　上記の構成をさらに混乱させる一番の問題は、OS上の認識順とポートの並び順がメチャクチャなことです。もともと他で使われることを想定していないので、勝手に蓋を開けられた上に想定外のOSをぶち込んでる外野にとやかく言われるのはいい迷惑だと認識した上でも、それにしてもどうしてこうなったのかという思いが強いです。特にLAN2-7はOSから見て常にLink Up扱いのためそれに気がつくまで無駄にあれやこれやとやってしまいました。<br /><br />　初期値を画像にするとこうなります。見事に何一つ順番に並んでいません。どうしてこうなった…どうしてもこの<strike>クソ</strike>構成が気になる人はudevなどをいじって合わせてください。<br /><br /><a href=images/SS3k-ether.jpg class=lb><img src=images/SS3k-ether.jpg width=500px></a><br><br /><br /><h2>Mini PCIEについて</h2><br />　ProであればWPEA-121N/WというAtheros AR9382を搭載した11nのチップが乗っていますが、それ以外は空いています。シリアルの存在に気が付かなかったときは、mPCIEをPCIE x1に変換するアダプタと何故か転がっていたPCIE x1のMatrox G200を組み合わせて画面出力をしてアレコレしていました。<br /><br /><a href=images/IMG_20220323_215119_424.jpg class=lb><img src=images/IMG_20220323_215119_424.jpg width=500px></a>　<a href=images/IMG_20220323_215157_428.jpg class=lb><img src=images/IMG_20220323_215157_428.jpg width=500px></a><br><br /><br /><blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちょくちょくMiniPCIE からVGAを引きたいと思うことがあるので変換アダプタを買ってみたけど、そうなるものとわかっていてもなかなかアレ。そしてこいつ、BIOSに入るのにnvramにSVパスワード持ってやがるのか… <a href="https://t.co/rrfher5w01">pic.twitter.com/rrfher5w01</a></p>— MX (@xmms) <a href="https://twitter.com/xmms/status/1297930621243674626?ref_src=twsrc%5Etfw">August 24, 2020</a></blockquote> <script async src="js/widgets.js" charset="utf-8"></script> <br /><br />　ハーフmPCIEな拡張カードなら搭載できるので、なにかに使えそうではあります。<br /><br /><h3>WLANについて</h3><br />　WLANもせめて11acに対応できれば面白いとmPCIEな11acに対応した物を探したのですが、そもそも11ac(VHT)で5GHz帯にSSIDを吹こうとするとIntel系のチップはno-IR (no initiate radiation) フラグがファームウェアに書き込まれているため電波を発信することができず、Broadcomの場合はhost-apdに対応したx86向けドライバがプロプライエタリとして配布されているためSTAにしかなれず、Realtekの場合もno-IRが入っているようです。<br /><br />　唯一の希望がAtheros/QualcommのQCA95xx, QCA98xx, QCA6300系チップを使ったものらしく、海外のフォーラムによるとMikrotik の<a href="https://mikrotik.com/product/R11e-5HacD" >R11e-5HacD</a>がOpenWRTなどで使えるらしいです。まあ、ハーフサイズではないのでSS3kには入りませんが…。QCA系でも書き込まれているファームによってはW52帯でしかAPになれないものもあるようなので、組み合わせを探すのがなかなかに大変そうです。また、海外にはno-IRフラグを無視したドライバをビルドして使う方法もあるようで、その場合はIntel系チップでもAPになれるらしいです。<br /><br />　個人的にはopen/dd dwrtでお手軽に作れればいいなくらいにしか思ってなかったのであまり詳しくは追ってませんが、どうしても11acのAPをx86で作りたい人は追ってみてもいいのではないでしょうか。<br /><br /><blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/rH9eOygjO3">pic.twitter.com/rH9eOygjO3</a></p>— えぬかね📡 (@n_kane) <a href="https://twitter.com/n_kane/status/1505035032049909762?ref_src=twsrc%5Etfw">March 19, 2022</a></blockquote> <script async src="js/widgets.js" charset="utf-8"></script><br /><br /><br /><h2>性能について</h2><br />　2コアの1.7GHzプロセッサなので、そこまで高くはありませんが、LANの検証環境でOpn/pf senseでNATしてPPPoE接続した限り、1Gbpsくらいはさばくことができました。ただ、ntop-ngを動かすとFlowが少なくても全体の70%くらいを持っていかれてしまったので、あまり凝ったことはできません。それをしたいなら(Atom C3558+6GB RAMを搭載した)Sophos XG135あたりが性能的に必要になってくると思います。<br /><br />　DebianとSoftetherを組み合わせ、電源入れるとおうちのLANをL2伸長する君をつくったときは、AES-NIが有効な状態でTLS_AES_256_GCM_SHA384アルゴリズムでレイテンシの低い環境なら大体400Mbpsくらいまでは出たので、ちょっとしたところで使う分には十分かなと思います。ファンレスなのでおうちのDS-Lite終端ルーターや、オークションでも安く出ていることがあるので複数買って雑にばらまくような使い方にはいいかと思います。<br /><br /><h2>CPUのエラッタについて</h2><br />　Atom　C2000シリーズと言うと誰しも頭に浮かぶAVR54バグですが、SS3kもエラッタ持ちのCPUリビジョンが使われています。というか、エラッタ持ちのCPUは2013年から製造され、解消リビジョンは2017年からの供給になるので、一部の長期供給メーカー以外には出回ってないと思われます。その間にC3000シリーズも出てるので、多くの場合は2017年の段階でこちらにシフトしているのではないかと思います。また、調べた限りリビジョンを調べるにはCPUIDが同じため実際にヒートシンクを外して刻印を見る以外の方法がないようです。<br /><br />　実際に問題が出るかというと、この時期まで生き残っている筐体についてはかなり淘汰されたあとなような気がします。実際に来た筐体に関してはサンプル数は数十ですがほとんど問題がなく、1台だけ起動するとLEDがアンバーになりシリアルコンソールに何も出力されない(しかしOSは起動している)という物がありましたが、それ以外は特に問題がありませんでした。しかし、実際に問題が起きている筐体もあるという報告もあるので、なんとも言えません。<br /><br />　いつ死ぬかはわからないので、死んだら他の筐体に入れ替えて継続できるように、いま動かしているものについてはUSBメモリで起動するようにしています。遠隔地においてあるので、死んだらケーブルとUSBメモリを差し替えて使ってくれ、と現地にコールドスタンバイをおいて運用しています。<br /><br /><br /><h2>まとめ</h2><br />　信頼性がない状態からスタートなので壊れたらすぐに交換できるような予備機が必要ですが、ネットワーク系のおもちゃとして遊ぶにはいい箱だと思います。それ以外の用途だと、ストレージの搭載が限られるので、使い所が難しい気がします。NICはたくさんあるのでNFSなどでNASなどに逃がせればいいですが、単体で使う場合はせめてUSB3.0くらいは欲しくなります。mPCIEからUSB3を引き出せればまだ可能性はありそうですが…。あとはメモリを少し多めに搭載してk8sのクラスタなどを作ってもいいかもしれません。CPUがCPUなので、KVMを動かすのは厳しいと思います。<br />　全く無いようで少しだけあるハードの拡張性とその制限を考えながら、何かを作るためのおもちゃとしては面白いので、安価に転がっていたら手を出してみるのはありかな、と思いました。以上。]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry200817-003557">
		<title>【Network】pfsenseでDS-Lite/transix 固定IP1を使う</title>
		<link>http://xmms.jp/blog/index.php?entry=entry200817-003557</link>
		<description><![CDATA[　<a href="index.php?entry=【Network】InterlinkのZOOT-NATIVE-IPv4固定IP1個をDebianから使う" >前回</a>の記事でpfsenseではDS-Liteが使えないと言いましたが、誤りでした。コメント内のアドバイスにより無事に接続ができたのでメモとして残します。通りすがりのどなたか、ありがとうございました。自分の理解のなさを改めて思いしりました。<br />　ただ、<br />・dhcp6cで受け取るDNSがシステムに登録されない<br />・Interface IDを指定できない(一度Preifxを確認してから決め打ちでVIPを作らないといけない)<br />　の2点がまだ解決できていないので、完璧ではないのですが…。<br /><br />　環境:pfsenseCE 2.4.5-RELEASE-p1<br />　インストール自体は終わりWebUIに接続でき、WANアドレスにv6が割り振られている段階からの説明とします。ある程度pfSenseを扱った人を対象としているので一般的なお作法的な部分は省いています。<br /><br /><h2>DNSの設定</h2><br />　DHCPv6からDNSをもらっても何故かシステムに登録されないので、System→General SetupのDNS Serversに以下のホストを登録しておきます。<br /><br /><blockquote>2404:1a8:7f01:b::3<br />2404:1a8:7f01:a::3</blockquote><br /><br /><a href=images/ipv6-pf-dns.png class=lb><img src=images/ipv6-pf-dns.png width=500px></a><br><br /><br />　dhcp6cコマンドを打つと帰ってくることは確認しているので、これについては設定次第でどうにかなる気がするのですが、今の所未解決なので決め打ちです。v4トンネル確立後なら通常の8.8.8.8なども使えるのでそちらでもいいのですが、外部DNSだとupdate.transix.jpが引けないので網内のDNSを使うのがいいと思います。<br />　ローカルコンソールに落ちて dhcp6c -i &lt;WAN NIC&gt;としてDNSアドレスが変わってないことを確認してから設定したほうがいいかもしれません。<br /><br /><h2>DS-Liteの接続をする場合</h2><br /> DS-Liteで接続する場合は例のIP固定が不要なのでかんたんでした。Interfaces→AssignmentsからGIFを選択します。<br /><br /><a href=images/pf-dslite1.png class=lb><img src=images/pf-dslite1.png width=500px></a><br><br /><br />　そして、以下のように入力します。例によってgw.transix.jpというドメイン名は指定できないので、 2404:8e00::feed:100もしくは 2404:8e00::feed:101を入れます。<br />　以前できないと思っていたのは、 GIF tunnel local addressというのが親になるNICのIPv6アドレスを入力するのだと思っていたからでしたが、これはトンネル内で使うIPを指定するところでした。<br /><br />　ただ、結局カプセル化されてしまうので何でもいいようです。DS-Liteの場合はトンネルのローカルに192.0.0.2を、トンネル先のアドレスに192.0.0.1を指定することになっているので、一応仕様どおりに指定します。<br /><br /><a href=images/pf-dslite2.png class=lb><img src=images/pf-dslite2.png width=500px></a><br><br /><br />　あとはInterface Assignmentsに戻り、作成したトンネルインターフェースをOPT1として割り当てます。割当後、Interfacesから作成したOPT1を選択して有効化、及び名前の変更(任意)とMTU/MSSをクランピングします。<br />　<br /><a href=images/pf-dslite3.png class=lb><img src=images/pf-dslite3.png width=500px></a><br><br /><br />　割り当てたら、System→Routingより、Gateway Monitoringの「Disable Gateway Monitoring」にチェックを入れます。(arpingが届かないので、常にGWがDownと判定されてGWが使えなくなってしまうのを防ぐため)<br /><br /><a href=images/pf-dslite4.png class=lb><img src=images/pf-dslite4.png width=500px></a><br><br /><br />　ローカルコンソールに落ちてping 1.1.1.1など、適当なところに疎通確認をして外との通信ができることを確認したら完了です。<br /><br /><br /><h2>Zoot Native固定IP1などのTransix固定IPを使う場合</h2><br />　DS-Liteとほぼ同じなのですが、VIPの割当をするという一部だけ異なります。DUIDなどの調整によりPrefixをもとにホスト部をfeedにできるのではないかとそこそこ調べたのですが、解決できませんでした。IPv6は自分にはまだ早すぎた…。まあv6Prefixについてはそうそう変わらないはずなので、決め打ちで指定してもあまり問題にはならないとは思うのですが、納得できないです…。<br /><br />　まず、WANにIPv6が割り振られていることを確認したら、そのv6のPrefixを確認します。そのPrefixをコピーしたら、Firewall→Virtual IPsに移動し、IP Aliasとして&lt;Prefix&gt;::feedというVIPを作成します。<br /><br /><a href=images/pf-ZootnativeIP1.png class=lb><img src=images/pf-ZootnativeIP1.png width=500px></a><br><br /><br />　そして、DS-Liteと同じようにInterfaces→AssignmentsからGIFを選択します。VIPを作成したあとであれば、Parent InterfaceにVIPを指定できるので、こちらを指定します。GIF tunnel local addressにはもらったアドレスを、 GIF tunnel remote addressは適当に埋めます。何でもいいようなので、割り振られた固定IPを指定しています。(謝辞:通りすがりのpfSenseユーザーさま)<br /><br /><a href=images/pf-ZootnativeIP2.png class=lb><img src=images/pf-ZootnativeIP2.png width=500px></a><br><br /><br />　最後に、コンソールに落ちて以下のコマンドを実行します。<br /><br /><blockquote> curl &quot;http://update.transix.jp/request?username=&lt;もらったユーザーID&gt;&amp;password=&lt;もらったパスワード&gt;&quot; --interface &lt;作成したVIP&gt;</blockquote><br /><br />　これでトンネルはとりあえずつながるはずなので、あとは、DS-Liteの設定と同じように、<br />・System→RoutingのGateway Monitoringの「Disable Gateway Monitoring」にチェックを入れる<br />・InterfacesからMTU/MSSを調整<br />　をすることによって接続できるようになるはずです。ちなみにDS-Liteと固定IPトンネルは共存できるので、1つのpfsenseで用途によって外に出るGWの選択(PBR)ができます。Rulesの各ルールの中のAdvancedから選べます。便利ですね。速度についてはDebianで接続してもpfで接続しても変化はありませんでした。<br /><br /><h2>まとめ</h2><br />　今の環境は、ネットワークについては最終的にでかくて複雑なpfsenseのVMで制御しているので、既存環境に設定追加で済むのは新しい管理対象を作らなくて済むのでありがたいです。方法を教えてくれた方に感謝しかありません。ありがとうございました。<br /><br />　おわり]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry200812-194208">
		<title>【Network】InterlinkのZOOT NATIVE IPv4固定IP1個をDebianから使う</title>
		<link>http://xmms.jp/blog/index.php?entry=entry200812-194208</link>
		<description><![CDATA[　現在この環境にはNuroや今まで通りのPPPoE接続やZOOT NATIVEによるDS-Lite接続など、複数のネットワークを利用しているのですが、固定IPのためのPPPoEセッションがまともに使えるような速度でなくなってきたため、<a href="https://www.interlink.or.jp/service/zootnative/koteiip.html" >ZOOT NATIVE IPv4固定IP1個</a>というサービスが開始されたのでこちらのサービスに変更しようと思っていました。<br />　しかし、いまいち使っているトンネルなどの仕様がよくわからず、動作対象外のOSで接続するにはどうすればいいのかがはっきりしなかったため二の足を踏んでいたのですが、人柱になろうと覚悟を決めて契約してみました。<br /><br /><h2>tr;dr</h2><br />・トンネルとしてはipip6トンネルを利用している<br />・oepnwrt、<strike>pfsense、opensense</strike>といったメジャーどころは現状トンネル形式がipip6に対応していないっぽい<br />→pfは行けました<br />・vyarttaは多分イケそうだけど検証してない<br />・トンネルを張る前にv6網内のWebサーバにcurlなどでクエリを飛ばす必要がある<br />・ip token set ::feed dev ens192など、Interface IDを指定する必要がある<br />・Debianだと/etc/network/interfacesの中で完結できないため、いくつかスクリプトをかませる必要があった<br />・IPv6の再配布やルーティングは今回は考慮していない<br /><a href="#spoiler" >設定方法まとめまで飛ぶ</a><br /><br /><h2>何故保証外のOSを使いたかったのか</h2><br />　そもそも何故おとなしく動作検証済みの機器を使わなかったかというと、OpenWRTやpfsense/OpenSenseなど、仮想環境で動くOSを利用したかったのです。<br />　仮想環境で動くものについては、CPUやNICなどの物理HWで殴ればそれに応じてネットワークを速くできること、物理的なネットワーク機器より安価にある程度の性能は達成できること、ハードウェアに縛られないので様々な入れ替えが効くといったメリットが大きく、昔は色々物理ネットワーク機器が動いていましたが、今はすべて仮想環境に集約してしまいました。<br /><br />　そのため、今は動いているネットワーク機器というとスイッチとAPくらいしかありません。頑張って物理を減らしたのにその逆行をしたくなかったのです。<br /><br /><h2>契約してみた</h2><br />　契約するとこのような情報がきます。<br /><br /><a href=images/zootnativeip1.png class=lb><img src=images/zootnativeip1.png width=500px></a><br><br />　さて、この情報だけだとなかなかどうしたらいいかわかりません。なんもわからんので色々調べてみます。<br /><br /><h2>そもそもどうすればつながるのかを調べる</h2><br />　<a href="https://jpn.nec.com/univerge/ix/Support/ipv6/transix-static/index.html#dhcpv6pd" >Univerge IXシリーズの設定例</a>を見ると、どうやら4-over-6というトンネル形式を使っているようなので、これをサポートしているか色々調べてみました。トンネルにIPv4を設定するのにデフォゲアドレスを設定せずにデバイスを指定するのがなんとも違和感がありましたが、そういうものみたいです。DS-Liteの場合は192.0.0.2がB4(ルーターのトンネル内v4IP)で192.0.0.1がAFTER(トンネル先のIP)アドレスとして振られるので何となく分かるのですが、これでいいのかちょっと不安でした。<br /><br />　<a href="https://www.mfeed.ad.jp/transix/staticip/" >transixのページ</a>を見てみると、こちらにはIPIPトンネルを利用しているという記述があるので、これらのキーワードで色々調べてみます。<br /><h3>pfsenseの対応</h3><br />　<strike>pfsenseにはgreやgifトンネルを張る機能があるので僅かな可能性ながら行けるかと思いましたが、どうやらできないようです。DS-Liteを使おうとしたときも同じだったのでうっすらわかっていましたが。。いつか対応してくれると嬉しいのですが。</strike><br />　→pfsenseについては接続できたので<a href="index.php?entry=%E3%80%90Network%E3%80%91pfsense%E3%81%A7DS-Lite/transix-%E5%9B%BA%E5%AE%9AIP1%E3%82%92%E4%BD%BF%E3%81%86" >訂正</a>します。<br /><h3>OpenWrtの対応</h3><br />　OpenWrtはDS-Liteのトンネルを張るのに一番かんたんなOSでしたが、それ以外にも色々対応しているので行けるだろうと思っていました。しかし、<a href="https://openwrt.org/docs/guide-user/network/ipv6_ipv4_transitioning" >対応するプロトコル</a>には4-over-6はありませんでした。 6to4(IPv6-in-IPv4Tunnel)はあるのですが、欲しいのは逆なんだよなあ…。。IPIPトンネルもあるのですが、これはv4アドレス同士のトンネルを張るためのプロトコルで、v6アドレスを設定することはできませんでした。<br />　調べてみると<a href="https://thenybble.de/projects/ipip6.html" >Debianでのチュートリアル</a>があったのでip -6 tunで設定できるかと思いましたが、どうやら入っているのはiproute2ではなくiproute1(もしくはBusybox的な何か?)が入っているようで、ip -6 tun addネームスペースは実装されていませんでした。Linux自体は対応しているので、需要が増えてくれば対応してくれる気もしますが、現状どうやってもトンネルは作れませんでした。<br /><h3>Vyattaの対応</h3><br />　<a href="https://wiki.vyos.net/wiki/IP_tunneling" >対応しているトンネル方式一覧</a>にはあるので、多分問題なく行ける気がします。しかし、コントリビューター以外がダウンロードできるのは<a href="https://downloads.vyos.io/?dir=rolling/current/amd64" >dailyのバッチビルド</a>のOSのみで、個人的な経験ですがdd-wrtやpfsenseなどでdailyビルドについてはあまりいい思い出がないので導入をためらってしまいました。<br /><br />　どれも微妙な状況だったので、どうしようかなあと思いましたが、<a href="https://thenybble.de/projects/ipip6.html" >Debianでのチュートリアル</a>があるので、一旦素のDebianでまず接続ができるかどうかを試してみることにしました。iptablesはよく忘れるので、できればWebUI持ってるOSが良かったのですが。CentOS?なんで家でまで社畜しないといけないんですか…。<br /><br /><h2>Debianで接続を試してみる</h2><br />　チュートリアルにあるように、まずは割り振られたIPをそのまま使って接続を試してみます。<br /><br /><blockquote>ip l add link ens224 name vlan1000 type vlan id 1000<br />ip -6 tun add sit1 mode ipip6 local &lt;自動でもらったIPv6&gt; remote 2404:8e00::feed:140  dev vlan1000<br />ip link set dev sit1 up<br />ip a add dev sit1 &lt;割り振られたIPv4&gt;<br />ip route add default dev sit1</blockquote><br />　さて、これでping 1.1.1.1などを試してみますが、案の定通信できません。<br /><br /><h3>いろいろ調べてみる</h3><br />　調べてみると、先駆者の方がいたので色々参考にしました。<br /><a href="https://y2lab.org/blog/inet/now-available-fixed-ipv4-service-in-interlink-8229/" >https://y2web.net/blog/inet/now-available-fixed-ipv4-service-in-interlink-8229/</a><br />　こちらの方が調べたように、特定のURLに対してクエリを飛ばす必要があるようです。試しにcurlで突っついてみます。ここでやっとユーザーとパスワードの出番が来ます。<br /><br /><blockquote> curl &quot;http://update.transix.jp/request?username=&lt;もらったユーザーID&gt;&amp;password=&lt;もらったパスワード&gt;&quot;</blockquote><br />　しかし、RAだけだとDNSまでもらえないので、update.transix.jpが引けませんでした。DS-Lite で接続しているOpenWrtでは引けたので、そちらでDNSを引いて直接IPにして実行しました。IPは変わる可能性があるので直接指定はおすすめしませんが、まずは接続を確立したいので一旦直接指定で進めます。<br /><br /><blockquote> curl &quot;http://[2404:8e00::feed:400]request?username=&lt;もらったユーザーID&gt;&amp;password=&lt;もらったパスワード&gt;&quot;<br />→OK</blockquote><br />　OKが帰ってきたので行けるだろうと思いましたが、まだ駄目でした。上記ブログにあるように、どうやらアドレスを::feedにしないといけないようです。インターフェースIDってそういうことか…なんでそういう事するの…<br /><br /><blockquote> ip -6 add add &lt;割り振られたPrefix&gt;::feed/64 dev vlan1000<br />ip -6  add  del &lt;RAでもらったIPv6&gt; dev vlan1000<br />curl &quot;http://[2404:8e00::feed:400]request?username=&lt;もらったユーザーID&gt;&amp;password=&lt;もらったパスワード&gt;&quot;<br />→OK</blockquote><br />　この状態でping 1.1.1.1などを実行すると、ようやく応答が帰ってきました。やったぜ。<br /><br /><h3>再起動後にも自動接続をするようにしたい</h3><br />　接続は確立できたので、今回手でやった部分をうまくOSの仕組みに組み込んでいきます。　まずはDNSが引けないところとIPv6を手打ち指定しているところがイケてないので、これらをどうにかします。シェルスクリプトで組んでしまえばなんとでもなりますが、できればそれを避けてOSの標準機構で処理させていきたいと思うので更にいろいろ調べます。<br /><br />　DNSをもらうためにはDHCPを受ける必要がありますが、inet6 dhcpを指定するとSLAACではなくステートフルDHCPv6で受けようとしているのか、ifupのときに永遠に何かを待ち続けてしまうので、<a href="https://wiki.debian.org/IPv6PrefixDelegation" >公式マニュアル</a>を参考にSLAACを受けるために以下の設定が必要でした。<br /><br /><blockquote>#---/etc/network/interfaces---<br />auto ens224.1000<br />  iface ens224.1000 inet6 auto<br />  dhcp 1<br />  accept_ra 1</blockquote><br />　この設定でifup時に/etc/resolv.conに必要な情報が更新されるようになったので多分合ってる気がするのですが、正直あっているのかいまいち自信がありません…。しかし、これだけではアドレスがfeedにならないので、疎通時にホスト部を指定するためにはどうすればいいかと調べてみると、ip token set ::feed dev &lt;IPv6を受けるインターフェース名&gt;と指定すればいけるようでした。<br /><br />　ただ、これを標準のオプションで指定する方法はないようなので、pre-upで指定するしかありませんでした。<br /><br /><blockquote>#---/etc/network/interfaces---<br />auto ens224.1000<br /> iface ens224.1000 inet6 auto<br /> dhcp 1<br /> accept_ra 1<br /> pre-up /sbin/ip token set ::feed dev ens224.1000</blockquote><br />　とりあえずこの設定でIPv6周りの設定は再起動後も要件を満たすようになりました。ちなみに受け取ったDNSは以下でした。<br /><br /><blockquote>#---/etc/resolv.conf---<br />search flets-east.jp. iptvf.jp.<br />nameserver 2404:1a8:7f01:b::3<br />nameserver 2404:1a8:7f01:a::3</blockquote><br /><br />　次にトンネルの部分ですが、これが問題でした。Debian 10に入っているifupではインターフェース種類にinet6 tunnelを指定できなかったため、ifup2パッケージを入れ以下の設定をしましたがだめでした。<br /><br /><blockquote>auto sit0<br />iface sit0 inet6 tunnel<br /> mode ipip6<br /> dev ens224.1000<br /> local &lt;割り振られたPrefix&gt;::feed<br /> remote 2404:8e00::feed:140<br /> address &lt;割り振られたIPv4&gt;<br /> post-up /sbin/ip route add default dev sit0<br /> post-down /sbin/ip li del sit0 </blockquote><br />　トンネルはできるのですが、元になるインターフェース(dev ens224.1000の部分)がうまく入らないため、sit0@NONEというインターフェースが出来上がり、またlocalのIPも指定したものが入りませんでした。<br /><br />　そもそもPrefixが変わってもip tokenで対応できるようにしたのに、localを直接指定するのがイケてないですね…。いろいろ調べたのですが結局解決できなかったなめ、ifup2を消してifupを入れ直し、以下のスクリプトで対応することにしてしまいました。<br /><br /><blockquote># --- mkv6tun.sh ---<br />#!/bin/bash<br />PATH=$PATH:/usr/sbin/<br />DEV=&quot;$1&quot;<br />TUN=&quot;$2&quot;<br />REMOTE=&quot;2404:8e00::feed:140&quot;<br />IPADDR=&quot;&lt;もらったIPv4&gt;&quot;<br />LOCAL=`ip -6 a s dev $DEV|sed -nr &quot;s/^\s+inet6 ([^(fe80)][0-9a-f:]*)\/.*/\1/p&quot;`<br />USER=&quot;&lt;もらったユーザーID&gt;&quot;<br />PASS=&quot;&lt;もらったパスワード&gt;&quot;<br /><br />ip -6 tun add $TUN mode ipip6 local $LOCAL remote $REMOTE dev $DEV<br />ip l se up $TUN<br />ip l se mtu 1460 dev $TUN<br />ip a ad dev $TUN $IPADDR<br />ip r add default dev $TUN<br /><br /> while :; do<br />                 ping -c1 -w1000 update.transix.jp<br />                 if [ $? -ne 0 ] ; then<br />                                   sleep 1<br />                 else<br />                                  logger update url: `/usr/bin/curl -s &quot;http://update.transix.jp/request?username=${USER}&amp;password=${PASS}&quot;`<br />                                  break<br />                 fi<br /> done&amp;</blockquote><br /><br />　このスクリプトは引数に &quot;元になるインターフェース&quot; &quot;作りたいトンネル名&quot;を指定するとよしなにやってくれます。curlのところは実際に通信が通るようになるまでちょと時間がかかるので、それをバックグラウンドでやるための処理です。それをしないとsystemdがいつまでもその処理を待ってしまうのでそれの対応です。<br /><br />　まあ、割り振られるPrefixが変わることはそうそうないので、一度実行すればしばらくは不要な気もしますが、念の為実行するようにしました。思いつきで5分くらいで作ったスクリプトなので雑ですが、とりあえず動いているので大丈夫そうです。これをinterfacesのpost-upに組み込みます。<br /><br /><blockquote>#---/etc/network/interfaces---<br />auto ens224.1000<br /> iface ens224.1000 inet6 auto<br /> dhcp 1<br /> accept_ra 1<br /> pre-up /sbin/ip token set ::feed dev ens224.1000<br /> post-up /opt/script/mkv6tun.sh ens224.1000 sit0</blockquote><br />　再起動後、curl checkip.amazonaws.comなどで指定したIPが返答されることを確認したら、無事に自動起動の設定が完了です。ここにくるまでに2日かかってしまいましたが。<br /><br /><h2>iptablesを書く</h2><br />　そのままではルーターにならないので、NATをするためのiptabesを書きます。/etc/sysctl.confにnet.ipv4.ip_forward=1を追記した後、sysctl -pで反映させる必要があります。iptablesについては一般教養だと思うのであまり深く書きませんが、参考設定としてiptables-saveの出力をおいておきます。ens192というのが内部のLANインターフェースという想定で、内部からの接続はガバガバに受け付けます。<br /><br /><blockquote>#---/etc/iptables.up.rules---<br />*nat<br />:PREROUTING ACCEPT [889:57084]<br />:INPUT ACCEPT [60:10005]<br />:POSTROUTING ACCEPT [0:0]<br />:OUTPUT ACCEPT [0:0]<br />-A POSTROUTING -j MASQUERADE<br />COMMIT<br />*mangle<br />:PREROUTING ACCEPT [0:0]<br />:INPUT ACCEPT [0:0]<br />:FORWARD ACCEPT [0:0]<br />:OUTPUT ACCEPT [0:0]<br />:POSTROUTING ACCEPT [0:0]<br />-A POSTROUTING -o sit0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu<br />COMMIT<br />*filter<br />:INPUT DROP [32:1744]<br />:FORWARD ACCEPT [1643:1853819]<br />:OUTPUT ACCEPT [360:64590]<br />-A INPUT -i lo -j ACCEPT<br />-A INPUT -m state --state ESTABLISHED -j ACCEPT<br />-A INPUT -i ens192 -j ACCEPT<br />-A INPUT -p icmp -j ACCEPT<br />-A FORWARD -i ens192 -j ACCEPT<br />COMMIT</blockquote><br />　-A POSTROUTING -o sit0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtuが重要で、これをしないとMTU不整合で見えないページが出てきたりします。iptables &lt; /etc/iptables.up.rulesで設定を反映させます。<br /><br />　v6の方もガバガバなので多少締めます。 2404:8e00::feed(Transixのトンネル先)からの接続はガバガバに受け付けます。必要最低限に絞る作業に疲れました。<br /><br /><blockquote>#---/etc/ip6tables.up.rules---<br />*filter<br />:INPUT DROP [0:0]<br />:FORWARD DROP [0:0]<br />:OUTPUT ACCEPT [1570:205385]<br />-A INPUT -i lo -j ACCEPT<br />-A INPUT -m state --state ESTABLISHED -j ACCEPT<br />-A INPUT -s fe80::/10 -d fe80::/10 -p udp -m state --state NEW -m udp --sport 547 --dport 546 -j ACCEPT<br />-A INPUT -s 2404:8e00::feed:140/128 -j ACCEPT<br />-A INPUT -p icmp6 -j ACCEPT<br />COMMIT</blockquote><br />　-A INPUT -s fe80::/10 -d fe80::/10 -p udp -m state --state NEW -m udp --sport 547 --dport 546 -j ACCEPTが重要で、これを指定しないとDHCPv6を受け付けられません。ハマりました。こちらもip6tables &lt;/etc/ip6tables.up.rules で反映させます。<br /><br />　これらの設定をifup/ifdown時に反映させるために、/etc/network/if-pre-up.d/iptablesというスクリプトを作成します。+xで実行権限を付けないと反映されないので注意です。あとシバン(#!/bin/bash)も忘れず指定してください。<br /><br /><blockquote>#---/etc/network/if-pre-up.d/iptables---<br />#!/bin/bash<br /> /sbin/iptables-restore &lt; /etc/iptables.up.rules<br /> /sbin/ip6tables-restore &lt; /etc/ip6tables.up.rules</blockquote><br />　これで無事に何度再起動してもルーターとして自動起動してくるようになります。長かった。<br /><div id=spoiler></div><br /><h2>作業の要約</h2><br />　長くなってしまったのでまとめます<br /><h3>ipip6トンネルを作成するためのスクリプト作成</h3><br />/opt/script/mkv6tun.shなどとして作成します。chmod +xで実行権限を与えるのを忘れずに<br /><br /><blockquote>#!/bin/bash<br />PATH=$PATH:/usr/sbin/<br />DEV=&quot;$1&quot;<br />TUN=&quot;$2&quot;<br />REMOTE=&quot;2404:8e00::feed:140&quot;<br />IPADDR=&quot;&lt;もらったIPv4&gt;&quot;<br />LOCAL=`ip -6 a s dev $DEV|sed -nr &quot;s/^\s+inet6 ([^(fe80)][0-9a-f:]*)\/.*/\1/p&quot;`<br />USER=&quot;&lt;もらったユーザーID&gt;&quot;<br />PASS=&quot;&lt;もらったパスワード&gt;&quot;<br /><br />ip -6 tun add $TUN mode ipip6 local $LOCAL remote $REMOTE dev $DEV<br />ip l se up $TUN<br />ip l se mtu 1460 dev $TUN<br />ip a ad dev $TUN $IPADDR<br />ip r add default dev $TUN<br /><br /> while :; do<br />                 ping -c1 -w1000 update.transix.jp<br />                 if [ $? -ne 0 ] ; then<br />                                   sleep 1<br />                 else<br />                                  logger update url: `/usr/bin/curl -s &quot;http://update.transix.jp/request?username=${USER}&amp;password=${PASS}&quot;`<br />                                  break<br />                 fi<br /> done&amp;</blockquote><br /><br /><h3>/etc/network/interfacesの追記</h3><br />　今回はens224のVLAN1000がWANになるNICですが、よしなに変えてください。post-upで上のスクリプトを指定します。<br /><br /><blockquote>auto ens224.1000<br /> iface ens224.1000 inet6 auto<br /> dhcp 1<br /> accept_ra 1<br /> pre-up /sbin/ip token set ::feed dev ens224.1000<br /> post-up /opt/script/mkv6tun.sh ens224.1000 sit0<br /> post-down /sbin/ip li del sit0</blockquote><br /><br /><h3>iptables周りの設定</h3><br />　NAT/パケットフォワーディングの設定を書きます。昔ながらのiptables-save形式ですが、他にも方法があればそちらでもいいと思います。ens192がLANインターフェースという想定です。<br /> /etc/iptables.up.rules<br /><br /><blockquote><br />*nat<br />:PREROUTING ACCEPT [889:57084]<br />:INPUT ACCEPT [60:10005]<br />:POSTROUTING ACCEPT [0:0]<br />:OUTPUT ACCEPT [0:0]<br />-A POSTROUTING -j MASQUERADE<br />COMMIT<br />*mangle<br />:PREROUTING ACCEPT [0:0]<br />:INPUT ACCEPT [0:0]<br />:FORWARD ACCEPT [0:0]<br />:OUTPUT ACCEPT [0:0]<br />:POSTROUTING ACCEPT [0:0]<br />-A POSTROUTING -o sit0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu<br />COMMIT<br />*filter<br />:INPUT DROP [32:1744]<br />:FORWARD ACCEPT [1643:1853819]<br />:OUTPUT ACCEPT [360:64590]<br />-A INPUT -i lo -j ACCEPT<br />-A INPUT -m state --state ESTABLISHED -j ACCEPT<br />-A INPUT -i ens192 -j ACCEPT<br />-A INPUT -p icmp -j ACCEPT<br />-A FORWARD -i ens192 -j ACCEPT<br />COMMIT</blockquote><br /><br /> /etc/ip6tables.up.rules<br /><br /><blockquote>*filter<br />:INPUT DROP [0:0]<br />:FORWARD DROP [0:0]<br />:OUTPUT ACCEPT [1570:205385]<br />-A INPUT -i lo -j ACCEPT<br />-A INPUT -m state --state ESTABLISHED -j ACCEPT<br />-A INPUT -s fe80::/10 -d fe80::/10 -p udp -m state --state NEW -m udp --sport 547 --dport 546 -j ACCEPT<br />-A INPUT -s 2404:8e00::feed:140/128 -j ACCEPT<br />-A INPUT -p icmp6 -j ACCEPT<br />COMMIT</blockquote><br /><br />/etc/network/if-pre-up.d/にiptablesというスクリプトを作成します。+xで実行権限を付けないと反映されないので注意です。あとシバン(#!/bin/bash)も忘れず指定してください。<br /><br />/etc/network/if-pre-up.d/iptables<br /><br /><blockquote>#!/bin/bash<br /> /sbin/iptables-restore &lt; /etc/iptables.up.rules<br /> /sbin/ip6tables-restore &lt; /etc/ip6tables.up.rules</blockquote><br /><br /><h2>測定結果</h2><br />　速度の測定結果は以下です。<br /><a href="https://beta.speedtest.net/result/9878034837" >https://beta.speedtest.net/result/9878034837</a><br /><br /><a href=images/zootnative-speed.png.jpg class=lb><img src=images/zootnative-speed.png.jpg width=500px></a><br><br />　PPPoEは下り30Mbps程度しか出ないことも多々あったのでだいぶ良くなったと思います。まあPPPoEも最初は数百Mbps出ていたので、こちらもトンネル先が詰まるまでの時間の問題かもしれませんが…。<br /><br />　測定中の負荷は、Xeon 2695v2の上で動くVM(2vCPU/2GB/vmxnet3)ですが、atopで見ている限り1コアあたり20%程度irqに持っていかれる程度で、1Gbps環境では大した負荷ではないようです。まあiptablesにルールも大したこと書いてないので、これが増えてきたらどうなるかわかりませんが、最近の高クロックなCPUなら全く問題ないと思います。組み込み向けのCel　N3000などでも物理で動かす限りは1Gbps程度なら問題ないと思います。<br /><br /><h2>まとめ</h2><br />　現状ではお手軽に、とは言えないものの、仮想環境(Linux)でもZoot Native 固定IP1を使うことは可能だとわかりました。<a href="https://www.mfeed.ad.jp/transix/staticip/" >transix IPv4接続（固定IP）</a>形式を利用しているのであればほかでも同様だと思います。10G クロスの契約をしてもこの方法は使えそうですね。<br /><br />　ただ、苦労をしたくないのであれば動作検証済みのネットワーク機器を入れるのがいいかと思います。実際途中で心が折れて中古のIX2106あたりを買おうかと思いました。あと少しで動きそうだけどなにかが足りない、という状況は、解決できないけど諦めもつかないという一番泥沼状態になりやすいですね。後半の動機は意地でした。<br /><br />　<a href="https://shorewall.org/Introduction.html" >Shorewall</a>などの検証もしてから切り替えようかと思ってるので実運用はまだできていませんが、いずれ切り替えていきたいと思います。固定IP1を契約した状態であっても(サポート的にはどちらか一方という回答をもらったものの)DS-Lite は利用できるので、併用して使っていくのはありだと思いました。<br /><br />おわり]]></description>
	</item>
	<item rdf:about="http://xmms.jp/blog/index.php?entry=entry190909-221818">
		<title>【HW】メインマシンをC9Z390-PGWで組んでみた</title>
		<link>http://xmms.jp/blog/index.php?entry=entry190909-221818</link>
		<description><![CDATA[<a href=images/P2390459_R.JPG class=lb><img src=images/P2390459_R.JPG
width=500px></a><br><br />　メインマシンの調子が悪くなってきたので使っているM/Bを新しくしました。そのことについてあれこれ書いてみます<br /><br /><h2>そもそもの経緯</h2><br /><br />　長いこと使っていたX9DAiですが、使っていて一つ問題がありました。それは再起動/コールドブートが一発で上がらないという点です。書くと長くなってしまうのでかいつまんで書きますが、どうやらオンボードに持っているRenesas uPD720200AがWindows10と相性が悪いようで、起動時にこれのドライバの読み込みでコケます。Windbgのシリアルケーブルデバッグで起動シーケンスを他のマシンから見たときに、止まるときはだいたいこのへん(USB絡みのドライバのロード)で死にます。<br /><br /><a href=images/X9dai_windbg.png class=lb><img
src=images/X9dai_windbg.png width=500px></a><br><br />　一発で起動できないせいで、電源強制OFF→再度起動とやる必要があり、これを繰り返した結果OSが破損しました。<br /><br /><a href=images/X9dai_sfc.png class=lb><img src=images/X9dai_sfc.png
width=500px></a><br><br />　OSが壊れた結果、VMRCが何もしていないのにクラッシュしていつの間にかすっと消えている、WindowsUpdateが確実に失敗する、その他不思議な不具合現象が起きるようになりました。ファイルシステム破損→ファイルシステムを直してもOSの不整合が発生してしまったときにどうすれば直せるのか、自分にはわかりませんでした…。<br /><br />　この起動できない問題はすべてのUSB機器を外した上で様々なドライバを試しても解消せず、まっさらなWin10を入れようとしてもインストーラーが(おそらく上記問題で)コケて上がってこない、他のマシンでOSをセットアップしてディスクを差し替えて使っても解決しないという結果が出たので、uPD720200AがWindows10に対応しきれていない、もしくはチップがハードウェア的に壊れていると判断してマシンの置き換えを検討し始めました。起動してしまえば安定するんですがね…。<br /><br /><h2>ハードウェア選定</h2><br />　新しくしたいと思っても色々要件があり、以下の要件を満たすM/Bの選定に苦労しました。要件としては<br /><br /><blockquote>・グラボをゲーム用+サブディスプレイ用の2本刺したいので、x16を1つ、x4程度のリンクを1つもっている<br />　→メインのグラボをx8のリンクに落としたくない、どうでもいい画面の表示はサブグラボに任せてメイングラボのVRAMを使いたくない<br />・10GのNICを刺したいのでx8がほしい<br />・U.2のドライブを使いたいので、変換するためのM.2スロットをもっている/もしくはx4スロットを持っている </blockquote><br /><br />　という要件があり、理想としてはフルx16を1本、x8を2-3本持っている、というのが理想だったのですが、今のAMD/Intelのコンシューマ向けCPUではそもそも生えているリンク数が足りないので、第一候補はXeon W-3235とSupermicroの<a href="https://www.supermicro.com/ja/products/motherboard/X11SPA-T" >X11SPA-T</a>が候補でした。<br /><br /><h3>第一候補だったX11SPA</h3><br />X11SPAのシステムブロック図を見てみましたが、なかなかに気持ち悪い構成でした。<br /><br /><a href=images/X11SPA-T.png class=lb><img src=images/X11SPA-T.png
width=500px></a><br><br />　左側のPEX8747の部分がキモですが、PEX8747にはまずx16でリンクし、そこからIT8898にリンクしています。これがどういう動きをするのかと見てみると、Slot2が使われている場合はSlot2と3がx8リンクになり、Slot2が使われていないときはSlot3がx16接続になるようです。スロット4,5も同じ動きになるようで、最大リンク時にはSlot3とSlot5がx16接続、もしくはSlot2-5がx8接続、合計レーン数は32となりますが、アップリンクがx16なのですべてのスロットで同時に最大帯域を出すとサチュレーションが起きる、という構成のようです。<br />　その下にあるSlot6と7については、IT8898にリンクしているx8がSlot6が使われていない場合はスロット7に接続されるので、スロット7はx8+x8の合計16レーンで接続される、という動きのようです。<br /><br />　この構成が気持ち悪すぎて惚れたのでM/Bだけでも先に買ってしまおうかと思ったのですが、残念ながらXeon W-3235が全く出回っておらず、そもそもトレイ品でしかまだ出ていないので海外でも国内でも発注していつ来るかわからないという状態でした。<br />　そんな状態だったので、W-3200シリーズが出回るまで耐え凌ごうかなと思っていたのですが、なんとなく秋葉原を歩いていたら変なマザボを見つけてしまいました。<br /><br /><h2>変態構成なC9Z390-PGW</h2><br />　これもなかなかの変態で、以下のような構成です。<br /><br /><a href=images/C9Z390-sbd.png class=lb><img src=images/C9Z390-sbd.png width=500px></a><br><br />　パッと見意味がわかりませんが、やはりPLX8747が肝で、X11SPAと同じようにまずスイッチにx16でリンクし、そこからSlot7にx8でリンクし、Slot5が使われていなければASM1480に使われているx8がSlot7に追加で接続されてx16でのリンクになり、Slot1,3も同じ動きになるので、16/0/16/0、16/0/8/8、8/8/16/0、8/8/8/8のいずれかの構成が可能になるようです。ただしアップリンクがx16に対しての32レーン分配なので最大帯域を使うとサチる、またスイッチングコストが発生するのでx16を1つしか使わなくても直結より1%程度パフォーマンスが落ちるようです。<br />　前回PCMでパフォーマンス監視をしたときに、ゲーム時にグラボが接続されているx16レーンは7-8GB/s程度の帯域を使用していたので、x8でリンクすると微妙に足りない(大体7.7GB/s)のですがx16もいらない(大体15.5GB/s)という感じだったので、グラボ+x8の何かを接続するには丁度いいような気がします。<br /><br />　PCH側も変態構成で、そもそもなぜかオンボードでU2を持っていて、U2.2はx4でリンク、U2.1はM.2.2が使われていなければx4リンク、M.2.2も使う場合はx2とx2接続になり、M.2.1はSATA4/5を使わなければx4でリンク、SATA4/5も使う場合はx2リンク、となるようです。つまり、リンクが落ちるのを許容すればM.2もU.2も2本ずつ積めます。ただしアップリンクがDMIでのリンクなのでPCH全体で大体4GB/sの帯域を共有することになるので、すべてのインターフェースを同時に使うと足りなくなりますが…。<br /><br />　このボードでマシンを構成すると<br /><br /><blockquote>・Fモデルを買わなければCPUからDPを2ポート+HDMIを1つ独立で出せるので、追加のグラボが不要<br />　→今の構成はHP ZR2740w*3枚+Lenovo T2424Pという4枚構成なのですが、そのうちのZR2740wを2枚とT2424pの出力を賄おうとすると、大体のM/BはHDMI+DP構成になってしまうので、HP ZR2740wが持っているDP/もしくはDVI-Dリンクで接続しようとするとオンボードだけでは足りません。<br />　M/BによってはDVI端子を持っているんですがDVI-Iなので1920*1200が最大解像度になってしまって2560*1440(WQHD)を出せません<br />・U.2ドライブをそのまま接続できる　←つよい<br />・オンボードで10Gを持っているのでうまくすれば追加の10Gを削れる<br />・帯域を共有するものの16/0/8/8という構成が取れる<br />・OCできる </blockquote><br /><br />というメリットがあったため、まさに自分のためのボードでは????と運命を感じ購入しました。<br /><br />　ちなみに、前の世代ではASRockの<a href="https://www.asrock.com/mb/Intel/Z270%20SuperCarrier/index.asp" >Z270 SuperCarrier</a>がPCI構成で似たような構成をとっていたようですが、現行世代のチップセットではコスト面からか作っていないようです。どうでもいいですが他社だとコンシューマ向けM/Bではシステムブロックダイアグラムを載せていないので直感的に理解できなくて困りました。そのへん●はよくわかってんなと感心しました。一般消費者はそんなもの気にしないというのもありますが。<br /><br /><h2>開封の儀</h2><br />　全体画像は冒頭に貼ってしまったので省略しますが、特殊な構成をピックアップしてみます<br /><h3>スイッチングチップ</h3><br />　この気持ち悪い構成を可能にしているPLXのPCI-Eスイッチングチップです。ヒートシンクが乗っているためチップ自体は直接見えません。<br /><br /><a href=images/P2390460_R.JPG class=lb><img src=images/P2390460_R.JPG width=500px></a><br><br /><br /><h3>U.2コネクタ</h3><br />　既存でいくつかU.2ドライブを持っているので、これを使うためにU.2コネクタが必要でした。<br /><br /><a href=images/nvme.jpg class=lb><img src=images/nvme.jpg width=500px></a><br><br />　U.2のnvme自体はPCI-E変換カードやM.2から変換できるのですが、その手間が省けるので直接持っているのはありがたいです。<br /><br /><a href=images/P2390462_R.JPG class=lb><img src=images/P2390462_R.JPG width=500px></a><br><br />　ただ、U.2ドライブを接続するとPOST時間が伸びます。接続しているドライブが古いせいかもしれませんが…<br /><br /><h3>オンボードLED</h3><br />　ゲーミングなんちゃらの例にもれずこのMBも光るのですが、はっきり言って<b>クソダサい</b>です。<br /><br /><a href=images/C9Z390-PGW-LED.gif class=lb><img src=images/C9Z390-PGW-LED.gif width=500px></a><br><br />　なんというか光り方にセンスが無いと言うか、陰キャが無理してパリピを装おうとしたものの溢れ出すオタク臭がつらいというか…。即無効化しました。ユーティリティからパターンを変更できるようですが、そもそも光る意味がありません。このLEDを意味もなく光らせる文化死滅してくれ。(LEDが意味を持っている場合は別)<br /><br /><h3>いつもの起動Beep音</h3><br />　Supermicro特有の「pi,pipi……pi!」という起動Beepがあります。これはX8(X9?)シリーズくらいからの伝統で、サーバーボードで散々聞いてきた音です。2ソケットマザーでメモリスロットを24本も持っているような板だと、メモリそれぞれは問題なくてもスロットの場所によって何故か起動できなかったりします。そして総当たりでメモリを認識できるスロットを探すわけですが、起動する組み合わせをようやく見つけたときにこの起動音がするので、個人的にこの音を聞くととても安心と気分の高揚を覚える程度には毒されています。ジャンパーピンで無効化できますが、有効のままにしています。<br /><br /><h3>何故か持っているシリアルポートとSATA-DOM用電源コネクタ</h3><br />　何故かシリアルのピンヘッダーをもっているので、汎用のCOMブラケットを接続するとRS232-Cが使えます。ゲーミングなんちゃらを求める人のうちどれだけの人がCOMを求めるのでしょうか。ちなみにCOMを持っているとWindbgなどの診断時にとても役に立つのでありがたいです。<a href="https://www.supermicro.com/products/nfo/SATADOM.cfm?mlg=3" >SATA-DOM用電源コネクタ</a>については、「これいる??」という感想です。NASやPCルーターを作るときには欲しくなりますが、普段はまずいらないと思います。ゲーミングなんちゃらと謳ってる割には特定方向の需要を満たし過ぎではないですかね…。方向性が迷子になっている感じがあります。(が一部の人(主に自分)にはありがたい構成です。)<br /><br /><h3>何故か持っているPS/2コネクタとWindows7対応</h3><br />　BIOS上になぜかWindows7のインストールに対応するための項目があります。内容としてはUSB3.0を2.0のまま使う(EHCIからxHCIのハンドオフを行わない)という内容です。PS/2コネクタもその絡みで持っているのだと思いますが、そもそもサポートマトリックスにはWin7はないので自己責任で試す際のアシスタントとして使う程度のものみたいです。今からWin7を最新ハードにクリーンインストールする人がゲーミングなんちゃらを求める層にどれだけいるのか不明ですが…。<br /><br /><h2>セットアップ</h2><br />　今回の構成は以下のようになりました<br /><h3>CPU</h3><br />　今回はCPUに9600Kを使用しました。それ以上になると、デスクトップ用途ではそこまでコア数がいらないという経験則と、OCしたときにコア数が少ないほうが高クロックにしても発熱が少ない、及び価格的に一番お買い得という理由でこれにしました。だったら3235いらないんじゃ?と言われたらPCIレーン数とメモリ帯域以外はそうなんですが、同世代の3223と3225と3235と並べると3235がお買い得感あるので…。W-3235を考えていたのでCPUもM/Bもかなり安く感じてしまいました。<br /><h3>メモリ</h3><br />　メモリは手元に16GBが2本あったので、それと今回32GBのRAMを2本購入したので合計96GBになりました。32GBを4本買っても良かったのですが余らせるのももったいないので既存のものも使うことにしました。<br /><br /><a href=images/P2390466_R.JPG class=lb><img src=images/P2390466_R.JPG width=500px></a><br><br /><h3>グラボ</h3><br />　今使っている1080をそのまま使います。2080TIほしい<br /><h3>ファームウェア更新</h3><br />　UEFI上にファームウェア更新という項目はあるのですが、まずそこからやろうとすると以下のように怒られます<br /><br /><a href=images/biosup1.png class=lb><img src=images/biosup1.png width=500px></a><br><br />　JPMEと言われ、なんとなくMEファームウェアのジャンパピンかなと予測がついたのでそこまでハマりませんでしたが、そんな経験のない人にはいきなり難問です。そしてJPME2のジャンパを切り替えて再度実行したのですが、バージョン1.0bから1.0cにアップデートしようとしても何故か反応しませんでした(MEファームウェアが同時に更新されるFWはだめっぽい?)。マニュアルの手順を見るとUEFIのシェルから実行しろと書かれていたので言われたとおりUEFIのシェルから実行したところ、成功しました。<br /><br /><a href=images/biosup2.png class=lb><img src=images/biosup2.png width=500px></a><br><br />　「いやーうちの製品買うような層はオタクしかいないからGUIが動かなくてもいいっしょwwwwwwww」という判断があったかどうかは知りませんが、これも初心者の心を折るには十分な儀式だと思います。特に今のUEFIなんかはネットワークを有効にしているとOS不要でネットワークから新しいFWを取得し、そこからアップグレードできるためほぼ何も考えずに済むので、そこから始めた人にとってはいきなりコマンドラインというのは十分に初見殺しですね。<br />　個人的にはDOSの起動ディスクを作らなくてもオンボードでUEFIのシェルが上がるので楽だと思いました。鍛えられすぎているせいもありますが。というか動かないなら項目作らないでくれ…。ちなみに昔からの伝統のSUPER.ROMによるエマージェンシーリカバリーにも対応しているようです。過去に何回かお世話になった実績があるので、万が一でも安心です。<br /><br /><h3>ハマリポイント</h3><br />　今回、起動ドライブにU.2のMicron 9100MAXを使おうとしたのですが、インストールはできるものの起動ドライブとしては使えませんでした。SandiskのSkyHawkでは起動できたので、古いU.2ドライブについては起動を考慮されていないのでしょう。<br /><br /><h2>環境移行</h2><br />　OSをまっさらな状態にしてそこから必要なものだけ入れていこうかと思いましたが、それが思っていた以上にめんどくさかったので、普段取得しているVeeam backupのイメージ(X9DAiの壊れかけのOSイメージ)を一旦SATA-SSDにコピーし、そこからWindowsのISOをマウントして1903までアップグレードしました。そのタイミングで古いWindowsはWindows.oldになり、システムに必要なドライバやコンポーネントそのものは新しくなるので、システムの整合性は直ります。<br /><br />　ただ、SATAのSSDにクローンしてから1903に上げるとバージョンが上がったときに接続されているドライバのみが起動時に読み込まれるようになる(ドライバ周りがリセットされる)ようで、SATAのSSDだけつないだ状態のデータをnvmeにクローンしたところ失敗しました。<br />　そのため、一旦データドライブとしてnvmeをシステムに接続してOSの起動時にnvmeドライバを読み込むように教え、その後OSイメージをnvmeにクローンするとうまくいきました。SATA→M.2への移行のときも同じテクニックが使えるかもしれません。<br /><br /><h2>OverClocking</h2><br />　せっかくOCに対応しているのでOCしてみました。最初はM/Bのプリセットで持っている5.2GHzというのを選択してみましたが、コア電圧1.45Vやその他電圧もりもりで、起動できるものの空冷ヒートシンクだと負荷をかけた瞬間に100℃を軽く超えOHでシャットダウンされました。その後簡易液冷キットを購入して試したところ、熱問題はギリギリクリアできましたが、やはり5GHzより上になにかの壁があるようでした。<br /><br />　5GHzは1.32V+LLC Lv1で安定するのに対して5.2GHzでは1.45Vも必要になるので、発熱と消費電力的に5GHzで運用することにしました。もう少し詰めれば5.1や5.2のいいところが見つかるのかもしれませんが、いかんせん安定性のテストに時間がかかるので妥協しました。<br /><br />　このときにWindowsを入れてOCCTやPrime95などを起動していたのですが、それだとクラッシュしたときにファイルシステムが壊れることがあるので、まずはドライブをすべて外し、USBから<a href="https://www.memtest86.com/" >MemTest86</a>を起動し、テストの選択でTest3とTest6-7が通ってからWindowsに切り替えることをおすすめします。設定が甘いとMemTestのテスト6などでフリーズ・再起動が起きます。その後のOCが安定したかどうかの判断として、Prime95をいきなりFFTサイズ8192位から始めるとすぐに結果がわかります。逆にこれを30分くらいパスしたらもう大丈夫なのでは、と思います。<br /><br /><a href=images/p95-oc.png class=lb><img src=images/p95-oc.png width=500px></a><br><br />　ヒートシンクにはCoolerMasterのMasterLiquid Lite 120を使いましたが、ラジエーターのファンを前後2枚取り付けているのが功をなしているのか5GHzでPrime95をかけ続けても熱暴走は起きませんでした。なのでこれで常用しようと思います。殻割りしてヒートスプレッダ交換などをすればもっと冷えると思いますが、そこまでする気力は起きませんでした。<br /><br /><a href=images/9600K-OC.jpg class=lb><img src=images/9600K-OC.jpg width=500px></a><br><br /><br /><h2>ネットワーク周り</h2><br />　ネットワークにはAQtion AQN-107とIntel 219-Vの2系統を備えています。以前の構成でもMellanoxのConnectX2-ENをLAN、I210を内部マネジメント系として使っていたので、ほぼそのままその構成で行けそうです。ただ、10G-Tネイティブのスイッチはないので、mikrotikの<a href="https://mikrotik.com/product/s_rj10" >S+RJ10</a>でSFP+変換をかませることにしました。これ結構発熱するのでちょっと不安なんですけどね…。スイッチからは10G固定で見えるのに10G-T側は5Gや2.5Gや1Gでもリンクするという謎技術です。溢れた分はどう制御してるんですかね?まあ安いので1つ2つ持っておくのはおすすめです。<br /><br /><a href=images/P2390473_R.JPG class=lb><img src=images/P2390473_R.JPG width=500px></a><br><br /><br />　また、AQN-107の内部接続がPCIE 3.0のx2接続(計算上は16Gbpsですが)、及び10G-Tを使うというのがどうなのか、というのが不安でしたが、とりあえずは問題ないようです。距離も3Mくらいしかないのでその距離ならそのへんのケーブルでも大丈夫そうです。<br /><br /><a href=images/AQN107.png class=lb><img src=images/AQN107.png width=500px></a><br><br /><br />　一つハマったのが、IntelのPROset/Advanced Networking Servicesを入れれば、昔はNICの「構成」タブからVLAN/Teamingの項目に飛べたのですが、1903だとその項目がなく、PowershellのAdd-IntelNetVLAN コマンドレットから設定する必要がありました。どうも1809あたりからそうなったようですが、謎です。ただ、こちらのほうがまとめて作れるので楽でした。<br /><blockquote> PS C:\WINDOWS\system32&gt; Get-IntelNetAdapter<br /><br />Location        Name                                                           ConnectionName            LinkStatus<br />--------        ----                                                           --------------            ----------<br />0:31:6:0        Intel(R) Ethernet Connection (7) I219-V                                                  1.00 Gbps ...<br />8:0:0:0         Aquantia AQtion 10Gbit Network Adapter                         LAN                       10.00 Gbps...<br /><br />PS C:\WINDOWS\system32&gt; Add-IntelNetVLAN -ParentName &quot;Intel(R) Ethernet Connection (7) I219-V&quot; -VLANID &quot;0,2,3,6&quot;</blockquote><br /><br /><h2>安定性</h2><br />　台風の後のゲリラ雷雨でUSP保護してなかったためシャットダウンされましたが、それ以外は5GHz運用で問題ないです。ゲームも連続で6時間ほどやりましたが大丈夫でした。<br /><br /><h2>総評</h2><br />　総じてオタク向けです。POSTは一般的なuEFIマザーに比べ長い、OC項目は複雑、ファームのアップデートは(なれてない人にとっては)複雑、etc…。ただ、ブロックダイアグラムを見てそのキモさにシビレたり、フルサイズDPポートが2ポート必要だったり、x8接続の拡張ボードを数本接続する必要があったり、U.2ドライブを使いたいという需要がある人にはおすすめです。オンボードでU.2ドライブや10G問題やサブディスプレイ問題を解決してしまったので、結局接続されているボードはグラボだけになりました。とてもスッキリしました。<br /><br /><a href=images/IMG_20190908_054432.jpg class=lb><img src=images/IMG_20190908_054432.jpg width=500px></a><br><br />　U.2の起き方が雑とか管理面で上下逆にしてるとか色々突っ込みどころはありますが動いて冷えればいいのです。しかし、この構成をしたがる層ってどう見てもゲーミングなんちゃらを欲しがる層じゃないよな…と強く思います。HW的に詳しくない、自作歴がそこまで長くない、という人にはおすすめしません。ですが、安定性も悪くなく、一部の層にとってはどストライクな構成なので、そういった方には他に選択肢がないのでおすすめです。<br /><br />以上]]></description>
	</item>
</rdf:RDF>
