ZBOX nano VD01のHDDが遅い (4)
さらにtsutsuiさんからdmesgのwd0が表示する内容でUDMAに関する表示が出ているはずなので確認してみてはどうか、というアドバイスを頂いたので早速確認。
まずは、UDMA 0 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 0) です。
なるほど。たしかに、変わっていますね。
これで/sys/dev/pci/viaide.c#604
うーん、この辺までくると、さっぱり中身がわからなくなってきしたが、何となくUDMAが6での転送に失敗したらUDMA 5に落とされて0x01が使われて... といったfall backに使われるんでしょうかねぇ。
ということで、ドライバとしてもUDMAのモードを意識した実装だということがわかった (ような気がする) ので、すっきりしました。
話は変わりますが、http://nxr.netbsd.orgってほんと便利ですよね。
まずは、UDMA 0 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 0) です。
wd0 at atabus0 drive 0 wd0: <WDC WD1600BEVT-24A23T0> wd0: drive supports 16-sector PIO transfers, LBA48 addressing wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors wd0: 32-bit data port wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133) wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)次はUDMA 6 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 6) の場合です。
wd0 at atabus0 drive 0 wd0: <WDC WD1600BEVT-24A23T0> wd0: drive supports 16-sector PIO transfers, LBA48 addressing wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors wd0: 32-bit data port wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133) wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA)ほとんど同じですが、最後の行が違いますね。比べてみましょう。
UDMA | メッセージ |
---|---|
0 | wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA) |
6 | wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA) |
これで/sys/dev/pci/viaide.c#604
602 sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 603 sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 604 sc->sc_wdcdev.sc_atac.atac_set_modes = via_setup_channel; 605 sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 606 sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS;から/sys/dev/pci/viaide.c#via_setup_channelが呼ばれ、759行目でUDMA 6としての設定をレジスタにセットしているようですね。
753 case PCI_VENDOR_VIATECH: 754 if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 6) { 755 /* 8233a */ 756 udmatim_reg |= APO_UDMA_TIME( 757 chp->ch_channel, 758 drive, 759 via_udma133_tim[drvp->UDMA_mode]); 760 } else if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 5) {via_udma133_timって何かと見てみると/sys/dev/pci/pciide_apollo_reg.h#149に次のように書かれています。
149 static const int8_t via_udma133_tim[] __unused = 150 {0x07, 0x07, 0x06, 0x04, 0x02, 0x01, 0x00};先のdmesgのとおりdrvp->UDMA_modeは6ですから、えーと、0x00が設定されるってことですね。
うーん、この辺までくると、さっぱり中身がわからなくなってきしたが、何となくUDMAが6での転送に失敗したらUDMA 5に落とされて0x01が使われて... といったfall backに使われるんでしょうかねぇ。
ということで、ドライバとしてもUDMAのモードを意識した実装だということがわかった (ような気がする) ので、すっきりしました。
話は変わりますが、http://nxr.netbsd.orgってほんと便利ですよね。
コメント(0件)
- TB-URL http://www.tokuda.net/diary/adiary.cgi/0780/tb/
ZBOX nano VD01のHDDが遅い (3)
前回の日記を書いて、さらにtsutsuiさんからコメントを頂きました。
どうやら、昔のVIAチップの設計がイマイチで、それを回避するコードが入っていたそうです。
最近のVIAチップはそういう回避コードは不要になっているにもかかわらず、回避コードの下に慣習的に各々のVIA IDE個別の設定が追加されていったようです。
今回のケースではその回避コードが逆に悪さをしてうまく動いていないということですね。むしろ、最近のチップがちゃんと動いているのか心配になってしまいます。
じゃぁ、回避コードのルートに乗っかる前に、さっさと処理をしてしまえばよいということで、次のような修正を加えることにしました。
それでは、dbenchしてみましょう!
dbehcnの数字が60MB/s程度だとして、これが何を意味するのかは他の結果と比較してみなければなりませんが、とても乱暴にUDMA 4 (66MB/s) 相当の速度と仮置きしておくことにしましょう。
せっかくUDMAを0から6にしたのに効果は得られていないようです。おかしいですね。
仮説としては三つくらいでしょうか。
SATAコントローラがPATAコンパチモードで動くとUDMAの指定はともかく、そこそこの速度で動いてくれるという動作なのかもしれません。
じゃぁ、SATAで動かせばいいじゃないかという話になるのですが、実は試行錯誤をしていた段階で
三つ目の仮説であるdbenchどうなの、という話は確かにあって、ベンチマークプログラムの選択はなかなか奥が深いですね。
このようなディスクの話であればiozoneが良いのではないかとお勧めされたりしているのですが、iozoneのオプションを見て、そっと閉じる、という情けない状態だったりします。
いくつか宿題は残っていますが、一定の結論がでたのでsend-prに向けて準備を進めたいと思います。
どうやら、昔のVIAチップの設計がイマイチで、それを回避するコードが入っていたそうです。
最近のVIAチップはそういう回避コードは不要になっているにもかかわらず、回避コードの下に慣習的に各々のVIA IDE個別の設定が追加されていったようです。
今回のケースではその回避コードが逆に悪さをしてうまく動いていないということですね。むしろ、最近のチップがちゃんと動いているのか心配になってしまいます。
じゃぁ、回避コードのルートに乗っかる前に、さっさと処理をしてしまえばよいということで、次のような修正を加えることにしました。
--- ./sys/dev/pci/viaide.c.orig 2011-12-29 05:25:40.000000000 +0000 +++ ./sys/dev/pci/viaide.c 2012-03-10 12:43:07.00000000 @@ -464,6 +469,11 @@ interface = PCIIDE_INTERFACE_BUS_MASTER_DMA | PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1); break; + case PCI_PRODUCT_VIATECH_VX900_IDE: + aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev, + "VIA Technologies VX900 ATA133 controller\n"); + sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; + break; default: /* * get a PCI tag for the ISA bridge.起動すると期待どおりのメッセージが表示されました。
viaide0 at pci0 dev 15 function 0 viaide0: VIA Technologies VX900 ATA133 controller viaide0: bus-master DMA support present viaide0: primary channel configured to native-PCI mode viaide0: using ioapic0 pin 21 for native-PCI interrupt atabus0 at viaide0 channel 0 viaide0: secondary channel configured to native-PCI mode atabus1 at viaide0 channel 1やりましたね!
それでは、dbenchしてみましょう!
Throughput 60.1017 MB/sec 5 procsあれ?! おかしいな。もう一回。
Throughput 62.8053 MB/sec 5 procsおっ! 先ほどよりは良くなりましたね。って言っても前回の不完全パッチでも
Throughput 63.8846 MB/sec 5 procsということで、数値的にはほとんど変わらないという結果になりました。
dbehcnの数字が60MB/s程度だとして、これが何を意味するのかは他の結果と比較してみなければなりませんが、とても乱暴にUDMA 4 (66MB/s) 相当の速度と仮置きしておくことにしましょう。
せっかくUDMAを0から6にしたのに効果は得られていないようです。おかしいですね。
仮説としては三つくらいでしょうか。
- 不完全パッチでもUDMA 0ではなくUDMA 4相当が使われていた
- 今回の修正でもまだ不十分でUDMA 4相当で動いている
- 実はちゃんと動いているけどdbenchがかけるワークロードではUDMAの差が数字として現れない
SATAコントローラがPATAコンパチモードで動くとUDMAの指定はともかく、そこそこの速度で動いてくれるという動作なのかもしれません。
じゃぁ、SATAで動かせばいいじゃないかという話になるのですが、実は試行錯誤をしていた段階で
{ PCI_PRODUCT_VIATECH_VX900_IDE, 0, NULL, via_chip_map, },のところを
via_sata_chip_map_7,にして動かしてみたのですが、起動時にpanicしてそれ以降深く追っかけていなかったのです。せっかくのSATAコントローラなのですからSATAで動かしたいものですね。
三つ目の仮説であるdbenchどうなの、という話は確かにあって、ベンチマークプログラムの選択はなかなか奥が深いですね。
このようなディスクの話であればiozoneが良いのではないかとお勧めされたりしているのですが、iozoneのオプションを見て、そっと閉じる、という情けない状態だったりします。
いくつか宿題は残っていますが、一定の結論がでたのでsend-prに向けて準備を進めたいと思います。
1: 2012年03月10日(土) 午後3時53分
dmesgのドライブ側の行で
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(viaide0:0:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133) (
using DMA)
みたいな行が出ていると思うんですが、そこの表示は変わっているんじゃないかと。
速度についてはドライブ側の限界なのかもしれませんが、VX900について調べて
みないとすぐにはわかりませんね。
- TB-URL http://www.tokuda.net/diary/adiary.cgi/0779/tb/