KUSONEKOの見る世界

NASが遅いのでMySQLのデータをSSDに移動してみた

我が家のサーバは、NAS(Samba)としてだけではなく、ありとあらゆるサービスが動いている。

NAS内の大きなファイルを開こうとするときに、待ち時間が長い事が気になっており、MySQLが原因ではないかと疑っていた。(Wi-FIルータもかなり怪しいが)

中でも、ZabbixがMySQLを使用しており、ハードディスクのI/Oの大半を占めている。

今回、家で使われていなかった古いSSDをサーバにマウントし、MySQLのデータベースファイルをそこに移動したため、結果を記載しておく。

SSDのスペック

家で使われていなかったSSDは、CFDのCSSD-SM30NJという製品だ。

SATAⅡ SSD 30GB MLC Read 150 MB/s, Write90 MB/sで、今見ると非常にスペックが低い。
HDDの方が速いまである。

まあMySQL専用なので、問題無いだろう思い、サーバのSATAの空きポートに接続した。

SSDのマウント

サーバを起動させ、dmesgを確認してみる。

# dmesg
(snip)
[    5.056274] ata2: SATA max UDMA/133 abar m2048@0xc1415000 port 0xc1415180 irq 120
[    5.365207] ata2: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[    5.365905] ata2.00: ATA-8: SiliconHardDisk, 02.10102, max UDMA/100
[    5.365911] ata2.00: 62586880 sectors, multi 0: LBA 
[    5.367155] ata2.00: configured for UDMA/100
[    5.369392] scsi 1:0:0:0: Direct-Access     ATA      SiliconHardDisk  0102 PQ: 0 ANSI: 5
[    5.419180] scsi 1:0:0:0: Attached scsi generic sg1 type 0
[    5.444521] sd 1:0:0:0: [sdb] 62586880 512-byte logical blocks: (32.0 GB/29.8 GiB)
[    5.444556] sd 1:0:0:0: [sdb] Write Protect is off
[    5.444562] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[    5.444611] sd 1:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    5.843502]  sdb: sdb1
[    5.844346] sd 1:0:0:0: [sdb] Attached SCSI disk

無事認識し、使用できそうだ。
しかし、本当にSATAⅡなんだなと感じた。

次にSSDをフォーマットする。

# ls /dev/sdb
/dev/sdb
# mkfs.xfs /dev/sdb1
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (exfat).
mkfs.xfs: Use the -f option to force overwrite.
# mkfs.xfs /dev/sdb1 -f
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=1955648 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=7822592, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=3819, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

/var/ssdをマウントポイントにする。

# mkdir /var/ssd
# vi /etc/fstab
/dev/sdb1   /var/ssd   defaults  0 0    ←追記
# mount -a

MySQLのデータを移動

/var/lib/mysqlをMySQLのデータ移動先にする。

# mkdir /var/ssd/mysql
# chmod 755 /var/ssd/mysql/
# chown mysql. /var/ssd/mysql/

データをコピーし、MySQLを設定を変え、起動させる。

# systemctl stop mysqld
# cp -rfp /var/lib/mysql/* /var/ssd/mysql/
# vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
↓
datadir=/var/ssd/mysql
# systemctl start mysqld

問題なく、MySQLが起動した。

結果

まず、体感速度しては、NASからのデータ読み込みが早くなっている気がする。
他にも、複数のファイルを多重で読み出す際の待ち時間が無くなっている気もしている。

体感の話だけでは微妙なので、Zabbixのグラフを確認する。

移動前

MySQLデータがHDDに格納されている時のグラフ

移動後

MySQLデータがSSDに格納されている時のグラフ

SSDにデータを移動してから、iowaitが4%から1%に減っている。
CPUの待ち時間が減っているため、全体のパフォーマンスが上がったと言って良いかもしれない。

Trimを確認してみる

Trimは、SSD内の未使用データを削除し、その領域に再びデータを書き込めるようにする機能だ。
もし、Trimを使わず未使用領域が無くなった場合は、データを一旦消してから書き込む動作になる。
これにより一瞬PCが止まったような挙動を見せるのが、通称プチフリだ。

MySQLのデータは、上書きが何度もされるため、未使用領域が少なくなる可能性が高い。
Trimの設定は必須だろう。

Trimは、OSとSSDの両方で対応している必要がある。
OSであるCentOS Stream 8はもちろん対応している。

SSDの方は以下のように確認すると良いそうだ。
早速打ってみる。

# hdparm -I /dev/sdb | grep TRIM

ん?何もでない。

# hdparm -I /dev/sdb
(snip)
Commands/features:
        Enabled Supported:
           *    SMART feature set
           *    Power Management feature set
                Write cache
                Look-ahead
           *    Mandatory FLUSH_CACHE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Host-initiated interface power management
           *    Phy event counters

『Data Set Management TRIM supported (limit 8 block)』が無い!!

まあ、何とかなるだろう…。

SSDは良いものを使うに越したことはない。