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 5678CPUアフィニティの設定
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