Linux内核可配置的参数

sysctl -a 命令会列出当前Linux内核所有可配置的参数及其当前值。这些参数允许你在系统运行时动态地调整内核的行为,而无需重新编译内核或重启系统。

内容非常多,因为内核有很多可调的方面。我们可以把它们大致分为几个主要类别:

  1. kernel.*: 内核核心参数

  2. vm.*: 虚拟内存管理 (Virtual Memory)

  3. net.*: 网络相关参数 (Networking)

  4. fs.*: 文件系统相关参数 (File System)

  5. dev.*: 特定设备参数

  6. abi.*: 应用程序二进制接口 (Application Binary Interface)

  7. 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 = ...


如何理解和使用这些参数?

  1. 大部分参数不需要修改: 对于大多数桌面用户和许多服务器场景,默认值已经足够好。

  2. 按需调整: 只有当你遇到特定的性能瓶颈、安全需求或应用兼容性问题时,才考虑调整这些参数。

  3. 查阅文档: 在修改任何参数之前,务必查阅相关文档(如 man sysctl.conf,内核文档 Documentation/sysctl/ 目录下的文件,或在线资源)来理解其确切含义和潜在影响。

  4. 临时修改 :

    sudo sysctl -w parameter.name=value

    这种修改在系统重启后会丢失。

  5. 永久修改:

    • 编辑 /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)。

  6. 逐步调整和测试: 不要一次修改太多参数。修改一个或一组相关的参数后,进行测试,观察系统行为和性能,确保没有负面影响。

sysctl -a 的输出非常庞大,但通过分类和关注其中一些关键参数,你就能更好地理解你的 Ubuntu 系统是如何运行和配置的。希望这个解释对你有帮助!

相关推荐
网硕互联的小客服29 分钟前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
基于python的毕设1 小时前
C语言栈的实现
linux·c语言·ubuntu
爱掘金的土拨鼠1 小时前
国产化dm数据库锁表解锁
数据库
luoqice1 小时前
linux下找到指定目录下最新日期log文件
linux·算法
庖丁解java1 小时前
N个Utils
数据库
Mr. zhihao2 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql
2301_793086872 小时前
Redis 04 Reactor
数据库·redis·缓存
林开落L2 小时前
库的制作与原理
linux·开发语言·动静态库·库的制作
Sais_Z2 小时前
ClickHouse的学习与了解
数据库·clickhouse
2401_888423092 小时前
Linux软件编程-线程(2)
linux