メインコンテンツへスキップ
  1. Linux 関連記事一覧/
  2. Ubuntu 26.04 LTS Server/

Ubuntu 26.04 LTS Server のカーネルパラメータ設定(sysctl)

目次

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

sysctl は、動作中のカーネルの設定値を確認・変更する仕組みです。メモリの使い方、ネットワークの挙動、ファイル監視の上限などを、カーネルを再構築したり再起動したりせずに変更できます。

設定値は /proc/sys/ 配下のファイルとして見えており、sysctl コマンドはこれを読み書きします。パラメータ名のドットは、ディレクトリの区切りに対応します(vm.swappiness/proc/sys/vm/swappiness)。

現在の値を確認する

すべてのパラメータは sysctl -a で一覧できます。この環境では約1,200項目あります。

パラメータの一覧表示コマンド
sysctl -a

個別に確認する場合はパラメータ名を指定します。複数を並べて指定できます。

パラメータの確認コマンド
sysctl [PARAMETER]
入力箇所入力内容
[PARAMETER]パラメータ名(vm.swappiness など)
パラメータの確認 実行例
kazulog@sv1:~$ sysctl -a 2>/dev/null | wc -l
1189
kazulog@sv1:~$ sysctl net.ipv4.ip_forward vm.swappiness fs.file-max fs.inotify.max_user_instances
net.ipv4.ip_forward = 0
vm.swappiness = 60
fs.file-max = 9223372036854775807
fs.inotify.max_user_instances = 128
kazulog@sv1:~$ cat /proc/sys/vm/swappiness
60
kazulog@sv1:~$

sysctl vm.swappinesscat /proc/sys/vm/swappiness は同じ値を表示します。どちらも同じものを見ているためです。

一時的に変更する

sysctl -w で値を変更します。/proc/sys/ のファイルに直接書き込んでも同じです。

パラメータの変更コマンド
sudo sysctl -w [PARAMETER]=[VALUE]
入力箇所入力内容
[PARAMETER]変更するパラメータ名
[VALUE]設定する値
パラメータの変更 実行例
kazulog@sv1:~$ sudo sysctl -w vm.swappiness=10
vm.swappiness = 10
kazulog@sv1:~$ sysctl vm.swappiness
vm.swappiness = 10
kazulog@sv1:~$ cat /proc/sys/vm/swappiness
10
kazulog@sv1:~$ echo 20 | sudo tee /proc/sys/vm/swappiness
20
kazulog@sv1:~$ sysctl vm.swappiness
vm.swappiness = 20
この方法で変更した値は再起動すると失われます。 次のとおり、再起動後は既定値の60に戻ります。設定を残す場合は後述の設定ファイルを使ってください。
再起動後の値 実行例
kazulog@sv1:~$ uptime -p
up 0 minutes
kazulog@sv1:~$ sysctl vm.swappiness
vm.swappiness = 60

設定を永続化する

再起動後も設定を残すには、/etc/sysctl.d/ 配下に .conf ファイルを作成します/etc/sysctl.conf は Ubuntu 26.04 には存在しません。

設定ファイルの作成コマンド
printf 'vm.swappiness = 10\nnet.core.somaxconn = 1024\n' | sudo tee /etc/sysctl.d/99-[NAME].conf
入力箇所入力内容
[NAME]設定の内容が分かる名前(任意)

作成しただけでは反映されません。sysctl --system ですべての設定ファイルを読み込み直します。

設定の反映コマンド
sudo sysctl --system
設定ファイルの作成と反映 実行例
kazulog@sv1:~$ printf 'vm.swappiness = 10\nnet.core.somaxconn = 1024\n' | sudo tee /etc/sysctl.d/99-kazulog.conf
vm.swappiness = 10
net.core.somaxconn = 1024
kazulog@sv1:~$ sudo sysctl --system 2>&1 | tail -4
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
vm.swappiness = 10
net.core.somaxconn = 1024
kazulog@sv1:~$ sysctl vm.swappiness net.core.somaxconn
vm.swappiness = 10
net.core.somaxconn = 1024
kazulog@sv1:~$

再起動しても値が維持されます。

再起動後も維持されることの確認 実行例
kazulog@sv1:~$ uptime -p
up 0 minutes
kazulog@sv1:~$ sysctl vm.swappiness net.core.somaxconn
vm.swappiness = 10
net.core.somaxconn = 1024

設定ファイルの読み込み順

sysctl --system は複数のディレクトリから設定を読み込みます。読み込んだファイルは実行時に表示されます。

読み込まれる設定ファイル 実行例
kazulog@sv1:~$ sudo sysctl --system 2>&1 | head -14
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
* Applying /usr/lib/sysctl.d/10-coredump-debian.conf ...
* Applying /usr/lib/sysctl.d/50-default.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/55-bufferbloat.conf ...
* Applying /usr/lib/sysctl.d/55-console-messages.conf ...
* Applying /usr/lib/sysctl.d/55-ipv6-privacy.conf ...
* Applying /usr/lib/sysctl.d/55-kernel-hardening.conf ...
* Applying /usr/lib/sysctl.d/55-magic-sysrq.conf ...
* Applying /usr/lib/sysctl.d/55-map-count.conf ...
* Applying /usr/lib/sysctl.d/55-network-security.conf ...
* Applying /usr/lib/sysctl.d/55-ptrace.conf ...
* Applying /usr/lib/sysctl.d/55-zeropage.conf ...
* Applying /etc/sysctl.d/99-cloudimg-ipv6.conf ...
kazulog@sv1:~$
ディレクトリ用途
/usr/lib/sysctl.d/パッケージが置く設定。編集しない
/run/sysctl.d/実行時に生成される設定
/etc/sysctl.d/管理者が設定を置く場所
同じパラメータが複数のファイルにある場合、後から読まれたファイルの値が有効になります。 ファイルはディレクトリをまたいでファイル名順に読まれるため、番号が大きいほうが優先されます。/etc/sysctl.d/99- で始まる名前がよく使われるのはこのためです。

次は、同じ vm.swappiness10-99- の2つのファイルに書いた場合の例です。両方が適用され、最後に読まれた 99- の値が残ります。

読み込み順の確認 実行例
kazulog@sv1:~$ echo 'vm.swappiness = 30' | sudo tee /etc/sysctl.d/10-kazulog-test.conf
vm.swappiness = 30
kazulog@sv1:~$ grep -H . /etc/sysctl.d/10-kazulog-test.conf /etc/sysctl.d/99-kazulog.conf
/etc/sysctl.d/10-kazulog-test.conf:vm.swappiness = 30
/etc/sysctl.d/99-kazulog.conf:vm.swappiness = 10
/etc/sysctl.d/99-kazulog.conf:net.core.somaxconn = 1024
kazulog@sv1:~$ sudo sysctl --system 2>&1 | grep -E 'kazulog|swappiness'
* Applying /etc/sysctl.d/10-kazulog-test.conf ...
* Applying /etc/sysctl.d/99-kazulog.conf ...
vm.swappiness = 30
vm.swappiness = 10
kazulog@sv1:~$ sysctl vm.swappiness
vm.swappiness = 10
kazulog@sv1:~$

設定が効いていることを確認する

値が変わったことだけでなく、実際の挙動が変わることも確認できます。ここではファイル監視の上限 fs.inotify.max_user_instances を例にします。このパラメータは、1ユーザーが同時に作成できるファイル監視の数を制限するものです。

次のスクリプトは、ファイル監視を3つ起動して、それぞれ作成できたかを表示します。

確認用スクリプト
kazulog@sv1:~$ cat ino_test.sh
#!/bin/bash
# 監視を3つ起動して、それぞれ作成できたかを表示する
for i in 1 2 3; do
  inotifywait -q -m /tmp > /dev/null 2>/tmp/ino$i.err &
  sleep 1
  if [ -s /tmp/ino$i.err ]; then echo "watcher $i: $(head -1 /tmp/ino$i.err)"; else echo "watcher $i: OK"; fi
done
sleep 1; pkill -f "inotifywait -q -m /tmp"; rm -f /tmp/ino*.err
kazulog@sv1:~$

上限を2に下げると監視を作成できなくなり、既定値の128に戻すと作成できるようになります。

上限を変えたときの挙動 実行例
kazulog@sv1:~$ sysctl fs.inotify.max_user_instances
fs.inotify.max_user_instances = 128
kazulog@sv1:~$ sudo sysctl -w fs.inotify.max_user_instances=2
fs.inotify.max_user_instances = 2
kazulog@sv1:~$ ./ino_test.sh
watcher 1: Couldn't initialize inotify: Too many open files
watcher 2: Couldn't initialize inotify: Too many open files
watcher 3: Couldn't initialize inotify: Too many open files
kazulog@sv1:~$ sudo sysctl -w fs.inotify.max_user_instances=128
fs.inotify.max_user_instances = 128
kazulog@sv1:~$ ./ino_test.sh
watcher 1: OK
watcher 2: OK
watcher 3: OK

上限に達すると Too many open files というエラーになります。監視を使うソフトウェア(バックアップ、同期ツール、コンテナ基盤など)を多数動かすサーバーでは、このパラメータの引き上げが必要になることがあります。

設定を元に戻す

作成した設定ファイルを削除します。

設定ファイルの削除コマンド
sudo rm /etc/sysctl.d/99-[NAME].conf
設定ファイルの削除 実行例
kazulog@sv1:~$ sudo rm /etc/sysctl.d/99-kazulog.conf
kazulog@sv1:~$ sudo sysctl --system > /dev/null 2>&1; sysctl vm.swappiness net.core.somaxconn
vm.swappiness = 10
net.core.somaxconn = 1024
kazulog@sv1:~$ ls /etc/sysctl.d/
99-cloudimg-ipv6.conf  README.sysctl
ファイルを削除して sysctl --system を実行しても、値は元に戻りません。 sysctl --system は設定ファイルに書かれている値を適用するだけで、消えた設定を既定値へ戻す動作はしないためです。上の例でも vm.swappiness は10のままです。元に戻すには、再起動するか、既定値を明示的に設定してください。
再起動後に既定値へ戻ることの確認 実行例
kazulog@sv1:~$ uptime -p
up 0 minutes
kazulog@sv1:~$ sysctl vm.swappiness net.core.somaxconn
vm.swappiness = 60
net.core.somaxconn = 4096

よく使うパラメータ

パラメータ内容
net.ipv4.ip_forwardパケット転送の有効・無効。サーバーをルータとして使う場合に 1 にする
net.ipv4.conf.all.rp_filter受信したパケットの送信元アドレスを経路表と照合する(リバースパスフィルタ)
net.core.somaxconn接続待ちキューの上限。同時接続の多いサーバーで引き上げる
net.ipv4.tcp_max_syn_backlogSYN 受信時のキューの上限
vm.swappinessスワップの使いやすさ(0〜100)。値が小さいほどスワップを避ける
vm.max_map_count1プロセスが持てるメモリマップの上限。データベースや検索エンジンで引き上げる
fs.file-maxシステム全体で開けるファイルの上限
fs.inotify.max_user_instances1ユーザーが作成できるファイル監視の数
fs.inotify.max_user_watches1ユーザーが監視できるファイル・ディレクトリの数

検証環境と実行ログ

本記事の実行例は、CML 上の Ubuntu 26.04 LTS Server で採取したものです。各手順の実行ログを以下からダウンロードできます。

手順実行ログ
初期状態(既定値と設定ファイル)log
一時的な変更と読み込み順の確認log
再起動して値が失われることの確認log
設定ファイルによる永続化log
再起動後も維持されることの確認log
設定ファイルの読み込み順log
inotify の上限による挙動の違いlog
設定ファイルの削除log
削除後に再起動した状態log

参考リンク

sysctl.d(5) - systemd documentation

関連記事

Ubuntu 公式ページ