9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

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の強み。

この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?