Kernel Parameters and Tuning sysctl

カーネルパラメータとチューニング(sysctl)完全ガイド

目次

  1. はじめに
  2. /proc/sys ファイルシステム
  3. sysctl コマンド
  4. メモリチューニング(vm.*)
  5. ネットワークチューニング(net.*)
  6. ファイルシステムチューニング(fs.*)
  7. カーネルチューニング(kernel.*)
  8. セキュリティパラメータ
  9. ワークロード別チューニングプロファイル
  10. トラブルシューティング
  11. ベストプラクティス
  12. 参考文献

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/IPv4tcp_fin_timeout, tcp_tw_reuse
/proc/sys/net/netfilter/Netfilternf_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. ベストプラクティス

  1. 変更前にデフォルト値を記録する
$ sysctl -a > /tmp/sysctl_defaults_$(date +%Y%m%d).txt
  1. 一つずつ変更し、影響を確認する
$ sudo sysctl -w vm.swappiness=10
# 監視してから次のパラメータへ
  1. 設定ファイルにコメントを残す
# /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
  1. バージョン管理する
$ cd /etc/sysctl.d/
$ git init
$ git add .
$ git commit -m "Initial sysctl configuration"
  1. ワークロードに合わせてプロファイルを選択する

    • 汎用的な「最適値」は存在しない
    • ベンチマークで効果を測定する
  2. 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
  1. 監視を設定する - パラメータ変更後のシステムの挙動を監視する

12. 参考文献


本ドキュメントは 2026年4月時点の情報に基づいています。カーネルバージョンやディストリビューションにより、デフォルト値や利用可能なパラメータが異なる場合があります。最新の情報はカーネルドキュメントを参照してください。