Kernel Parameters and Tuning sysctl
カーネルパラメータとチューニング(sysctl)完全ガイド
目次
- はじめに
- /proc/sys ファイルシステム
- sysctl コマンド
- メモリチューニング(vm.*)
- 4.1 swappiness
- 4.2 dirty_ratio / dirty_background_ratio
- 4.3 overcommit_memory / overcommit_ratio
- 4.4 min_free_kbytes
- 4.5 Hugepages
- 4.6 OOM 設定
- 4.7 その他のメモリパラメータ
- ネットワークチューニング(net.*)
- 5.1 TCP SYN Cookies
- 5.2 IP フォワーディング
- 5.3 TCP TIME_WAIT 関連
- 5.4 somaxconn(バックログ)
- 5.5 バッファサイズ(rmem/wmem)
- 5.6 Netfilter conntrack
- 5.7 その他のネットワークパラメータ
- ファイルシステムチューニング(fs.*)
- 6.1 file-max
- 6.2 inotify
- 6.3 aio-max-nr
- カーネルチューニング(kernel.*)
- 7.1 panic / panic_on_oops
- 7.2 共有メモリ(shmmax / shmall)
- 7.3 メッセージキュー(msgmax / msgmnb)
- 7.4 pid_max
- 7.5 threads-max
- セキュリティパラメータ
- 8.1 ASLR(アドレス空間レイアウトランダム化)
- 8.2 ptrace スコープ
- 8.3 dmesg_restrict
- 8.4 その他のセキュリティパラメータ
- ワークロード別チューニングプロファイル
- 9.1 Web サーバー
- 9.2 データベースサーバー
- 9.3 コンテナホスト
- 9.4 高負荷ネットワークサーバー
- トラブルシューティング
- ベストプラクティス
- 参考文献
1. はじめに
Linux カーネルパラメータのチューニングは、システムの性能、安定性、セキュリティを最適化するための重要な技術である。sysctl を通じてカーネルの動作をランタイムで制御することで、ワークロードに応じた最適な設定を実現できる。
本ドキュメントでは、/proc/sys ファイルシステムの構造、sysctl コマンドの使い方、各カテゴリのパラメータ詳細、およびワークロード別のチューニングプロファイルを包括的に解説する。
2. /proc/sys ファイルシステム
2.1 構造概要
/proc/sys/ ディレクトリはカーネルパラメータを公開する仮想ファイルシステムである。各ファイルは読み書き可能で、カーネルの動作をリアルタイムに変更できる。
# /proc/sys の主要ディレクトリ
$ ls /proc/sys/
abi crypto debug dev fs kernel net user vm
# パラメータの読み取り
$ cat /proc/sys/vm/swappiness
60
# パラメータの書き込み(即時反映、再起動で消失)
$ echo 10 > /proc/sys/vm/swappiness
2.2 主要ディレクトリ
| ディレクトリ | 説明 | 主要パラメータ例 |
|---|---|---|
/proc/sys/vm/ | 仮想メモリ管理 | swappiness, dirty_ratio, overcommit_memory |
/proc/sys/net/ | ネットワークスタック | tcp_syncookies, ip_forward, somaxconn |
/proc/sys/fs/ | ファイルシステム | file-max, inotify, aio-max-nr |
/proc/sys/kernel/ | カーネル全般 | panic, shmmax, pid_max, threads-max |
/proc/sys/net/core/ | ネットワークコア | rmem_max, wmem_max, netdev_max_backlog |
/proc/sys/net/ipv4/ | IPv4 | tcp_fin_timeout, tcp_tw_reuse |
/proc/sys/net/netfilter/ | Netfilter | nf_conntrack_max |
3. sysctl コマンド
3.1 基本操作
# 全パラメータの表示
$ sysctl -a
vm.swappiness = 60
vm.dirty_ratio = 20
net.ipv4.ip_forward = 0
...
# 特定パラメータの表示
$ sysctl vm.swappiness
vm.swappiness = 60
# パラメータの設定(一時的、再起動で消失)
$ sudo sysctl -w vm.swappiness=10
vm.swappiness = 10
# 複数パラメータの同時設定
$ sudo sysctl -w vm.swappiness=10 net.ipv4.ip_forward=1
# パラメータの検索(パターンマッチ)
$ sysctl -a | grep tcp_keepalive
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
# 設定ファイルの読み込み
$ sudo sysctl -p # /etc/sysctl.conf を読み込み
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf # 特定ファイルを読み込み
$ sudo sysctl --system # 全設定ファイルを読み込み
3.2 設定の永続化
# /etc/sysctl.conf(メインの設定ファイル)
$ cat /etc/sysctl.conf
# Kernel sysctl configuration
# See sysctl.conf(5) for more information.
# メモリ
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# ネットワーク
net.ipv4.ip_forward = 1
net.ipv4.tcp_syncookies = 1
# /etc/sysctl.d/ ディレクトリ(モジュール別に分割可能)
$ ls /etc/sysctl.d/
10-network-security.conf
20-memory-tuning.conf
30-filesystem.conf
99-custom.conf
# 設定ファイルの読み込み順序
# 1. /usr/lib/sysctl.d/*.conf (システムデフォルト)
# 2. /run/sysctl.d/*.conf (ランタイム設定)
# 3. /etc/sysctl.d/*.conf (管理者設定)
# 4. /etc/sysctl.conf (レガシー設定)
# ※ 同名パラメータは後から読まれたファイルが優先
# 設定例: /etc/sysctl.d/99-custom.conf
$ cat /etc/sysctl.d/99-custom.conf
# Custom kernel parameter tuning
# Author: SRE Team
# Date: 2026-04-10
# === Memory ===
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.overcommit_memory = 0
vm.min_free_kbytes = 65536
# === Network ===
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 設定の適用
$ sudo sysctl --system
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
* Applying /etc/sysctl.d/99-custom.conf ...
* Applying /etc/sysctl.conf ...
4. メモリチューニング(vm.*)
4.1 swappiness
スワップの積極性を制御するパラメータ(0〜200、デフォルト: 60)。
# 現在の値を確認
$ sysctl vm.swappiness
vm.swappiness = 60
# 値の意味
# 0: カーネルは可能な限りスワップを回避(OOM になりやすい)
# 1: 最小限のスワップ(カーネル 3.5+)
# 10: データベースサーバー向け推奨値
# 60: デフォルト値(一般的なデスクトップ/サーバー)
# 100: 匿名ページとファイルキャッシュを均等に扱う
# 200: 積極的にスワップを使用(cgroup v2、メモリ圧迫時)
# 設定例
$ sudo sysctl -w vm.swappiness=10
# 推奨値
# データベースサーバー: 1〜10
# Web サーバー: 10〜30
# 汎用サーバー: 30〜60
# デスクトップ: 60
4.2 dirty_ratio / dirty_background_ratio
ダーティページ(未書き込みデータ)のフラッシュ動作を制御する。
# dirty_background_ratio: バックグラウンドフラッシュが開始される閾値(%)
$ sysctl vm.dirty_background_ratio
vm.dirty_background_ratio = 10
# dirty_ratio: プロセスがブロックされる閾値(%)
$ sysctl vm.dirty_ratio
vm.dirty_ratio = 20
# dirty_expire_centisecs: ダーティページがフラッシュ対象になるまでの時間(1/100秒)
$ sysctl vm.dirty_expire_centisecs
vm.dirty_expire_centisecs = 3000 # 30秒
# dirty_writeback_centisecs: フラッシュスレッドの起動間隔(1/100秒)
$ sysctl vm.dirty_writeback_centisecs
vm.dirty_writeback_centisecs = 500 # 5秒
# 推奨設定
# データベースサーバー(データ保護重視):
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
# Web サーバー(性能重視):
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
# 絶対値での指定も可能
vm.dirty_background_bytes = 67108864 # 64MB
vm.dirty_bytes = 268435456 # 256MB
4.3 overcommit_memory / overcommit_ratio
メモリのオーバーコミット動作を制御する。
# overcommit_memory の値
# 0: ヒューリスティック(デフォルト) - カーネルが適切に判断
# 1: 常に許可 - malloc は常に成功(Redis 等で使用)
# 2: 制限付き - CommitLimit を超えるメモリ割り当てを拒否
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0
# overcommit_ratio(overcommit_memory=2 の場合のみ有効)
# CommitLimit = RAM * overcommit_ratio/100 + Swap
$ sysctl vm.overcommit_ratio
vm.overcommit_ratio = 50
# コミット状況の確認
$ grep -E "Committed_AS|CommitLimit" /proc/meminfo
CommitLimit: 16384000 kB
Committed_AS: 8192000 kB
# Redis/Elasticsearch では overcommit_memory=1 が推奨
$ sudo sysctl -w vm.overcommit_memory=1
4.4 min_free_kbytes
カーネルが予約する最小空きメモリ量。メモリ枯渇時の安定性に影響する。
$ sysctl vm.min_free_kbytes
vm.min_free_kbytes = 67584
# 推奨値の計算(目安)
# 物理メモリの 1〜3% 程度
# 64GB RAM の場合: 65536 〜 196608
# ただし、大きすぎるとメモリが無駄になる
# 設定例
$ sudo sysctl -w vm.min_free_kbytes=131072 # 128MB
# ネットワーク負荷が高い環境では大きめに設定
# (割り込みコンテキストでのメモリ確保のため)
4.5 Hugepages
大きなページサイズ(2MB / 1GB)を使用して TLB ミスを削減する。
# 現在の Hugepages 設定
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 262144 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
# 静的 Hugepages の設定
$ sudo sysctl -w vm.nr_hugepages=1024 # 2MB x 1024 = 2GB
# Transparent Huge Pages (THP)
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
# THP の無効化(データベースでは推奨される場合が多い)
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
4.6 OOM 設定
Out of Memory Killer の動作を制御する。
# OOM Killer でパニックするか
$ sysctl vm.panic_on_oom
vm.panic_on_oom = 0 # 0: OOM Killer が動作, 1: カーネルパニック
# プロセスごとの OOM スコア調整
$ cat /proc/$(pgrep -f nginx)/oom_score_adj
0 # -1000 〜 1000(-1000: 絶対に殺さない, 1000: 優先的に殺す)
# 重要なプロセスを OOM から保護
$ echo -1000 > /proc/$(pgrep -f sshd)/oom_score_adj
# OOM Killer の動作ログ確認
$ dmesg | grep -i "oom\|out of memory"
[12345.678] Out of memory: Killed process 9876 (java) total-vm:8388608kB
4.7 その他のメモリパラメータ
# ゾーンの再利用方針
vm.zone_reclaim_mode = 0 # 0: 無効(NUMA 環境で推奨)
# VFS キャッシュの圧力
vm.vfs_cache_pressure = 100 # デフォルト 100、低い値=キャッシュ保持
# メモリマップの最大数
vm.max_map_count = 65530 # Elasticsearch では 262144 以上が必要
$ sudo sysctl -w vm.max_map_count=262144
# mmap の最小アドレス
vm.mmap_min_addr = 65536 # セキュリティ(NULL ポインタ攻撃防止)
5. ネットワークチューニング(net.*)
5.1 TCP SYN Cookies
SYN Flood 攻撃を軽減する。
$ sysctl net.ipv4.tcp_syncookies
net.ipv4.tcp_syncookies = 1 # 1: 有効(推奨)
# SYN バックログの拡大
$ sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
5.2 IP フォワーディング
# IPv4 フォワーディング
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
# 有効化(ルーター、コンテナホスト、VPN サーバーで必要)
$ sudo sysctl -w net.ipv4.ip_forward=1
# IPv6 フォワーディング
$ sudo sysctl -w net.ipv6.conf.all.forwarding=1
# 特定インターフェースのみフォワーディング
$ sudo sysctl -w net.ipv4.conf.eth0.forwarding=1
5.3 TCP TIME_WAIT 関連
# TIME_WAIT ソケットの再利用
$ sysctl net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_reuse = 2 # 0: 無効, 1: 有効, 2: ループバックのみ
# 推奨: クライアント側(アウトバウンド接続が多い場合)
$ sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# FIN_WAIT_2 タイムアウト
$ sysctl net.ipv4.tcp_fin_timeout
net.ipv4.tcp_fin_timeout = 60 # デフォルト 60秒
# 短縮(高トラフィック環境)
$ sudo sysctl -w net.ipv4.tcp_fin_timeout=15
# ローカルポート範囲
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
# 拡張
$ sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
5.4 somaxconn(バックログ)
リスニングソケットの最大バックログサイズ。
$ sysctl net.core.somaxconn
net.core.somaxconn = 4096 # カーネル 5.4+ のデフォルト
# 高負荷 Web サーバー向け
$ sudo sysctl -w net.core.somaxconn=65535
# 受信キューの最大長
$ sudo sysctl -w net.core.netdev_max_backlog=65535
# アプリケーション側も対応が必要
# nginx: listen 80 backlog=65535;
# Apache: ListenBacklog 65535
5.5 バッファサイズ(rmem/wmem)
# TCP バッファサイズ(min, default, max)
$ sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096 131072 6291456
$ sysctl net.ipv4.tcp_wmem
net.ipv4.tcp_wmem = 4096 16384 4194304
# 高帯域幅環境向けの設定
$ sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
$ sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
# コアバッファの最大値
$ sudo sysctl -w net.core.rmem_max=16777216
$ sudo sysctl -w net.core.wmem_max=16777216
$ sudo sysctl -w net.core.rmem_default=262144
$ sudo sysctl -w net.core.wmem_default=262144
# TCP ウィンドウスケーリング(デフォルトで有効)
$ sysctl net.ipv4.tcp_window_scaling
net.ipv4.tcp_window_scaling = 1
# TCP メモリ(ページ単位: min, pressure, max)
$ sysctl net.ipv4.tcp_mem
net.ipv4.tcp_mem = 381168 508224 762336
5.6 Netfilter conntrack
接続追跡テーブルの設定。
# 接続追跡テーブルの最大エントリ数
$ sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 262144
# 現在のエントリ数
$ cat /proc/sys/net/netfilter/nf_conntrack_count
15234
# 高トラフィック環境向け
$ sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
# ハッシュテーブルサイズ(conntrack_max / 4 が推奨)
$ echo 262144 | sudo tee /sys/module/nf_conntrack/parameters/hashsize
# タイムアウト設定
$ sysctl net.netfilter.nf_conntrack_tcp_timeout_established
net.netfilter.nf_conntrack_tcp_timeout_established = 432000 # 5日
# 短縮(コネクション数が多い環境)
$ sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400
$ sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
# conntrack テーブルの監視
$ sudo conntrack -C # エントリ数
$ sudo conntrack -L # エントリ一覧
5.7 その他のネットワークパラメータ
# TCP Keepalive 設定
net.ipv4.tcp_keepalive_time = 600 # 最初のプローブまでの時間(秒)
net.ipv4.tcp_keepalive_intvl = 60 # プローブの間隔(秒)
net.ipv4.tcp_keepalive_probes = 5 # プローブの回数
# TCP 輻輳制御アルゴリズム
$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic
# BBR に変更(Google 開発、高帯域・高遅延環境向け)
$ sudo modprobe tcp_bbr
$ sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
$ sudo sysctl -w net.core.default_qdisc=fq
# 利用可能なアルゴリズム一覧
$ sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
# リバースパスフィルタリング
net.ipv4.conf.all.rp_filter = 1 # 1: Strict, 2: Loose
net.ipv4.conf.default.rp_filter = 1
# ICMP リダイレクトの無効化
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# ソースルーティングの無効化
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
6. ファイルシステムチューニング(fs.*)
6.1 file-max
システム全体で開けるファイルディスクリプタの最大数。
$ sysctl fs.file-max
fs.file-max = 9223372036854775807 # 最近のカーネルではほぼ無制限
# 現在の使用状況
$ cat /proc/sys/fs/file-nr
5120 0 9223372036854775807
# allocated free maximum
# 設定(必要に応じて)
$ sudo sysctl -w fs.file-max=6553600
# プロセスごとの制限は ulimit で設定
$ ulimit -n
1024
$ ulimit -Hn
524288
# /etc/security/limits.conf での設定
# * soft nofile 65535
# * hard nofile 65535
# systemd サービスでの設定
# [Service]
# LimitNOFILE=65535
6.2 inotify
ファイルシステム変更監視の設定。
# inotify インスタンスの最大数(ユーザーあたり)
$ sysctl fs.inotify.max_user_instances
fs.inotify.max_user_instances = 128
# inotify ウォッチの最大数(ユーザーあたり)
$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 65536
# 開発環境やコンテナ環境では増加が必要な場合がある
$ sudo sysctl -w fs.inotify.max_user_instances=512
$ sudo sysctl -w fs.inotify.max_user_watches=524288
# Kubernetes / Docker 環境での推奨値
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
6.3 aio-max-nr
非同期 I/O リクエストの最大数。
$ sysctl fs.aio-max-nr
fs.aio-max-nr = 65536
# データベースサーバー(Oracle, MySQL InnoDB)向け
$ sudo sysctl -w fs.aio-max-nr=1048576
7. カーネルチューニング(kernel.*)
7.1 panic / panic_on_oops
# カーネルパニック後の再起動までの秒数
$ sysctl kernel.panic
kernel.panic = 0 # 0: 再起動しない, >0: 指定秒後に再起動
# 本番環境では自動再起動を推奨
$ sudo sysctl -w kernel.panic=10
# oops(深刻でないエラー)でパニックするか
$ sysctl kernel.panic_on_oops
kernel.panic_on_oops = 0 # 0: パニックしない, 1: パニック
# 本番環境では 1 を推奨(問題の早期検出)
$ sudo sysctl -w kernel.panic_on_oops=1
7.2 共有メモリ(shmmax / shmall)
# 単一共有メモリセグメントの最大サイズ(バイト)
$ sysctl kernel.shmmax
kernel.shmmax = 18446744073692774399
# 共有メモリの総ページ数
$ sysctl kernel.shmall
kernel.shmall = 18446744073692774399
# PostgreSQL 向けの設定例(RAM の 50% 程度)
# 32GB RAM の場合
$ sudo sysctl -w kernel.shmmax=17179869184 # 16GB
$ sudo sysctl -w kernel.shmall=4194304 # 16GB / 4096 bytes per page
# セマフォ設定
$ sysctl kernel.sem
kernel.sem = 32000 1024000000 500 32000
# SEMMSL SEMMNS SEMOPM SEMMNI
7.3 メッセージキュー(msgmax / msgmnb)
# メッセージの最大サイズ(バイト)
$ sysctl kernel.msgmax
kernel.msgmax = 8192
# メッセージキューの最大サイズ(バイト)
$ sysctl kernel.msgmnb
kernel.msgmnb = 16384
# メッセージキューの最大数
$ sysctl kernel.msgmni
kernel.msgmni = 32000
7.4 pid_max
# PID の最大値
$ sysctl kernel.pid_max
kernel.pid_max = 4194304 # カーネル 6.x のデフォルト
# コンテナホストでは増加が推奨
$ sudo sysctl -w kernel.pid_max=4194304
# 32ビットシステムの上限: 32768
# 64ビットシステムの上限: 4194304
7.5 threads-max
# システム全体のスレッド最大数
$ sysctl kernel.threads-max
kernel.threads-max = 256672
# 大量のスレッドを使用するアプリケーション向け
$ sudo sysctl -w kernel.threads-max=512000
8. セキュリティパラメータ
8.1 ASLR(アドレス空間レイアウトランダム化)
# ASLR の設定
$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2
# 値の意味:
# 0: 無効
# 1: ランダム化(スタック、VDSO、ライブラリ、mmap)
# 2: 完全ランダム化(+ brk() ヒープ)← 推奨
# セキュリティのため常に 2 を維持
$ sudo sysctl -w kernel.randomize_va_space=2
8.2 ptrace スコープ
# ptrace のスコープ(Yama LSM)
$ sysctl kernel.yama.ptrace_scope
kernel.yama.ptrace_scope = 1
# 値の意味:
# 0: 全プロセスに ptrace 可能(制限なし)
# 1: 直接の子プロセスのみ(デフォルト、推奨)
# 2: admin のみ(CAP_SYS_PTRACE)
# 3: ptrace 完全無効
# 本番環境では 1 以上を推奨
$ sudo sysctl -w kernel.yama.ptrace_scope=1
8.3 dmesg_restrict
# 非特権ユーザーの dmesg アクセス制限
$ sysctl kernel.dmesg_restrict
kernel.dmesg_restrict = 0
# 制限を有効化(推奨)
$ sudo sysctl -w kernel.dmesg_restrict=1
8.4 その他のセキュリティパラメータ
# カーネルポインタの非表示
kernel.kptr_restrict = 1
# 0: 制限なし
# 1: 特権なしユーザーには 0 を返す(推奨)
# 2: 常に 0 を返す
# コアダンプへのカーネルポインタを含めない
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
# SysRq キーの制限
kernel.sysrq = 0 # 0: 完全無効, 1: 全機能有効
# 本番環境では 0 または制限付きの値を推奨
# 非特権ユーザーの BPF 制限
kernel.unprivileged_bpf_disabled = 1
# ユーザー名前空間の制限(必要でなければ無効化)
user.max_user_namespaces = 0
# ただし、Podman/ルートレスコンテナでは必要
# ネットワークセキュリティ
net.ipv4.conf.all.log_martians = 1 # 不正パケットのログ
net.ipv4.icmp_echo_ignore_broadcasts = 1 # Smurf 攻撃防止
net.ipv4.icmp_ignore_bogus_error_responses = 1
9. ワークロード別チューニングプロファイル
9.1 Web サーバー
# /etc/sysctl.d/80-webserver.conf
# === Web Server Tuning Profile ===
# Memory
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.min_free_kbytes = 65536
# Network - Connection handling
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
# Network - Performance
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
# Network - Keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
# Filesystem
fs.file-max = 6553600
fs.inotify.max_user_watches = 524288
# Security
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
9.2 データベースサーバー
# /etc/sysctl.d/80-database.conf
# === Database Server Tuning Profile ===
# Memory - Minimize swapping, protect data
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
vm.min_free_kbytes = 131072
# Hugepages (adjust based on DB shared buffer size)
vm.nr_hugepages = 4096 # 4096 * 2MB = 8GB
# Shared memory (PostgreSQL)
kernel.shmmax = 17179869184 # 16GB
kernel.shmall = 4194304
# Filesystem
fs.file-max = 6553600
fs.aio-max-nr = 1048576
# Semaphores
kernel.sem = 32000 1024000000 500 32000
# Network (database connections)
net.core.somaxconn = 4096
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_fin_timeout = 15
# THP should be disabled for most databases
# (done via /sys, not sysctl)
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
9.3 コンテナホスト
# /etc/sysctl.d/80-container-host.conf
# === Container Host Tuning Profile ===
# IP Forwarding (required for container networking)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# Bridge netfilter (required for iptables-based networking)
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# Memory
vm.swappiness = 10
vm.overcommit_memory = 1
vm.max_map_count = 262144
vm.min_free_kbytes = 131072
# Network - High connection counts
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# Conntrack (many containers = many connections)
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
# Filesystem (many containers = many file descriptors)
fs.file-max = 6553600
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
# PID (many containers = many processes)
kernel.pid_max = 4194304
kernel.threads-max = 512000
# User namespaces (for rootless containers)
user.max_user_namespaces = 28633
# Network buffers
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
9.4 高負荷ネットワークサーバー
# /etc/sysctl.d/80-highnet.conf
# === High-Performance Network Tuning Profile ===
# Network buffers - Maximize
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 67108864
net.ipv4.tcp_wmem = 4096 1048576 67108864
# Connection handling
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
# TCP performance
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
# TCP keepalive
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# Conntrack
net.netfilter.nf_conntrack_max = 2097152
# Memory
vm.swappiness = 10
vm.min_free_kbytes = 262144
10. トラブルシューティング
設定が反映されない
# 1. 設定ファイルの構文を確認
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf
# エラーがあれば表示される
# 2. パラメータ名の確認
$ sysctl -a | grep "parameter_name"
# 3. 読み取り専用パラメータの確認
# 一部のパラメータは起動時のみ設定可能
# 例: kernel.pid_max は一部の環境で変更不可
# 4. モジュール依存のパラメータ
# net.bridge.bridge-nf-call-iptables は br_netfilter モジュールが必要
$ sudo modprobe br_netfilter
$ sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
# 5. 設定ファイルの優先順位を確認
$ sudo sysctl --system 2>&1 | grep "Applying"
メモリ関連の問題
# OOM Killer が発動した場合
$ dmesg | grep -i "oom\|out of memory\|killed process"
# メモリ使用状況の詳細
$ cat /proc/meminfo
$ vmstat 1 5
$ free -h
# スワップ使用状況
$ swapon --show
$ cat /proc/swaps
ネットワーク関連の問題
# conntrack テーブルが満杯
$ dmesg | grep "nf_conntrack: table full"
$ sudo sysctl -w net.netfilter.nf_conntrack_max=2097152
# ソケットバッファオーバーフロー
$ netstat -s | grep -i "overflow\|drop"
$ ss -s
# TIME_WAIT の大量発生
$ ss -s | grep "TIME-WAIT"
$ netstat -an | grep TIME_WAIT | wc -l
11. ベストプラクティス
- 変更前にデフォルト値を記録する
$ sysctl -a > /tmp/sysctl_defaults_$(date +%Y%m%d).txt
- 一つずつ変更し、影響を確認する
$ sudo sysctl -w vm.swappiness=10
# 監視してから次のパラメータへ
- 設定ファイルにコメントを残す
# /etc/sysctl.d/99-custom.conf
# Reason: Reduce swapping for database workload
# Changed by: SRE Team (2026-04-10)
# Reference: https://wiki.example.com/tuning-guide
vm.swappiness = 10
- バージョン管理する
$ cd /etc/sysctl.d/
$ git init
$ git add .
$ git commit -m "Initial sysctl configuration"
-
ワークロードに合わせてプロファイルを選択する
- 汎用的な「最適値」は存在しない
- ベンチマークで効果を測定する
-
tuned を活用する
# tuned のインストール(RHEL系)
$ sudo dnf install tuned
$ sudo systemctl enable --now tuned
# プロファイル一覧
$ tuned-adm list
Available profiles:
- balanced
- desktop
- latency-performance
- network-latency
- network-throughput
- powersave
- throughput-performance
- virtual-guest
- virtual-host
# プロファイルの適用
$ sudo tuned-adm profile throughput-performance
# 現在のプロファイル
$ tuned-adm active
Current active profile: throughput-performance
# カスタムプロファイルの作成
$ sudo mkdir -p /etc/tuned/my-profile
$ cat > /etc/tuned/my-profile/tuned.conf << 'EOF'
[main]
include=throughput-performance
[sysctl]
vm.swappiness = 10
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
[vm]
transparent_hugepages=never
EOF
$ sudo tuned-adm profile my-profile
- 監視を設定する - パラメータ変更後のシステムの挙動を監視する
12. 参考文献
-
カーネルドキュメント:
-
man ページ:
man 5 sysctl.confman 8 sysctlman 5 proc
-
Red Hat ドキュメント:
- RHEL Performance Tuning Guide: https://access.redhat.com/documentation/
- tuned: https://tuned-project.org/
-
書籍:
- 「Systems Performance」Brendan Gregg
- 「Linux Kernel Development」Robert Love
- 「UNIX and Linux System Administration Handbook」Evi Nemeth 他
本ドキュメントは 2026年4月時点の情報に基づいています。カーネルバージョンやディストリビューションにより、デフォルト値や利用可能なパラメータが異なる場合があります。最新の情報はカーネルドキュメントを参照してください。