はじめに
Linuxでもおなじみのsysctl。
でもFreeBSDの方がパラメータが多くて高機能だったりする。
今回はカーネルパラメータをいじってシステムをチューニングしてみよう。
sysctlの基本
値の確認
# 特定のパラメータ
sysctl kern.hostname
# kern.hostname: freebsd.example.com
# 階層以下を全部表示
sysctl kern
# kern.ostype: FreeBSD
# kern.osrelease: 14.2-RELEASE
# ...
# 全パラメータ
sysctl -a | wc -l
# 約5000個
値の変更
# 一時的に変更
sysctl kern.hostname="newname.example.com"
# kern.hostname: freebsd.example.com -> newname.example.com
# 永続化(/etc/sysctl.confに追加)
echo 'kern.hostname="newname.example.com"' >> /etc/sysctl.conf
パラメータの説明を見る
sysctl -d kern.maxproc
# kern.maxproc: Maximum number of processes
sysctl -d kern.maxfiles
# kern.maxfiles: Maximum number of files
主要な階層
sysctl
├── kern # カーネル全般
├── vm # 仮想メモリ
├── vfs # ファイルシステム
├── net # ネットワーク
├── hw # ハードウェア
├── machdep # アーキテクチャ依存
├── security # セキュリティ
├── debug # デバッグ
├── dev # デバイス
└── user # ユーザー空間の制限
システム情報
ハードウェア情報
sysctl hw.model
# hw.model: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
sysctl hw.ncpu
# hw.ncpu: 28
sysctl hw.physmem
# hw.physmem: 68719476736 (64GB)
sysctl hw.usermem
# hw.usermem: 66430898176
sysctl hw.pagesize
# hw.pagesize: 4096
OS情報
sysctl kern.ostype
# kern.ostype: FreeBSD
sysctl kern.osrelease
# kern.osrelease: 14.2-RELEASE
sysctl kern.version
# kern.version: FreeBSD 14.2-RELEASE ...
sysctl kern.boottime
# kern.boottime: { sec = 1701234567, usec = 123456 } Sun Dec 1 12:34:56 2024
パフォーマンスチューニング
プロセス/ファイル制限
# 最大プロセス数
sysctl kern.maxproc
# kern.maxproc: 14766
sysctl kern.maxproc=32768
# 最大ファイル数
sysctl kern.maxfiles
# kern.maxfiles: 26612
sysctl kern.maxfiles=65536
# 1プロセスあたりの最大ファイル数
sysctl kern.maxfilesperproc
# kern.maxfilesperproc: 23951
sysctl kern.maxfilesperproc=32768
メモリ管理
# スワップ開始の閾値
sysctl vm.swappiness # ←これはLinux、FreeBSDにはない
# 代わりに
sysctl vm.pageout_deficit
sysctl vm.swap_idle_enabled
sysctl vm.swap_idle_threshold1
# ファイルキャッシュ
sysctl vfs.hirunningspace
sysctl vfs.lorunningspace
# ZFS ARCサイズ
sysctl vfs.zfs.arc_max
sysctl vfs.zfs.arc_min
ZFSチューニング
# ARC(Adaptive Replacement Cache)最大サイズ
sysctl vfs.zfs.arc_max=8589934592 # 8GB
# ARC最小サイズ
sysctl vfs.zfs.arc_min=1073741824 # 1GB
# L2ARCの設定
sysctl vfs.zfs.l2arc_write_max=8388608 # 8MB/s
sysctl vfs.zfs.l2arc_write_boost=8388608
# プリフェッチ
sysctl vfs.zfs.prefetch_disable=0
ネットワークチューニング
TCPバッファ
# 受信バッファ
sysctl net.inet.tcp.recvspace=65536
# 送信バッファ
sysctl net.inet.tcp.sendspace=65536
# 自動チューニング
sysctl net.inet.tcp.recvbuf_auto=1
sysctl net.inet.tcp.sendbuf_auto=1
# 最大バッファサイズ
sysctl net.inet.tcp.recvbuf_max=16777216
sysctl net.inet.tcp.sendbuf_max=16777216
TCP接続
# SYNキュー
sysctl net.inet.tcp.syncache.hashsize=512
sysctl net.inet.tcp.syncache.bucketlimit=100
# keepalive
sysctl net.inet.tcp.keepidle=7200000 # 2時間(ミリ秒)
sysctl net.inet.tcp.keepintvl=75000 # 75秒
sysctl net.inet.tcp.keepcnt=8
# TIME_WAIT
sysctl net.inet.tcp.msl=30000 # 30秒(デフォルト)
セキュリティ関連
# SYN Cookie
sysctl net.inet.tcp.syncookies=1
# ブラックホール検出
sysctl net.inet.tcp.blackhole=2
sysctl net.inet.udp.blackhole=1
# リダイレクト無視
sysctl net.inet.icmp.drop_redirect=1
IP転送(ルーター化)
sysctl net.inet.ip.forwarding=1
sysctl net.inet6.ip6.forwarding=1
セキュリティ設定
アクセス制御
# 非rootがrawソケットを使えなくする
sysctl net.inet.ip.raw.maxdgram=8192
sysctl net.inet.ip.raw.recvspace=8192
# execでsetuidを無視
sysctl kern.sugid_coredump=0
jailセキュリティ
# jail内でのrawソケット
sysctl security.jail.allow_raw_sockets=0
# jail内でのプロセス可視性
sysctl security.jail.sysvipc_allowed=0
# chflags制限
sysctl security.jail.chflags_allowed=0
ランダム化
# ASLR (Address Space Layout Randomization)
sysctl kern.elf64.aslr.enable=1
sysctl kern.elf64.aslr.pie_enable=1
sysctl kern.elf64.aslr.honor_sbrk=0
デバッグ・監視
カーネルパニック設定
# パニック時にデバッガに入る
sysctl debug.debugger_on_panic=1
# パニック時にコアダンプ
sysctl debug.trace_on_panic=1
# パニック後の動作
sysctl kern.panic_reboot_wait_time=-1 # 待機
プロセス監視
# 現在のプロセス数
sysctl kern.lastpid
# kern.lastpid: 12345
# ゾンビプロセス数(カスタム計算が必要)
sysctl kern.proc.all # 全プロセス情報
ロードアベレージ
sysctl vm.loadavg
# vm.loadavg: { 0.15 0.25 0.30 }
読み取り専用パラメータ
一部のパラメータは変更できない。
sysctl -W kern.ostype="Linux"
# sysctl: kern.ostype: Operation not permitted
# 読み取り専用かどうか確認
sysctl -T kern.ostype
# kern.ostype: String, Read-only
/etc/sysctl.confの例
# /etc/sysctl.conf
# ネットワーク
net.inet.ip.forwarding=1
net.inet.tcp.syncookies=1
net.inet.tcp.recvspace=65536
net.inet.tcp.sendspace=65536
# ファイル/プロセス制限
kern.maxfiles=65536
kern.maxproc=32768
# セキュリティ
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
kern.randompid=1
# ZFS
vfs.zfs.arc_max=8589934592
# デバッグ
kern.coredump=1
kern.corefile=/var/coredumps/%N.core
適用
# 即座に適用
sysctl -f /etc/sysctl.conf
# 起動時に自動適用
# (デフォルトで有効)
実用的なワンライナー
# システム稼働時間
sysctl -n kern.boottime | awk '{print $4}' | xargs -I {} date -j -f "%s" {}
# CPU温度(対応システムのみ)
sysctl -a | grep temperature
# メモリ使用状況
sysctl -n hw.physmem hw.usermem | awk 'NR==1{total=$1} NR==2{used=total-$1; printf "Used: %.2f GB / %.2f GB\n", used/1024/1024/1024, total/1024/1024/1024}'
# ネットワーク統計
sysctl net.inet.tcp.stats
sysctl net.inet.udp.stats
# ZFS ARC状態
sysctl -a | grep vfs.zfs.arc
loader.confとの違い
- sysctl.conf: 起動後に適用、動的に変更可能
- loader.conf: カーネルロード時に適用、再起動が必要
# loader.confでしか設定できない例
kern.ipc.semmni=256
kern.ipc.semmns=512
kern.ipc.semmnu=256
まとめ
FreeBSDのsysctl:
- 5000個以上のパラメータ
- ネットワーク、メモリ、セキュリティを細かく制御
-
/etc/sysctl.confで永続化 -
sysctl -dで説明が見られる
Linuxより細かく設定できるのがFreeBSDの強み。
この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!