当前位置: 首页 > java >正文

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 系统是如何运行和配置的。希望这个解释对你有帮助!

http://www.xdnf.cn/news/6015.html

相关文章:

  • 单片机-STM32部分:14、SPI
  • 查询公网IP地址的方法:查看自己是不是公网ip,附内网穿透外网域名访问方案
  • 构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
  • HarmonyOs开发之———使用HTTP访问网络资源
  • Eslint和perrier的作用
  • CSS盒子模型:Padding与Margin的适用场景与注意事项
  • npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
  • 【漫话机器学习系列】259.神经网络参数的初始化(Initialization Of Neural Network Parameters)
  • 【Java面试题】——this 和 super 的区别
  • PHP黑白胶卷底片图转彩图功能 V2025.05.15
  • Stable Diffusion WebUI 插件大全:功能详解与下载地址
  • 【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
  • 配置Nginx解决http host头攻击漏洞【详细步骤】
  • Dockerfile实战:从零构建自定义CentOS镜像
  • Python爬虫实战:研究进制流数据,实现逆向解密
  • 【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
  • 【python实用小脚本-59】连续刷题7天,手动整理编程题目效率低下,Python代码5分钟搞定,效率提升80%(附方案)
  • 力扣刷题Day 48:盛最多水的容器(283)
  • Linux操作系统中的SOCKET相关 - Socket字节序调整与网络传输
  • Kubernetes 标签和注解
  • 【软件测试】第一章·软件测试概述
  • 行动算子(知识)
  • GZip+Base64压缩字符串在ios上解压报错问题解决(安卓、PC模拟器正常)
  • 服务器中存储空间不足该怎么办?
  • IP协议的特性
  • 大白话解释联邦学习
  • skolelinux系统详解
  • Proxmox VE 8.4.0显卡直通完整指南:NVIDIA Tesla T4 实战
  • 什么是懒加载?
  • 06_java常见集合类底层实现