sysctl -a 命令会列出当前Linux内核所有可配置的参数及其当前值。这些参数允许你在系统运行时动态地调整内核的行为,而无需重新编译内核或重启系统。
内容非常多,因为内核有很多可调的方面。我们可以把它们大致分为几个主要类别:
kernel.*: 内核核心参数
vm.*: 虚拟内存管理 (Virtual Memory)
net.*: 网络相关参数 (Networking)
fs.*: 文件系统相关参数 (File System)
dev.*: 特定设备参数
abi.*: 应用程序二进制接口 (Application Binary Interface)
user.*: 用户命名空间限制
下面我会对每一类进行解释,并列举一些常见的、重要的参数:
1. kernel.* (内核核心参数)
这类参数控制着内核的许多基本行为。
kernel.hostname = your_hostname
解释: 系统的主机名。
kernel.domainname = (none)
解释: 系统的 NIS/YP 域名。
kernel.ostype = Linux
解释: 操作系统类型。
kernel.osrelease = 5.15.0-76-generic (示例版本号)
解释: 操作系统内核版本号。
kernel.version = #83~20.04.1-Ubuntu SMP Mon Jun 5 11:53:06 UTC 2023 (示例)
解释: 内核编译的具体版本信息,包括编译日期等。
kernel.panic = 0
解释: 当内核发生严重错误 (panic) 时,系统在多少秒后自动重启。0 表示不自动重启。
kernel.panic_on_oops = 1
解释: 当内核发生 oops (一种不那么严重的错误,但仍有问题) 时是否触发 panic。
kernel.shmmax = 18446744073692774399 (示例,非常大的值)
解释: 单个共享内存段的最大尺寸(字节)。对数据库等应用很重要。
kernel.shmall = 18446744073692774399 (示例,非常大的值)
解释: 系统范围内共享内存总页数。
kernel.shmmni = 4096
解释: 系统范围内共享内存段的最大数量。
kernel.msgmax = 65536
解释: 单个消息队列中消息的最大字节数。
kernel.msgmnb = 65536
解释: 单个消息队列的最大字节数。
kernel.msgmni = 32000
解释: 系统中消息队列标识符的最大数量。
kernel.sem = 250 32000 32 128
解释: System V 信号量参数 (SEMMSL, SEMMNS, SEMOPM, SEMMNI)。
kernel.sysrq = 1
解释: 是否启用 "Magic SysRq key"。这是一个调试工具,允许通过特定组合键直接向内核发送命令。
kernel.pid_max = 32768
解释: 系统中进程ID的最大值。
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E (Ubuntu 特有)
解释: 当程序崩溃产生 core dump 文件时,文件的命名模式或处理程序。Ubuntu 使用 apport 来收集崩溃报告。
kernel.randomize_va_space = 2
解释: 地址空间布局随机化 (ASLR) 的级别,用于增强安全性。2 表示完全随机化。
kernel.threads-max = ...
解释: 系统支持的最大线程数。
2. vm.* (虚拟内存管理)
这类参数控制内核如何管理内存,包括物理内存和交换空间 (swap)。
vm.swappiness = 60
解释: 内核使用交换空间的积极程度。值从 0 到 100。0 表示尽可能不使用 swap,100 表示积极使用 swap。默认 60。服务器上如果有足够内存,可以适当调低。
vm.dirty_background_ratio = 10
解释: 当脏页 (已修改但未写入磁盘的内存页) 占总可用内存的百分比达到此值时,内核后台进程开始将脏页写回磁盘。
vm.dirty_ratio = 20
解释: 当脏页占总可用内存的百分比达到此值时,进行写操作的进程会被阻塞,直到足够的脏页被写回磁盘。
vm.vfs_cache_pressure = 100
解释: 内核回收用于目录和inode缓存的内存的倾向性。值越大,回收越积极。
vm.overcommit_memory = 0
解释: 内存分配策略。
0: 内核执行启发式内存过量分配处理,通常会允许适度的过量分配,但如果明显超出,则会拒绝。
1: 内核总是允许过量分配,不进行检查。
2: 内核不允许过量分配超过 (SwapTotal + RAM * vm.overcommit_ratio / 100) 的内存。
vm.overcommit_ratio = 50
解释: 当 vm.overcommit_memory 设置为 2 时,允许过量分配的物理内存百分比。
vm.min_free_kbytes = ...
解释: 强制Linux VM保留的最小可用千字节数。确保系统在内存紧张时仍能执行关键操作。
vm.nr_hugepages = 0
解释: 配置的巨页 (Huge Pages) 数量。巨页可以提高某些高性能应用的内存性能。
3. net.* (网络相关参数)
这是非常大的一类,通常会进一步细分为 net.ipv4.*, net.ipv6.*, net.core.* 等。
net.core.* (核心网络参数)
net.core.somaxconn = 128 (默认可能较低, 建议调高)
解释: TCP监听队列的最大长度。对于高并发服务器,这个值需要调大 (例如 1024, 4096 或更高)。
net.core.netdev_max_backlog = 1000
解释: 当网络接口接收数据包的速度快于内核处理的速度时,允许排队的最大数据包数量。
net.core.rmem_default = 212992
解释: TCP套接字接收缓冲区的默认大小。
net.core.wmem_default = 212992
解释: TCP套接字发送缓冲区的默认大小。
net.core.rmem_max = ...
解释: TCP套接字接收缓冲区的最大大小。
net.core.wmem_max = ...
解释: TCP套接字发送缓冲区的最大大小。
net.ipv4.* (IPv4 特定参数)
net.ipv4.ip_forward = 0
解释: 是否启用IPv4转发 (即作为路由器)。0 为禁用,1 为启用。
net.ipv4.tcp_syncookies = 1
解释: 是否启用 SYN Cookies。当 SYN 队列溢出时,可以帮助防御 SYN Flood 攻击。
net.ipv4.tcp_tw_reuse = 0 (或 1)
解释: 是否允许将 TIME_WAIT 状态的套接字重新用于新的 TCP 连接。通常在客户端或负载均衡器上设置为 1,可以快速回收端口。
net.ipv4.tcp_tw_recycle = 0 (已废弃且不推荐使用)
解释: 是否快速回收 TIME_WAIT 状态的套接字。注意:此参数在高版本内核中已移除或不建议使用,因为它可能导致NAT环境下的问题。通常应保持禁用 (0)。
net.ipv4.tcp_fin_timeout = 60
解释: 对于已关闭的本地 TCP 连接,保持在 FIN_WAIT_2 状态的时间。
net.ipv4.tcp_keepalive_time = 7200
解释: TCP 发送 keepalive 消息的频率 (秒)。
net.ipv4.tcp_keepalive_intvl = 75
解释: 当 keepalive探测未得到响应时,重试发送的间隔时间 (秒)。
net.ipv4.tcp_keepalive_probes = 9
解释: 在断定连接失效前,发送 keepalive 探测的次数。
net.ipv4.ip_local_port_range = 32768 60999
解释: 本地TCP/UDP端口的可用范围 (用于客户端连接或服务器的临时端口)。
net.ipv4.tcp_max_syn_backlog = ...
解释: 未完成连接(SYN_RECV状态)的队列最大长度。
net.ipv4.tcp_congestion_control = cubic (或 bbr)
解释: TCP 拥塞控制算法。cubic 是默认的,bbr 是Google开发的较新算法,在高延迟或有丢包的网络中表现可能更好。
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
解释: 是否接受 ICMP 重定向报文。出于安全考虑,通常设置为 0。
net.ipv4.conf.all.secure_redirects = 1
解释: 是否只接受来自网关列表中的主机的ICMP安全重定向。
net.ipv4.conf.all.send_redirects = 1 (如果是路由器则为1,否则为0)
解释: 是否发送 ICMP 重定向报文。
net.ipv4.conf.all.rp_filter = 1 (或 2)
解释: 反向路径过滤,用于防止 IP 欺骗。1 为严格模式,2 为松散模式。
net.ipv6.* (IPv6 特定参数)
与 IPv4 类似,但针对 IPv6。例如:
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.all.disable_ipv6 = 0 (0 表示启用IPv6, 1 表示禁用指定接口的IPv6)
net.ipv6.conf.default.disable_ipv6 = 0
4. fs.* (文件系统相关参数)
fs.file-max = ...
解释: 系统级别的文件句柄最大数量(所有进程打开的文件总数)。
fs.nr_open = 1048576
解释: 单个进程可以分配的文件句柄的最大数量(这个值受限于 fs.file-max 和 ulimit)。
fs.inotify.max_user_watches = 8192 (默认可能较低)
解释: 每个用户可以创建的 inotify watch 的最大数量。当使用像 VS Code、文件同步工具等监视大量文件变化的程序时,可能需要调大此值。
fs.inotify.max_user_instances = 128
解释: 每个用户可以创建的 inotify 实例的最大数量。
fs.aio-max-nr = 65536
解释: 系统中异步I/O请求的最大数量。
5. dev.* (特定设备参数)
这些参数通常是针对特定类型的设备或驱动程序的。例如,你可能会看到与特定网络接口卡 (NIC)、CD-ROM 或其他硬件相关的参数。
例如: dev.cdrom.info, dev.mac_hid.*
一般情况下,用户很少直接调整这些参数,它们通常由驱动程序或更高级别的工具管理。
6. abi.* (应用程序二进制接口)
abi.vsyscall32 = 1
解释: 是否启用 32 位应用程序的 vsyscall 仿真。通常不需要修改。
7. user.* (用户命名空间限制)
这些参数用于控制用户命名空间 (user namespaces) 的资源限制,这是一个用于容器化和权限隔离的 Linux 特性。
例如:
user.max_user_namespaces = ...
user.max_mnt_namespaces = ...
如何理解和使用这些参数?
大部分参数不需要修改: 对于大多数桌面用户和许多服务器场景,默认值已经足够好。
按需调整: 只有当你遇到特定的性能瓶颈、安全需求或应用兼容性问题时,才考虑调整这些参数。
查阅文档: 在修改任何参数之前,务必查阅相关文档(如 man sysctl.conf,内核文档 Documentation/sysctl/ 目录下的文件,或在线资源)来理解其确切含义和潜在影响。
临时修改:
sudo sysctl -w parameter.name=value
这种修改在系统重启后会丢失。永久修改:
编辑 /etc/sysctl.conf 文件。
或者,在 /etc/sysctl.d/ 目录下创建一个新的 .conf 文件 (例如 99-custom.conf)。
格式为 parameter.name = value。
修改后,执行 sudo sysctl -p 或 sudo sysctl --system 来使配置生效(-p 只加载指定文件,通常是 /etc/sysctl.conf;--system 会加载所有 /etc/sysctl.d/*.conf 和 /etc/sysctl.conf)。
逐步调整和测试: 不要一次修改太多参数。修改一个或一组相关的参数后,进行测试,观察系统行为和性能,确保没有负面影响。
sysctl -a 的输出非常庞大,但通过分类和关注其中一些关键参数,你就能更好地理解你的 Ubuntu 系统是如何运行和配置的。希望这个解释对你有帮助!