2026年11月8日

2026年11月8日

VPSのディスクI/Oが遅い時の原因調査と改善方法

はじめに

VPS上のWordPressの動作が急に遅くなった・管理画面の表示に10秒以上かかる・MySQLのクエリが遅い・ディスクI/Oが高くてサーバーの負荷が上がっているといった問題の解決方法を解説します。

症状・原因

  • VPSの共有ストレージがホスト側の負荷で遅くなっている(オーバーコミット)
  • MySQLのInnoDB buffer pool sizeが小さくディスクから頻繁に読み込んでいる
  • wp-content/uploads/への大量のファイルアクセスがI/Oを圧迫している
  • WordPressのセッションファイルやキャッシュファイルが大量に蓄積されている

解決手順

ステップ1:ディスク I/O の状態を診断する

# ✅ ディスク I/O の使用率を確認
iostat -x 1 5
# → Device: r/s  w/s  await  %util
# → sda:   50.0  100.0  50.0  85.0 ← %util が高い = I/O 飽和

# ✅ どのプロセスがディスクを使っているか確認
sudo iotop -o
# → Total DISK READ: 50.00 M/s | Total DISK WRITE: 100.00 M/s
# → TID  PRIO  USER  DISK READ  DISK WRITE  COMMAND
# → 1234  mysql          0.00 B/s   50.00 M/s  mysqld ← MySQL が書き込み中

# ✅ ディスクの読み書き速度を測定
sudo dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=dsync
# → 1073741824 bytes (1.1 GB) copied, 5.23 s, 205 MB/s ← 書き込み速度

sudo dd if=/tmp/test of=/dev/null bs=1M
# → 1073741824 bytes copied, 0.91 s, 1.2 GB/s ← 読み込み速度

# ✅ fio でより精密なベンチマーク
sudo apt install fio -y
fio --name=randread --ioengine=libaio --iodepth=32 \
    --rw=randread --bs=4k --direct=1 --size=1G --runtime=30 \
    --filename=/tmp/fio_test
# → iops: 3000 ← 1秒あたりのランダム読み込み回数

ステップ2:MySQL の I/O を最適化する

# ✅ MySQL の I/O 状態を確認
mysql -u root -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool%';"
# → Innodb_buffer_pool_read_requests: 1000000
# → Innodb_buffer_pool_reads: 50000 ← ディスクから読み込んだ回数(少ないほど良い)
# → ヒット率 = (1000000 - 50000) / 1000000 = 95% (95%以上が目標)

# ✅ /etc/mysql/mysql.conf.d/mysqld.cnf を最適化
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# ✅ InnoDB バッファプールサイズ(利用可能メモリの50-70%)
innodb_buffer_pool_size = 1G  # 2GBメモリのVPSなら1GB

# ✅ I/O スレッド数(SSD の場合は増やす)
innodb_read_io_threads  = 4
innodb_write_io_threads = 4

# ✅ ログファイルサイズ(大きいほど書き込みが少ない)
innodb_log_file_size = 256M

# ✅ SSD の場合は O_DIRECT を使用してOSキャッシュをバイパス
innodb_flush_method = O_DIRECT

# ✅ バイナリログを無効化(不要な場合)
# disable_log_bin = 1

# ✅ クエリキャッシュ(MySQL 8.0では廃止)
# query_cache_type = 0
sudo systemctl restart mysql

# ✅ スローログでディスクI/Oを引き起こすクエリを特定
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/slow.log
# long_query_time = 1

ステップ3:WordPress のディスク書き込みを削減する

# ✅ 大量の一時ファイルを確認
find /tmp -name "sess_*" | wc -l
# → 50000 ← PHPセッションファイルが大量に蓄積

# ✅ 古いセッションファイルを削除
find /tmp -name "sess_*" -mmin +60 -delete

# ✅ PHP セッションをメモリ(Redis)に保存
sudo apt install redis-server php-redis -y
# php.ini または wp-config.php で設定
# session.save_handler = redis
# session.save_path = "tcp://127.0.0.1:6379"

# ✅ WordPress のトランジェントを Redis に移行
# Redis Object Cache プラグインを使用
wp plugin install redis-cache --activate --path=/var/www/html/
wp redis enable --path=/var/www/html/

# ✅ wp-content/uploads のファイル数を確認
find /var/www/html/wp-content/uploads/ -type f | wc -l
# → 50000 ← ファイルが多い場合はCDNへの移行を検討

ステップ4:ファイルシステムを最適化する

# ✅ ファイルシステムのマウントオプションを確認
cat /proc/mounts | grep "/var/www"
# → /dev/sda1 /var/www ext4 rw,relatime,errors=remount-ro 0 0

# ✅ noatime オプションで読み込み時のアクセス時刻更新を停止(I/O 削減)
sudo nano /etc/fstab
# → /dev/sda1 / ext4 rw,noatime,errors=remount-ro 0 1
#                        ^^^^^^^^ 追加

# ✅ マウントオプションを即座に反映(再起動不要)
sudo mount -o remount,noatime /

# ✅ ディスクの使用量を確認
df -h
# → /dev/sda1  40G  35G  5G  88% / ← 容量逼迫も I/O 低下の原因

# ✅ 不要なログファイルを削除
sudo journalctl --vacuum-size=500M  # journald のログを500MB以下に
sudo truncate -s 0 /var/log/nginx/access.log  # アクセスログをクリア

ステップ5:VPS プランのアップグレードとキャッシュ戦略

# ✅ VPS の I/O パフォーマンスを確認してアップグレードを検討
# プロバイダーのコントロールパネルで I/O スパイクを確認

# ✅ WordPress のキャッシュで I/O を削減
# フルページキャッシュ(WP Super Cache / W3 Total Cache)
wp plugin install wp-super-cache --activate --path=/var/www/html/

# ✅ Nginx FastCGI キャッシュでPHP-FPM の呼び出しを削減
# キャッシュが有効な場合、ディスクI/Oはほぼゼロに
# → X-FastCGI-Cache: HIT ← PHP を実行せずに返す

# ✅ tmpfs でキャッシュディレクトリをメモリに置く
sudo nano /etc/fstab
# tmpfs /var/cache/nginx tmpfs defaults,size=512M 0 0
sudo mount -a

# ✅ アップロードファイルを Cloudflare R2 や AWS S3 に移行
# WP Offload Media プラグインでメディアファイルをクラウドに
wp plugin install amazon-s3-and-cloudfront --activate --path=/var/www/html/

注意事項

  • noatimeマウントオプションは多くのサーバーで安全に使用できますが、一部のアプリケーション(Maildir形式のメールボックスなど)はアクセス時刻に依存します。WordPressとWebサーバーの運用では問題ありません
  • InnoDB buffer poolのサイズはシステム全体のメモリを考慮して設定してください。メモリが不足するとスワップが発生してさらに遅くなります。VPS全体のメモリの50-70%を目安にしてください

まとめ

VPSのディスクI/O改善は①iostat -xでI/O使用率確認・iotop -oで原因プロセス特定・ddとfioでディスク速度ベンチマーク、②MySQLのInnodb_buffer_pool_readsヒット率確認・innodb_buffer_pool_sizeをメモリの50-70%に設定・O_DIRECTでOSキャッシュをバイパス・スローログで遅いクエリを特定、③PHPセッションをRedisに移行・wp redis enableでオブジェクトキャッシュ有効化・大量ファイル蓄積の確認、④noatimeマウントオプションでアクセス時刻更新を停止・ディスク容量を確保・不要ログを削除、⑤FastCGIキャッシュで PHP実行を削減・tmpfsでキャッシュディレクトリをメモリに配置・メディアファイルをS3/CDNに移行の手順で改善します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲