カーネルパラメータの確認と変更方法
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.swappiness と cat /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 = 20kazulog@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 --systemkazulog@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.swappiness を 10- と 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].confkazulog@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.sysctlsysctl --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_backlog | SYN 受信時のキューの上限 |
vm.swappiness | スワップの使いやすさ(0〜100)。値が小さいほどスワップを避ける |
vm.max_map_count | 1プロセスが持てるメモリマップの上限。データベースや検索エンジンで引き上げる |
fs.file-max | システム全体で開けるファイルの上限 |
fs.inotify.max_user_instances | 1ユーザーが作成できるファイル監視の数 |
fs.inotify.max_user_watches | 1ユーザーが監視できるファイル・ディレクトリの数 |
検証環境と実行ログ
本記事の実行例は、CML 上の Ubuntu 26.04 LTS Server で採取したものです。各手順の実行ログを以下からダウンロードできます。
| 手順 | 実行ログ |
|---|---|
| 初期状態(既定値と設定ファイル) | log |
| 一時的な変更と読み込み順の確認 | log |
| 再起動して値が失われることの確認 | log |
| 設定ファイルによる永続化 | log |
| 再起動後も維持されることの確認 | log |
| 設定ファイルの読み込み順 | log |
| inotify の上限による挙動の違い | log |
| 設定ファイルの削除 | log |
| 削除後に再起動した状態 | log |
参考リンク
sysctl.d(5) - systemd documentation
関連記事
- Ubuntu 26.04 LTS Server のホスト名の変更(hostnamectl)
- Ubuntu 26.04 LTS Server のパッケージ更新(apt update / upgrade)
- Ubuntu 26.04 LTS Server のタイムゾーン設定と時刻同期
- Ubuntu 26.04 LTS Server のユーザー作成と sudo 権限の設定
- Ubuntu 26.04 LTS Server の SSH サーバー設定(公開鍵認証)
- Ubuntu 26.04 LTS Server のサービス管理(systemctl)とログ確認(journalctl)
- Ubuntu 26.04 LTS Server の自動更新設定(unattended-upgrades)
- Ubuntu 26.04 LTS Server の初期設定を自動化する(cloud-init)
- Ubuntu 26.04 LTS Server のカーネルパラメータ設定(sysctl)
- Ubuntu 26.04 LTS Server のネットワーク設定(Netplan)
- Ubuntu 26.04 LTS Server の名前解決設定(systemd-resolved)
- Ubuntu 26.04 LTS Server の NTP 同期先の変更(chrony)
- Ubuntu 26.04 LTS Server のスタティックルート設定(Netplan)
- neovim 公式サイトから最新バージョンをインストールする手順 Ubuntu 26.04 LTS Server