Home

技術系のメモと日々の雑感

The total number of locks exceeds the lock table size

MySQL のスレーブでエラー出た。
show slave status を見ると Last_Error が

Error 'The total number of locks exceeds the lock table size' on query. Default database: 'hoge'. Query: 'CREATE TABLE fuga SELECT * FROM fugafuga'

となっている。
Slave_IO_Running は Yes だけど Slave_SQL_Running は No だ。
後で分かったんだけど、エラーが出ているのは2台あるスレーブのうちの1台だけだった。
ログを見たら

100817  7:33:07 [ERROR] Slave SQL: Error 'The total number of locks exceeds the lock table size' on query. Default database: 'hoge'. Query: 'CREATE TABLE fuga SELECT * FROM fugafuga', Error_code: 1206
100817  7:33:07 [Warning] Slave: The total number of locks exceeds the lock table size Error_code: 1206
100817  7:33:07 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000038' position 616542968

と出ていたので stop slave して start slave したら、ひとまずエラーは消えた。
でも Exec_Master_Log_Pos の値が変わらず、Read_Master_Log_Pos の値がどんどん離れていく。
そしてしばらくしたら再発。
一時的なエラーかと思ったけど、そうじゃないんだね。
情報を探してみると、innodb_buffer_pool_size の値が小さいときに出ることがあるらしい。
そういえば、とある事情でこっちのスレーブだけデフォルト値(8MB)を使っていたんだった。
値を増やしたら今度は大丈夫そう。
Seconds_Behind_Master が 687765 なんて値になっていたけど、少しずつ減っていっている。
このスレーブは InnoDB 関係のパラメータを全部見直して環境を作り直す予定だったんで、まぁ起こるべくして起きたエラーといったところか。
それにしても、定期的に show slave status をチェックする仕組みを入れておいてよかった〜。

CentOS と 3ware 8006-2LP

3ware 8006-2LP でミラーを組んで CentOS 5.4 を入れる機会があったので、気づいたことなどをメモ。
ドライバは勝手に入るので特に引っかかるところはなかった。
RAID0 にしろ RAID1 にしろ、インストーラでディスクが1本に見えているのが確認できたら大丈夫だろう。
他のサイトにも書かれている通り、付属の CD に入っている 3dmd は動かなかったので、メーカのサイトから最新版をダウンロードして入れた。
ちなみに Java 版でないとうまく入らなかった。

cd /tmp
wget http://www.lsi.com/DistributionSystem/AssetDocument/3DM2_CLI-Linux-9.5.3.zip
unzip 3DM2_CLI-Linux-9.5.3.zip
tar zxvf 3DM2_CLI-Linux-x86-9.5.3.tgz
chmod 700 setupLinux_x86.bin
./setupLinux_x86.bin -console

ところで、ここまで終われば ps で /usr/sbin/3dm2 が起動していることが分かる。
リブートしてもちゃんと立ち上がってくるんで、どこから呼ばれているのかと思ったら /etc/rc.d/init.d/tdm2 だった。
888 ポートで 3dm2 のページにも無事にアクセスできたので、ここらで dmesg を眺めてみよう。
関係があるメッセージは

3ware Storage Controller device driver for Linux v1.26.03.000-2.6.18RH.
3w-xxxx: AEN: ERROR: Unit degraded: Unit #0.
scsi0 : 3ware Storage Controller
3w-xxxx: scsi0: Found a 3ware Storage Controller at 0xe400, IRQ: 193.
  Vendor: 3ware     Model: Logical Disk 0    Rev: 1.2
  Type:   Direct-Access                      ANSI SCSI revision: 00
SCSI device sda: 976769007 512-byte hdwr sectors (500106 MB)
sda: Write Protect is off
sda: Mode Sense: 00 00 00 00
SCSI device sda: drive cache: write back, no read (daft) w/ FUA
sda: sda1 sda2 sda3
sd 0:0:0:0: Attached scsi disk sda
3w-xxxx: scsi0: Command failed: status = 0xc4, flags = 0x31, unit #0.
3w-xxxx: scsi0: AEN: INFO: Rebuild started: Unit #0.

といったところかな。
片方のディスクを外してリビルドのテストをしていたので degraded って出てる。
Command failed って出てるのもそのせいなのかな。
そのままひと晩放置して翌日見たら

3w-xxxx: scsi0: AEN: ERROR: Drive error: Port #1.
3w-xxxx: scsi0: AEN: ERROR: Rebuild failed: Unit #0.

見事にリビルドが失敗してた。
後で分かったことだけど、RAID を構成して起動した直後は Initialize がかなり長い時間走っていたから、どうやらこの処理中に片方の HDD を外してしまったらしい。
念のため Initialize が完了するのをちゃんと確認してからやり直してみたら

3w-xxxx: scsi0: AEN: INFO: Rebuild started: Unit #0.
3w-xxxx: scsi0: AEN: INFO: Rebuild complete: Unit #0.
3w-xxxx: scsi0: AEN: WARNING: SMART threshold exceeded: Port #0.

無事リビルド完了。
I/O の速度が出ないことを除けば問題なさそう。

Intel X25-V に CentOS を入れてみる

Intel X25-V知り合いが Intel X25-V を買ったというので興味本位で見せてもらった。
Windows の起動ドライブに使うそうだけど、その前に、せっかくなので Linux を入れてみたいと頼んだら構わないとのこと。
有難い!
知り合いの気が変わらないうちに CentOS 5.4 を入れてみた。
動きを見るだけなので、今回はパッケージグループすべてチェックを外してインストール開始。
Core 2 マシンで 3 分 30 秒程度で完了した。
この SSD は書き込みのスペックを落としているものらしいけど、それでも速いね。
起動してから dmesg を見ると

ata1.00: ATA-7: INTEL SSDSA2M040G2GC, 2CV102HD, max UDMA/133
ata1.00: 78165360 sectors, multi 16: LBA48 NCQ (depth 0/32)
ata1.00: configured for UDMA/133
  Vendor: ATA       Model: INTEL SSDSA2M040  Rev: 2CV1
  Type:   Direct-Access                      ANSI SCSI revision: 05
SCSI device sda: 78165360 512-byte hdwr sectors (40021 MB)

特に変わったところはないな。
S.M.A.R.T に対応しているのでそっちも確認しとこう。(以下抜粋)

Device Model:     INTEL SSDSA2M040G2GC
Serial Number:    ******************
Firmware Version: 2CV102HD
User Capacity:    40,020,664,320 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   7
ATA Standard is:  ATA/ATAPI-7 T13 1532D revision 1
Local Time is:    Fri Aug 13 23:01:55 2010 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

SMART Attributes Data Structure revision number: 5
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  3 Spin_Up_Time            0x0020   100   100   000    Old_age   Offline      -       0
  4 Start_Stop_Count        0x0030   100   100   000    Old_age   Offline      -       0
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       11
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       13
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       1
225 Load_Cycle_Count        0x0030   200   200   000    Old_age   Offline      -       51
226 Load-in_Time            0x0032   100   100   000    Old_age   Always       -       16350
227 Torq-amp_Count          0x0032   100   100   000    Old_age   Always       -       0
228 Power-off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       1009829193
232 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
233 Unknown_Attribute       0x0032   099   099   000    Old_age   Always       -       0
184 Unknown_Attribute       0x0033   100   100   099    Pre-fail  Always       -       0

温度は見れないんだね。
気にする必要がないってことなのかな。
あと、hdparm の出力も取っておいたので書いておく。

# hdparm -i /dev/sda
Model=INTEL SSDSA2M040G2GC          , FwRev=2CV102HD, SerialNo=******************
Config={ Fixed }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
BuffType=unknown, BuffSize=0kB, MaxMultSect=16, MultSect=?16?
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes:  pio0 pio3 pio4
DMA modes:  mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2
AdvancedPM=no WriteCache=enabled
Drive conforms to: ATA/ATAPI-7 T13 1532D revision 1:  ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6 ATA/ATAPI-7

おまけで軽くベンチマーク。

# hdparm -tT /dev/sda
/dev/sda:
Timing cached reads:   17040 MB in  2.00 seconds = 8537.19 MB/sec
Timing buffered disk reads:  564 MB in  3.01 seconds = 187.49 MB/sec

びっくりするような値じゃないけど、実際はランダムアクセスが速いので体感速度はかなりのものだった。
改めて知り合いに感謝。
長期テストよろしく。

watch と lsof のコンビネーション

デーモンの動きを見たいときによく利用するコマンド。

watch -n 1 'lsof -i -n -P | grep -v ^sshd | grep ESTA'

あんまり頻繁に使うものだから指が覚えてしまった。

cron ジョブの設定ミス

1 分間に複数回実行する cron ジョブの設定をミスしていた。

* * * * * /root/hoge.sh; sleep 30; /root/hoge.sh

としていたんだけど、この hoge.sh が 15 秒ぐらいかかっているのに気付かないまま数ヶ月・・・。
これだと、毎分 0 秒ぐらいに hoge.sh が開始されて、それが終わってから 30 秒待って、再び hoge.sh が開始されてしまう。
つまり、後の方の hoge.sh は 45 秒ぐらいから始まるので、0 秒前後に同時に 2 つ走っている可能性があるわけだ。
sleep の値を短くしてもいいけど、スクリプトの実行時間は一定ではないから、無理して 1 行にまとめない方がよさそう。

* * * * * /root/hoge.sh
* * * * * sleep 30; /root/hoge.sh

こう書くのが一般的なんだね。