サーバのメンテを完了しました。朝方にやってたら途中で眠くなってしまったので一旦寝て作業再開、結構時間かかってしまいました。
以下一人言。
今回のメンテの目的は FeedBack の性能改善としての ディスク I/O 性能の向上と、I/O の分散です。今まで有効になっていなかったディスクの UDMA を有効にすること、MySQL の物理領域と Namazu のインデックスを保存する領域を別のディスクに配置し、I/O を分散させることが主なところでした。
UDMA が有効になっていなかった、というのは DupliDisk というハードウェア RAID コントローラを使っていたのが原因です。この DupliDisk、公称では UDMA 対応なのですがこれを使うと Linux カーネルが 80 芯の U-ATA ケーブルを 40 芯の E-IDE ケーブルとご認識してしまうというバグがあました。
[naoya@mary naoya]$ cat /proc/ide/via
----------VIA BusMastering IDE Configuration----------------
Driver Version: 3.35-ac
South Bridge: VIA vt82c686a
Revision: ISA 0x1b IDE 0x6
Highest DMA rate: UDMA66
BM-DMA base: 0xd000
PCI clock: 33.3MHz
Master Read Cycle IRDY: 0ws
Master Write Cycle IRDY: 0ws
BM IDE Status Register Read Retry: yes
Max DRDY Pulse Width: No limit
-----------------------Primary IDE-------Secondary IDE------
Read DMA FIFO flush: yes yes
End Sector FIFO flush: no no
Prefetch Buffer: yes yes
Post Write Buffer: yes no
Enabled: yes yes
Simplex only: no no
Cable Type: 40w 40w
-------------------drive0----drive1----drive2----drive3-----
Transfer Mode: DMA PIO PIO PIO
Address Setup: 30ns 120ns 120ns 120ns
Cmd Active: 90ns 90ns 480ns 480ns
Cmd Recovery: 30ns 30ns 480ns 480ns
Data Active: 90ns 330ns 330ns 330ns
Data Recovery: 30ns 270ns 270ns 270ns
Cycle Time: 120ns 600ns 600ns 600ns
Transfer Rate: 16.6MB/s 3.3MB/s 3.3MB/s 3.3MB/s
こんな具合です。サポートに何度かたずねてみましたが返答がなくて、しょうがないので UDMA オフで妥協して使っていましたが、FeedBack の負荷があがってきたことや Namazu のインデックスが大きくなってきたことで、そうも言ってられない状況になりまして、今回 RAID コントローラに見切りをつけました。
ミラーリングをやめてしまうことのリスクは大きいですが、とりあえず DB の dump を定期的にとっておけば最悪でもなんとかなるだろうという方針でいくことにしました。
これで UDMA が有効になり I/O 性能が数倍に! と思ったのですが、Linux 起動時に
Mar 20 06:38:49 mary kernel: hda: IC35L040AVVA07-0, ATA DISK drive
Mar 20 06:38:49 mary kernel: hda: DMA disabled
Mar 20 06:38:49 mary kernel: blk: queue c0304780, I/O limit 4095Mb (mask fffffff)
Mar 20 06:38:49 mary kernel: hdc: IC35L040AVVN07-0, ATA DISK drive
Mar 20 06:38:49 mary kernel: hdc: DMA disabled
Mar 20 06:38:49 mary kernel: blk: queue c0304bcc, I/O limit 4095Mb (mask fffffff)
とかのたまわれて、有効にならない御様子。ケーブルは 80 芯で認識していたのですが。どうもサーバのマザーボードのチップセット(via82xxx)があやしいということで色々調べていると、新しいカーネルでこのチップセットの UDMA をサポートしたみたいな検索結果がぼちぼちあったので、カーネルを再構築して 2.4.25 に上げました。
結果、先のメッセージは消えて
[naoya@mary naoya]$ sudo hdparm -i /dev/hda
/dev/hda:
Model=IC35L040AVVA07-0, FwRev=VA2OA50K, SerialNo=VNC220A2G5U3UC
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=52
BuffType=DualPortCache, BuffSize=1863kB, MaxMultSect=16, MultSect=16
CurCHS=4047/16/255, CurSects=16511760, LBA=yes, LBAsects=80418240
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 *udma4 udma5
AdvancedPM=yes: disabled (255) WriteCache=enabled
Drive Supports : ATA/ATAPI-5 T13 1321D revision 1 : ATA-2 ATA-3 ATA-4 ATA-5
と UDMA4 が有効になりました。(マザーが古くて UDMA5 には未対応)
気になる I/O 性能ですが、以前は
[naoya@mary naoya]$ sudo /sbin/hdparm -t /dev/hda
/dev/hda:
Timing buffered disk reads: 64 MB in 4.57 seconds = 14.00 MB/sec
と 14.00 MB/sec と大変悲しいことになっていましたが、UDMA 有効化で
[naoya@mary naoya]$ sudo hdparm -t /dev/hda
/dev/hda:
Timing buffered disk reads: 64 MB in 1.42 seconds = 45.07 MB/sec
45.07 MB/sec と期待どおりの性能が出ています。3 倍速くなりました。
ミラー用のディスクをフォーマットしなおしてパーティションを切り、Namazu のインデクスを移動させ、DB のバックアップを cron に仕込んで作業完了です。
幾分レスポンスはよくなると思います。根本的に解決するには、インデクサとウェブサーバを別々のマシンに分けるのが一番なのですが自宅に二台はちょっときつい。(*´Д`)
引越しとかしたいので、ホスティングと契約してデータセンターに移管したいところなのですが...金がない! いや、むしろ移管作業がめんどくさい。でもディスク交換したりとかいう作業なんてもっとめんどくさいだろ!! という突っ込みもありそうです。
一方、なにげに一年ちょっと前に作った Pentium 4 2.4GHz のデスクトップマシンを使わなくなってきたので Fedora Core をインストールしてみました。このマシン、ファンが色々ついてて結構五月蝿いのであれですが、スピードは今のサーバと段違い。静音化してこっちに移行させようかなとか目下画策中...。
激しく Geek な話題でした。