OpenBSD/sgi MPカーネルの性能の話
序論
OpenBSD/sgiのリリース6.0でIP27カーネルを使う一部の機種(TezroやOnyx350やOrigin350)にシングルノード限定ではあるものの、Multiprocessorサポートが入りました。
https://www.openbsd.org/sgi.html
Origin350を始めとしたNUMA機のカーネルのSMP化は@syuu1228さんが過去に挑戦されていた実績があります。
@syuu1228さんはIP30カーネルを使う機種(Octane、Octane2)のカーネルのSMP化を実装された実績があります。
@MiodVallatさんと性能テストをするという約束をしていたのですが、すっぽかしていたので、とても時間が経ってしまいましたが、(半年ほど遅れてしまいましたが)テストを行いました。
@nullnilaki don't forget to send a dmesg to dmesg@ !
— Ghost of Arches Past (@MiodVallat) 2016年5月27日
とりあえずdmesg
SGI Tezro R16000 800 MHz x 4
SGI Tezro - Wikipedia
# dmesg [ using 632960 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2016 OpenBSD. All rights reserved. http://www.OpenBSD.org OpenBSD 6.0 (GENERIC-IP27.MP) #112: Thu Jul 28 18:21:48 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP27.MP real mem = 4294967296 (4096MB) rsvd mem = 20643840 (20MB) avail mem = 4205133824 (4010MB) warning: no entropy supplied by boot loader mainbus0 at root: Origin 350 cpu0 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu0: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way clock0 at mainbus0 nasid 0: int 5 cpu1 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu1: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way cpu2 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu2: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way cpu3 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu3: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way spdmem0 at mainbus0 nasid 0 dimm 0: 1GB DDR SDRAM registered ECC PC2000CL2.5 spdmem1 at mainbus0 nasid 0 dimm 1: 1GB DDR SDRAM registered ECC PC2000CL2.5 spdmem2 at mainbus0 nasid 0 dimm 2: 512MB DDR SDRAM registered ECC PC1600CL2.5 spdmem3 at mainbus0 nasid 0 dimm 3: 512MB DDR SDRAM registered ECC PC1600CL2.5 spdmem4 at mainbus0 nasid 0 dimm 4: 512MB DDR SDRAM registered ECC PC1600CL2.5 spdmem5 at mainbus0 nasid 0 dimm 5: 512MB DDR SDRAM registered ECC PC1600CL2.5 xbow0 at mainbus0 nasid 0: PXBow revision 3 xbridge0 at xbow0 widget 15: PIC revision 3 xbpci0 at xbridge0 bus 0: 66 MHz PCI bus pci0 at xbpci0 bus 0 iof0 at pci0 dev 0 function 0 "SGI IOC4" rev 0x4f: irq 0, xbow irq 62 com0 at iof0 base 0x380: ns16550a, 16 byte fifo com0: console com1 at iof0 base 0x388: ns16550a, 16 byte fifo com2 at iof0 base 0x390: ns16550a, 16 byte fifo com3 at iof0 base 0x398: ns16550a, 16 byte fifo iockbc0 at iof0 base 0x200 dsrtc0 at iof0 base 0x80000: DS1742W ppb0 at pci0 dev 1 function 0 "TI PCI2050" rev 0x01 pci1 at ppb0 bus 1 envy0 at pci1 dev 2 function 0 "IC Ensemble Envy24PT/HT Audio" rev 0x01: irq 1, xbow irq 61 envy0: unknown 1724-based card, 2 inputs, 8 outputs audio0 at envy0 midi at envy0 not configured qlw0 at pci0 dev 2 function 0 "QLogic ISP12160" rev 0x06: irq 2, xbow irq 60 qlw0: nvram corrupt qlw0: firmware rev 10.4.41, attrs 0x0 scsibus0 at qlw0: 16 targets, initiator 0 sd0 at scsibus0 targ 1 lun 0: <SGI, ST373307LC, 2741> SCSI3 0/direct fixed serial.SGI_ST373307LC_3HZ6HQZS00007421QXB8 sd0: 70007MB, 512 bytes/sector, 143374744 sectors scsibus1 at qlw0: 16 targets, initiator 0 bge0 at pci0 dev 3 function 0 "Broadcom BCM5701" rev 0x15, BCM5701 B5 (0x105): irq 3, xbow irq 59, address 08:00:69:13:ea:b8 brgphy0 at bge0 phy 1: BCM5701 10/100/1000baseT PHY, rev. 0 xbpci1 at xbridge0 bus 1: 33 MHz PCI bus pci2 at xbpci1 bus 0 "SGI Rad1" rev 0xd0 at pci2 dev 0 function 0 not configured ioc0 at pci2 dev 1 function 0 "SGI IOC3" rev 0x01 onewire0 at ioc0 owserial0 at onewire0 "16kb EPROM" sn 00000059b2e0 owserial0: "PCI_SIO_UFC" p/n 030-1657-003, serial MNC900 ioc0: superio irq 1, xbow irq 57 com4 at ioc0 base 0x20178: ns16550a, 16 byte fifo com5 at ioc0 base 0x20170: ns16550a, 16 byte fifo qlw1 at pci2 dev 2 function 0 "QLogic ISP1240" rev 0x01: irq 2, xbow irq 56 qlw1: firmware rev 8.15.0, attrs 0x0 scsibus2 at qlw1: 16 targets, initiator 7 scsibus3 at qlw1: 16 targets, initiator 7 xbridge1 at xbow0 widget 11: PIC revision 3 xbpci2 at xbridge1 bus 0: 133 MHz PCIX bus pci3 at xbpci2 bus 0 qla0 at pci3 dev 0 function 0 "QLogic ISP2312" rev 0x02: irq 0, xbow irq 54 firmware load failed qla0: firmware load failed qla1 at pci3 dev 0 function 1 "QLogic ISP2312" rev 0x02: irq 4, xbow irq 54 firmware load failed qla1: firmware load failed xbpci3 at xbridge1 bus 1: 133 MHz PCIX bus pci4 at xbpci3 bus 0 qla2 at pci4 dev 1 function 0 "QLogic ISP2312" rev 0x02: irq 1, xbow irq 53 firmware load failed qla2: firmware load failed qla3 at pci4 dev 1 function 1 "QLogic ISP2312" rev 0x02: irq 5, xbow irq 53 firmware load failed qla3: firmware load failed odyssey0 at xbow0 widget 12: Odyssey device has not been setup by firmware! "Kona" revision 0 at xbow0 widget 13 not configured vscsi0 at root scsibus4 at vscsi0: 256 targets softraid0 at root scsibus5 at softraid0: 256 targets boot device: sd0 root on sd0a (ff91e3200f2e2df7.a) swap on sd0b dump on sd0b cpu3 launched cpu2 launched cpu1 launched #
ちゃんと4CPU認識されています。
ベンチマーク1
せっかくなのでGENERIC-IP27.MPをコンパイルする時間をMPカーネルとUPカーネルで計ってベンチマークをとってみました。
MPカーネルの場合
make -j 4 text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m05.77s real 24m17.81s user 2m02.76s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m00.37s real 24m15.41s user 2m00.92s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m01.00s real 24m15.54s user 1m59.89s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m00.40s real 24m15.03s user 1m59.35s system ----------------------------------------------------------------------- make -j 1 text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m36.97s real 24m13.87s user 1m22.54s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m35.14s real 24m13.25s user 1m23.49s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m36.12s real 24m13.78s user 1m23.73s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m36.16s real 24m12.82s user 1m23.91s system
UPカーネルの場合
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m09.58s real 26m12.86s user 1m38.79s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m01.38s real 26m17.84s user 1m38.67s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m04.14s real 26m17.53s user 1m40.29s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m03.50s real 26m14.39s user 1m41.37s system
考察1
★このようにMPカーネルを使った場合、make -j 1とmake -j 4では処理にかかる時間が半分以下になっていることがわかります。
★また意外なことに、UPカーネルでmakeを行った場合とMPカーネルでmake -j 1を行った場合では、MPカーネルのほうが性能が良いことがわかります。(CPUを1個しか使わない場合では、MPカーネル特有のオーバーヘッドがかからないぶん、UPカーネルのほうが性能が良いのでは?と予測していたので意外でした。)
ベンチマーク2
せっかくなので他の機種でもGENERIC-IP27.MPをコンパイルする時間を計ってベンチマークをとってみました。
SGI Fuel R16000 900 MHz x 1
OpenBSD 6.0 (GENERIC-IP27) #721: Thu Jul 28 16:32:25 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP27 real mem = 4294967296 (4096MB) rsvd mem = 20643840 (20MB) avail mem = 4205166592 (4010MB) warning: no entropy supplied by boot loader mainbus0 at root: Fuel cpu0 at mainbus0 nasid 0: R16000 CPU rev 3.0 900 MHz, R16000 FPU rev 3.0 cpu0: cache L1-I 32KB D 32KB 2 way, L2 8192KB 2 way
IP27カーネルを使用 1CPUマシンなのでUPカーネルのみ
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 25m48.50s real 20m36.65s user 0m40.77s system
SGI O2+ R5000 300 MHz x 1
OpenBSD 6.0 (GENERIC-IP32) #639: Thu Jul 28 17:34:01 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP32 real mem = 671088640 (640MB) rsvd mem = 7020544 (7MB) avail mem = 632971264 (603MB) warning: no entropy supplied by boot loader mainbus0 at root: O2 cpu0 at mainbus0: PMC-Sierra RM52X0 CPU rev 10.0 300 MHz, RM52X0 FPC rev 10.0 cpu0: cache L1-I 32KB D 32KB 2 way, L2 1024KB direct
IP32カーネルを使用 1CPUマシンなのでUPカーネルのみ
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 139m49.04s real 127m17.12s user 10m24.63s system
SGI POWER Indigo2 R8000 75 MHz x 1
SGI Indigo² and Challenge M - Wikipedia
OpenBSD 6.0 (GENERIC-IP26) #239: Thu Jul 28 16:08:43 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP26 real mem = 536870912 (512MB) rsvd mem = 1064960 (2MB) avail mem = 526106624 (501MB) mainbus0 at root: POWER Indigo2 R8000 cpu0 at mainbus0: MIPS R8000 CPU rev 0.0 75 MHz, R8010 FPU rev 0.1 cpu0: cache L1-I 16KB D 16KB direct, L2 2048KB direct
IP26カーネルを使用 1CPUマシンなのでUPカーネルのみ
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 240m49.90s real 222m52.90s user 15m03.00s system
考察2
★FuelとTezroは同じIP27カーネルを使ってテストを行ったのですが、Tezroの800Mhに比べてFuelの900Mhzは処理がかなり高速なことがわかります。これはTezroが4MBという2次キャッシュを持っているのに比べ、Fuelが倍の8MBという巨大なキャッシュを持っていることが原因だと思われます。
★75Mhzというクロックの割にPOWER Indigo2 R8000の性能が良いことがわかります。R8000も2MBという巨大なキャッシュを持っているので、キャッシュが性能を発揮しているのかもしれません。
思ったこと
考察2でも述べたようにFuelとTezroは同じIP27カーネルを使うのですが、FuelにOSをインストールする時には、MPカーネルが選択肢に出ないことに気づきました。これについて感想を述べたところ@ao_kenjiさんから以下のようなアドバイスをいただきました。
むむっ...
— Lucky owner/capturer (@nullnilaki) 2016年10月22日
OpenBSD/sgiのインストーラ、SMPマシンだとインストールするカーネルの選択肢にbsd.***とbsd.mp.***が出てきて、UPマシンだとbsd.***しか出ないのか...
賢い?のか?https://t.co/UWgUuyUAaE
@nullnilaki 普通に使うにはUPマシンでMPカーネルを使う必要がないから:-)
— Kenji Aoyama (@ao_kenji) 2016年10月23日
「余分なものは入れない、自動起動しない。必要なものは勉強してから入れたり設定したりしてね。ドキュメント用意しておくから。」っていうスタンスじゃないかと思います。
マルチノードのNUMA機のサポートってどうするんでしょうか?@tsutsuiiさんとこのような話をしたことがありますが、メモリのアクセス速度に差があるという点では一致しているものの、そもそもアーキテクチャがまったく違う次元の話でしょうし... 教えて、偉い人
@nullnilaki 私が最初に見たのは mvme68k で、キャッシュが効かないVMEバス上の増設メモリは優先度したにするというコードでした。あとは atari と x68k でも同様に速いメモリを優先しているはずです。他はちゃんと見ていません
— Izumi Tsutsui (@tsutsuii) 2014年10月26日