14.7.使用 sysctl(8) 进行优化

sysctl(8) 是用来对正在运行的 FreeBSD 系统进行修改的命令。这包括许多 TCP/IP 协议栈和虚拟内存系统的高级选项,对于有经验的系统管理员来说,可以极大地提高性能。使用 sysctl(8) 可以对超过五百个系统变量进行读取和设置。

在其核心部分,sysctl(8) 有两个功能:读取和修改系统设置。

要查看所有可读变量,请输入:

% sysctl -a

要查看某个特定的变量,请指定其名称:

% sysctl kern.maxproc
kern.maxproc: 1044

要设置一个特定的变量,使用语法 变量=值

# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000

sysctl 变量值通常是字符串、数字或布尔值,其中布尔值为 1 时表示 yes,为 0 表示 no。

要在机器每次启动时自动设置一些变量,可以将其添加到 /etc/sysctl.conf 中。更多信息,请参考 sysctl.conf(5) 手册页面和 sysctl.conf

14.7.1. sysctl.conf

sysctl(8) 的配置文件 /etc/sysctl.conf,看起来很像 /etc/rc.conf。值是以 变量=值 的形式设置的,指定的值在系统进入多用户模式后被设置。并非所有的变量都可以在该模式下进行设置。

例如,为了关闭对 fatal 信号退出的记录,并防止用户看到其他用户启动的进程,可以在 /etc/sysctl.conf 中设置以下参数:

# Do not log fatal signal exits (e.g., sig 11)
kern.logsigexit=0

# Prevent users from seeing information about processes that
# are being run under another UID.
security.bsd.see_other_uids=0

14.7.2.只读 sysctl(8)

在某些情况下,可能需要修改只读 sysctl(8) 值,这将需要重启系统。

例如,在某些型号的笔记本电脑上,cardbus(4) 设备不能探测内存范围,并会出现类似的错误:

cbb0: Could not map register memory
device_probe_and_attach: cbb0 attach returned 12

修复这个问题时,需要更改 sysctl(8) 的只读设定,为此,可向 /boot/loader.conf 中添加 hw.pci.allow_unsupported_io_range=1 并重启。然后 cardbus(4) 应该就能够正常运行了。