Linuxでシステムのカーネルパラメータを確認・変更する方法

Linuxのカーネルパラメータは、sysctlで現在値を確認し、対応する設定だけを実行時に変更できます。再起動後も使う値は設定ファイルに保存しますが、「設定ファイルに書いた値」と「現在動いている値」は別物です。本記事では、確認、一時変更、永続化、元に戻す手順を説明し、ネットワーク・メモリ・セキュリティの代表的な項目について調整の判断材料を整理します。

一律の「高速化設定」はありません。この記事の数値は用途を説明するための例であり、全サーバーに適用する推奨セットではありません。変更する場合は、管理権限と復旧手段を確保した検証環境で、対象を一つに絞って評価してください。

目次

カーネルパラメータとは何か

カーネルのメモリ管理やネットワーク動作などを制御する設定です。ここでは主に/proc/sys/から公開されるsysctl項目を扱います。起動時のカーネルコマンドラインやモジュールパラメータとは設定経路が異なり、すべてのカーネル設定をsysctlで変更できるわけではありません。項目の存在、書き込み可否、初期値はカーネル、ディストリビューション、名前空間、設定によって異なります。

カーネルパラメータの確認方法

まずOS・カーネルと対象項目を確認する

uname -r
cat /etc/os-release
sysctl --version
sysctl vm.swappiness
sysctl -n vm.swappiness
cat /proc/sys/vm/swappiness

sysctl vm.swappinessは項目名と値、-nは値だけを表示します。通常の階層名ではvm.swappinessが/proc/sys/vm/swappinessに対応します。ネットワークの例ならsysctl net.ipv4.ip_forwardとcat /proc/sys/net/ipv4/ip_forwardです。ドットを含むインターフェース名などでは区切りに注意し、実際の/proc/sys/のパスを確認します。

一覧表示と保存は変更操作ではない

sysctl -a
sysctl vm.swappiness net.core.somaxconn kernel.pid_max

sysctl -aは公開されている値を広く表示しますが、非推奨などの除外項目や権限による読取エラーがあり、「すべてのカーネル設定」の一覧ではありません。調査では対象を指定した方が読みやすくなります。一覧を保存しても、読み取り専用項目などが含まれるため、その出力をそのままsysctl -pへ渡して復元しないでください。コマンドの意味はprocps-ngのsysctl(8)で確認できます。

カーネルパラメータの一時的な変更方法

sysctl -wは現在のカーネルへ書き込みます。設定ファイルを更新しないため通常は次の起動で起動設定が再適用されますが、再起動すれば変更前の値に必ず戻るわけではありません。サービスや管理ツールが途中で上書きすることもあります。変更前の実測値を記録し、戻す操作まで準備します。

例:vm.swappinessを一つだけ比較する

以下は、10を検証候補として選んだ場合の例です。低い値が有利とは限らないため、後述の意味と測定項目を確認してください。最初の3行は値の確認・記録、sudo sysctl -wが実際の変更です。

old_swappiness=$(sysctl -n vm.swappiness)
printf "変更前: %s\n" "$old_swappiness"
sysctl vm.swappiness

# 変更を許可した検証環境でのみ実行
sudo sysctl -w vm.swappiness=10
sysctl vm.swappiness

# 同じシェルで、検証前の値に戻す
sudo sysctl -w "vm.swappiness=$old_swappiness"
sysctl vm.swappiness

シェルを閉じると上の変数は失われるので、変更前の値は作業記録にも残します。変更後は値だけでなく、同じ負荷での応答時間、メモリ圧迫、スワップI/Oなどを比較します。値を書けたことと性能が改善したことは別です。

/proc/sysへ直接書き込む方法

# 上のsysctl -wと同じ項目への書き込み。両方を行う必要はありません。
printf "10\n" | sudo tee /proc/sys/vm/swappiness

sudo echo 10 > /proc/sys/vm/swappinessでは、リダイレクトを一般ユーザーのシェルが処理するため権限エラーになることがあります。teeなら書き込み側を管理者権限で実行できます。ただし権限があっても、読み取り専用項目やコンテナの制限などは解除されません。

カーネルパラメータの永続的な変更方法

/etc/sysctl.d/に目的別の設定を置く

一時変更で効果と互換性を確認してから、起動時に読み込まれる設定を用意します。systemdを使う環境では管理者用の/etc/sysctl.d/*.confが基本です。既存の管理方針を優先し、同じキーの重複定義を確認します。

# 設定の所在を調べるだけの操作
grep -RnsE "^[[:space:]]*vm[./]swappiness[[:space:]]*=" \
  /etc/sysctl.conf /etc/sysctl.d /run/sysctl.d \
  /usr/local/lib/sysctl.d /usr/lib/sysctl.d /lib/sysctl.d

存在しないパスのエラーは環境によって発生します。上の検索は通常の明示的な定義を探す補助であり、すべてのパターン指定や後から変更するサービスまで判定するものではありません。編集対象が既存ファイルなら、そのファイルを別名でバックアップし、変更理由と変更前の値を残します。以下は専用ファイルを作成・編集する例です。

sudoedit /etc/sysctl.d/90-local-vm.conf

ファイルの内容は次のようにします。10は検証して採用を決めた場合だけ指定してください。

# 検証済みの値。変更理由・日付・元の値を作業記録に残す
vm.swappiness = 10

対象ファイルだけを現在のカーネルへ適用する

sudo sysctl -p /etc/sysctl.d/90-local-vm.conf
sysctl vm.swappiness

-pはファイルを「表示」するオプションではなく、その内容を書き込む操作です。上のようにファイル名を指定すれば、意図せず他のファイルまで再適用する範囲を抑えられます。複数のキーがあるファイルで途中にエラーが出ても、先行する書き込みは戻りません。表示されたエラーと各対象の現在値を確認します。

/etc/sysctl.confとsysctl --systemの違い

  • sudo sysctl -p(ファイル名なし)はprocps-ngでは/etc/sysctl.confを適用します。
  • sudo sysctl --systemは設定ディレクトリ群と/etc/sysctl.confを読み、複数の設定を実際に適用します。確認だけのつもりで実行しないでください。
  • systemd-sysctlは/etc/sysctl.confを直接読む仕組みではありません。ディストリビューション側のリンクや別サービスで読み込まれる場合があるため、起動時の処理を確認します。

同じファイル名なら/etc側がベンダー側より優先され、異なるファイル名は辞書順で処理されます。procps-ngの--systemでは最後の/etc/sysctl.confが上書き要因になります。「99という名前にすれば必ず最終値になる」とは限りません。詳細はsystemdのsysctl.dとprocps-ngのsysctl.conf(5)を参照してください。

よく使用されるカーネルパラメータの例

net.ipv4.ip_forward:IPv4転送

0は無効、1は有効です。ルーターやゲートウェイの要件があるときに検討します。転送を有効にするだけでは経路、ファイアウォール、NATは設定されません。また、この値の変更は関連設定をホスト/ルーターの既定値へリセットする特殊な作用があるため、初心者向けの動作テスト用に切り替える項目ではありません。

sysctl net.ipv4.ip_forward

vm.swappiness:スワップとファイルキャッシュの回収判断

現在の上流ドキュメントでの範囲は0~200、既定値は60です。メモリ使用率の閾値ではなく、スワップI/Oとファイル由来ページのI/Oの相対コストを表します。低い値はスワップを相対的に高コストと見なしますが、「10なら高速化」「0ならスワップ完全無効」という意味ではありません。zramなどでは100を超える値が候補になる場合もあります。実機の設定とカーネルのswappiness説明を照合します。

fs.file-max:システム全体のファイルハンドル上限

カーネルが割り当てるファイルハンドルの上限です。fs.file-nrで使用状況も確認します。プロセス単位のRLIMIT_NOFILE(シェルのulimit -nなど)やfs.nr_openとは別です。アプリの「Too many open files」を見て、いきなり全体の上限を変更しないでください。100000への固定は、現在値より下げてしまう場合もあります。上流のfile-max / file-nr説明も確認します。

sysctl fs.file-max fs.file-nr fs.nr_open
ulimit -Sn
ulimit -Hn

ulimitは現在のシェルの制限です。そこから起動していないサービスの制限を示すとは限らないので、対象サービスの設定も別に確認します。

kernel.pid_max:PIDの折り返し値

PID割り当てがこの値に達すると折り返し、pid_max以上のPIDは割り当てられません。「同時実行できるプロセス数」を直接指定する値ではなく、スレッド数上限、ユーザーやサービス、cgroupの制限も関係します。プロセス生成失敗の原因を調べずに4194304へ固定しないでください。pid_maxの定義を参照します。

sysctl kernel.pid_max kernel.threads-max

パフォーマンス改善のためのカーネルパラメータ調整例

vm.swappinessは同じ負荷で変更前後を比較する

値を下げることでスワップI/Oが減っても、ファイルキャッシュの回収が増えて処理が遅くなる可能性があります。vmstatなどでI/Oと待ち時間を観察し、アプリケーションの応答時間や処理件数を同じ条件で比較します。差が出なければ変更を採用しない、悪化すれば記録した値に戻す、という判断基準を先に決めます。

vmstat 1 5
cat /proc/meminfo
cat /proc/swaps

fs.inotify.max_user_watches:監視数不足を調べる

これは実ユーザーIDごとのinotify監視数上限です。増やすのは監視対象が上限に達した場合の対策であり、一般的な高速化ではありません。max_user_instancesやイベントキュー上限とも区別します。524288を無条件に指定せず、監視対象の除外、必要数、カーネルメモリ消費を検討します。inotify(7)に各制限が説明されています。

sysctl fs.inotify.max_user_watches \
  fs.inotify.max_user_instances fs.inotify.max_queued_events

net.core.somaxconn:listenバックログの上限

listen()のバックログ上限です。上流の既定値はLinux 5.4から4096で、それ以前は128でした。したがって1024へ変更すると、上限を下げる可能性があります。アプリのbacklog設定とaccept処理を併せて確認し、未完了接続用のtcp_max_syn_backlogと混同しないでください。

sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog

net.ipv4.tcp_tw_reuse:TIME_WAIT再利用は安易に変更しない

現在の上流仕様では0が無効、1が全体で有効、2がループバックに限定して有効で、既定値は2です。TIME_WAITが多いことだけでは異常と判断できません。公式資料も専門的な助言なしの変更を勧めていないため、接続再利用や接続数の原因を先に調べます。

sysctl net.ipv4.tcp_tw_reuse

ネットワーク項目の定義と既定値はLinuxカーネルのIP Sysctlを参照してください。配布版の初期設定は上流の既定値と異なる場合があります。

セキュリティ向上のためのカーネルパラメータ調整例

セキュリティ項目はホストの役割や経路設計に依存します。まず現在値と要件を照合し、リモート接続中のネットワーク変更にはコンソールなど別経路の復旧手段を用意します。IPv4の設定を変えてもIPv6の設定は別です。

rp_filter:厳密モードが使えない経路もある

IPv4のrp_filterは0が検証なし、1が厳密、2が緩い検証です。非対称ルーティングでは厳密モードが正当な通信を落とす場合があります。有効値にはallと対象インターフェースの値の最大値が使われるため、両方を確認します。送信元検証の一部であって、すべての偽装や攻撃を防ぐ機能ではありません。

sysctl net.ipv4.conf.all.rp_filter
sysctl net.ipv4.conf.default.rp_filter
# 実際のインターフェース名に置き換えて確認
cat /proc/sys/net/ipv4/conf/eth0/rp_filter

icmp_echo_ignore_all:ping応答停止は万能な防御ではない

1ではIPv4 ICMP Echoへの応答を止めますが、通信帯域を使い切る攻撃を防ぐものではなく、監視や疎通確認も失われます。公開サービスの防御をこの設定だけに依存せず、必要な監視とネットワーク側の対策に合わせて判断します。

sysctl net.ipv4.icmp_echo_ignore_all

kernel.randomize_va_space:ASLRの状態を確認する

0は無効、1はスタック・mmapなどのランダム化、2はさらにヒープを含みます。既定値はアーキテクチャやCONFIG_COMPAT_BRKなどに依存するため、常に2とは限りません。ASLRは脆弱性自体を修正する仕組みではありません。互換性を確認し、実行ファイル側のPIE等と合わせて評価します。上流のASLR説明を参照してください。

sysctl kernel.randomize_va_space

accept_redirects / send_redirects:allだけでは不十分な場合

IPv4のaccept_redirectsの有効判定は転送モードとall・各インターフェースの組み合わせで決まります。ホストモードでは片方が有効なら受信が有効になり、send_redirectsも片方が有効なら送信が有効です。all=0だけを設定して全インターフェースで無効化したつもりにならないでください。defaultは新規インターフェース向けなので、既存の対象も確認します。

sysctl net.ipv4.conf.all.accept_redirects \
  net.ipv4.conf.default.accept_redirects \
  net.ipv4.conf.all.send_redirects \
  net.ipv4.conf.default.send_redirects
# 実際のインターフェース名に置き換えて確認
cat /proc/sys/net/ipv4/conf/eth0/accept_redirects
cat /proc/sys/net/ipv4/conf/eth0/send_redirects

組み合わせの仕様はIP Sysctlの各項目を参照し、利用しているネットワーク管理ツールの設定と矛盾しないようにします。

カーネルパラメータ変更の際の注意点と切り戻し

  • 変更前:OS・カーネル、対象の現在値、既存設定ファイル、影響サービスと復旧経路を記録します。設定ファイルのバックアップだけでは、現在値を記録したことにはなりません。
  • 変更中:一項目ずつ適用し、コマンドの成否と読み返した値を確認します。知らないキーや権限エラーを無視するオプションで隠さないようにします。
  • 変更後:サービスの正常性と比較指標を確認します。sysctlへの書き込みは通常実行時に反映されるので、値が変わらない理由を調べずに再起動で解決しようとしないでください。新規接続や新規プロセスから効くかどうかは項目ごとの仕様です。
  • 永続化の検証:計画した再起動後に同じキーを読み返し、起動サービスやネットワーク管理機構に上書きされていないかを確認します。

元に戻すときは「設定ファイル」と「現在値」を別々に戻す

今回編集した設定ファイルをバックアップから戻すか、今回作った専用ファイルの対象行を取り除きます。ファイルを削除・修正しただけでは、すでに書き込まれたカーネル値は戻りません。対象キーに記録済みの変更前の値を書き戻し、サービスと値を再確認します。無関係な設定を含むファイルを削除しないでください。

ip_forwardのように他の項目へ作用する変更では、一つの値を元に戻すだけで状態全体が復元されるとは限りません。対象と関連項目を含めた切り戻し計画が必要です。

値が反映されないときの確認順序

  • No such file / cannot stat:キー名、実際の/proc/sys/のパス、カーネル機能やモジュールの有無を確認します。
  • Permission denied / Read-only file system:権限、読み取り専用項目、コンテナ・ホスト側の制限を確認します。権限を広げて回避する前に管理者の設定意図を確認します。
  • Invalid argument:値の範囲や形式、カーネルの対応を確認します。
  • 直後は合っているが後で戻る:重複設定、起動時の読み込み順、構成管理やネットワークサービスを確認します。systemdではjournalctl -u systemd-sysctlも調査材料になります。

まとめ

Linuxのsysctl設定は、現在値の確認 → 一時変更 → 効果の測定 → 必要な場合だけ永続化 → 再起動後の確認の順で進めます。特にネットワークの既定値やセキュリティ設定は、古い数値や一括コピペに頼らず、実行環境と公式資料を照合することが大切です。問題が起きたときに戻せるよう、設定ファイルと実行中の値をそれぞれ記録しておきましょう。

参照確認日:2026年10月20日。掲載コマンドは操作例です。対象ホストでの性能改善や設定適用を検証した結果ではありません。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次