Linuxサーバー性能最適化ガイド:CPU・ディスクI/O・ネットワーク設定の実践

Linuxサーバーのデフォルト設定は、汎用的な利用を想定しているため、高負荷環境や特定のワークロードでは最適なパフォーマンスを発揮できないことがあります。本記事では、CPUスケジューリング、ディスクI/O、ネットワークスタック、カーネルパラメータの各レイヤーにおける具体的なチューニング手法と、ボトルネック特定のための分析コマンドを解説します。

CPUスケジューリングの最適化

プロセス優先度の制御

プロセスのCPU割り当て優先度は、nice値(-20〜19、低いほど優先度高)で制御します。重要なサービスへのリソース確保や、バックグラウンドタスクの優先度低下に有効です。

# 優先度を高くしてプロセス開始(nice値 -10)
nice -n -10 /usr/local/bin/critical_task

# 実行中のPID 5678の優先度を下げる
renice -n 15 -p 5678

設定確認はpsコマンドで可能です。

ps -o pid,ni,comm -p 5678

CPUアフィニティの設定

tasksetを使用すると、特定のプロセスを指定したCPUコアに固定(ピン留め)できます。キャッシュヒット率の向上や、コンテキストスイッチのオーバーヘッド削減が期待できます。

# CPUコア1でプロセスを起動
taskset -c 1 ./compute_heavy_app

# PID 8642のアフィニティを確認
taskset -cp 8642

# 実行中のプロセスをコア0と2に割り当て
taskset -cp 0,2 8642

システム状態の監視

CPUのボトルネック分析にはvmstatが有用です。

vmstat 1 5
  • r: 実行待ちプロセス数。CPUコア数を超えている場合、処理待ちが発生。
  • us: ユーザーモードでのCPU使用率。
  • sy: カーネルモードでのCPU使用率。高い場合はシステムコール過多の可能性。
  • wa: I/O待ち時間。高い場合、ストレージがボトルネック。

ディスクI/Oとリソース制限

ファイル記述子の上限設定

高並行接続を行うサーバーでは、デフォルトのファイル記述子(File Descriptor)制限が不足する場合があります。/etc/security/limits.confで設定を変更します。

# /etc/security/limits.conf
# ユーザー apacheに対する設定例
apache soft nofile 65536
apache hard nofile 131072
apache soft nproc 4096
apache hard nproc 8192

即時確認と一時的な変更はulimitコマンドを使用します。

ulimit -n  # 現在の上限確認
ulimit -n 50000  # 一時的な変更

ストレージ性能の評価

読み出し速度の簡易測定にはhdparm、書き込み速度の測定にはddを利用します。キャッシュの影響を除外するため、直接I/Oオプションを推奨します。

# 読み出しベンチマーク
hdparm -t --direct /dev/sda

# 書き込みベンチマーク(1GB書き込み)
dd if=/dev/zero of=/tmp/benchmark_file bs=1M count=1024 oflag=direct conv=fsync
rm -f /tmp/benchmark_file

カーネルパラメータによるTCP/IPスタック調整

/etc/sysctl.confまたは/etc/sysctl.d/配下の設定ファイルを編集し、sysctl -pで反映させます。

主要なネットワークパラメータ

# /etc/sysctl.conf 設定例

# SYNキューのバックログ拡大(接続要求の保持数)
net.ipv4.tcp_max_syn_backlog = 4096

# SYN Flood攻撃対策
net.ipv4.tcp_syncookies = 1

# FIN_WAIT2状態のタイムアウト短縮
net.ipv4.tcp_fin_timeout = 15

# TIME_WAITソケットの再利用許可
net.ipv4.tcp_tw_reuse = 1

# ローカルポート範囲の拡大
net.ipv4.ip_local_port_range = 10000 65535

# ソケットの受信・送信バッファサイズ
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# Listenバックログの上限
net.core.somaxconn = 4096

パラメータの解説

  • tcp_max_syn_backlog: ハンドシェイク未完了の接続要求を保持するキューの長さ。高トラフィックなWebサーバーで有効。
  • tcp_tw_reuse: TIME_WAIT状態のコネクションを再利用可能にし、ポート枯渇を防ぐ。
  • somaxconn: listen()システムコールにおけるバックログの上限値。Nginxなどアプリケーション側の設定値がこれを超えるとエラーになる。

ネットワーク冗長化:ボンディング構成

複数のNICを束ねて冗長性や帯域幅を確保するボンディング(Bonding)の設定例です。nmcliを使用して設定します。

アクティブ・バックアップ構成

一方のNICを主系、もう一方を待機系とする設定です。

# ボンドインターフェース作成
nmcli con add type bond ifname bond0 mode active-backup miimon 100 \
    ip4 192.168.10.100/24 gw4 192.168.10.1

# 物理インターフェースをボンドにスレーブとして追加
nmcli con add type bond-slave ifname eth0 master bond0
nmcli con add type bond-slave ifname eth1 master bond0

# 設定確認
cat /proc/net/bonding/bond0

タグ: linux sysctl performance tuning Networking Kernel Parameters

9月16日 21:42 投稿