Linux配置内核参数和调优配置
一、proc文件系统介绍
### 介绍 proc 文件系统 proc 文件系统是一个伪文件系统,它提供了访问内核数据结构的接口。 内核在启动时会将 proc 文件系统挂载到 `/proc` 目录。`/proc` 目录下的文件权限与其所指向的参数权限保持一致,例如静态信息对应的文件为只读,可配置设置与内核可调参数对应的文件则可写入。 伪文件系统(如 proc)中的文件代表着更复杂的其他结构。部分 `/proc` 文件直接指向单个内核参数,而另一些 `/proc` 文件则会调用相关程序来采集多组数据,并将信息以流的形式呈现,外观和行为都与普通文件类似。在允许的情况下,编辑 `/proc` 文件中的设置等同于直接修改内核参数字段。例如,`vmstat` 命令会读取 `/proc/meminfo` 文件,该文件提供了系统内存使用情况的各类信息。 在 proc 文件系统诞生之前,开发者需要编写代码来访问和解析多种不同类型的内核结构,以获取和设置参数,这需要理解复杂的内核结构,并且要维护程序代码以适配内核版本的更新。通过提供基于传统文件语义(如 open、read、write)的公共接口,proc 伪文件系统让程序员不再需要基于内核内部结构进行编程。开发者现在可以通过稳定的 `/proc` 文件名来编写程序访问内核参数,这些文件名在不同内核版本中保持一致。 `/proc` 目录下的文件是动态创建的:要么是在对应的内核结构随静态内核加载时创建,要么是在启动过程中或运行时加载动态内核模块或驱动时创建。 #/proc中常用的文件和子目录 /proc/cpuinfo 提供cpu相关信息。 /proc/meminfo 提供内存使用情况信息,包括物理内存和交换分区。 /proc/swaps 提供交换空间使用情况信息。 /proc/<PID>/ 提供系统上运行的特定进程相关信息。该子目录的名称即为对应进程的进程ID。 /proc/cmdline 提供当前内核启动时所使用的内核参数与选项。
二、内核可调参数目录介绍
### 介绍内核可调参数 Linux 内核通过 /proc目录向用户空间暴露信息与可调参数。/proc/sys 子目录包含用于调优内核行为与活动的可配置参数。/proc/sys 下的大多数文件可由 root 用户写入,其权限继承自对应内核结构上的可写标志。 重要: 修改 /proc/sys 中的文件会立即对正在运行的系统产生变更。 尽管出于调优目的的修改预期会改善系统行为,但修改 /proc/sys 可调参数也可能对其他生产工作负载和系统产生不利影响。例如,增加内核分配的 TCP 内存缓冲区大小可以提升网络吞吐量。然而,这一变更会导致系统为每个建立或接收的 TCP 连接使用更多内存。拥有大量网络连接的系统会消耗更多内存,从而限制用户空间应用程序可用的内存。 由于所有 /proc/sys 文件的变更都会直接写入内存中的内核,因此这些变更在系统重启后不会保留。除非在合适的配置文件中进行持久化配置,否则内核可调参数设置将恢复为内核模块的默认设置。 /proc/sys 目录树包含多个用于内核可调参数的子目录。 ### /proc/sys 中常用的子目录 /proc/sys/dev 包含系统设备相关的可调参数,例如 RAID 设备、CD-ROM、SCSI 设备以及一个或多个并口。 /proc/sys/fs 包含文件系统相关的可调参数,例如配额处理的参数。 /proc/sys/kernel 包含用于改变内核内部工作方式的可调参数,例如共享内存设置。 /proc/sys/net 包含用于改变网络设置的可调参数,例如套接字接收和发送缓冲区大小。 /proc/sys/vm 包含用于改变内核虚拟内存管理的可调参数,例如大页面数量。 并非/proc/sys下的所有文件都可写入。在以下示例中,osrelease文件包含操作系统版本信息,该信息仅会在操作系统更新时被修改,绝不会被手动修改。threadmax文件是可写入的,可以通过编辑它来设置进程同时存在的最大线程数。
三、配置内核可调优项并持久化设置
### 修改内核可调参数 管理员可以在运行中的系统上修改大部分内核可调参数,以改变当前系统或应用程序的行为。这些参数会直接在内存中修改,并会在下次重启时失效。要设置在重启后依然生效的参数值,需要在持久化配置文件中创建相关设置。

修改内核可调参数有多种方式: - 使用编辑器或重定向来修改/proc/sys目录下的文件。 - 使用sysctl命令按参数名称进行设置。 - 在/etc/sysctl.d目录的配置文件中创建参数条目。 ### 从命令行修改内核可调参数 root 用户可以编辑可写入的 /proc/sys文件,修改会立即对运行中的内核生效。通常使用 echo命令将设置重定向到单值可调参数,但这类修改在系统重启后不会保留。 内核可调参数的点分名称与 /proc/sys 内部的目录结构一一对应。例如,net.ipv4.icmp_echo_ignore_all 内核可调参数对应 /proc/sys/net/ipv4/icmp_echo_ignore_all 文件。 部分内核可调参数是布尔值。例如,将 net.ipv4.icmp_echo_ignore_all设置为 false(0)会使内核处理(而非忽略)所有收到的 ICMP 回显请求与应答。可通过查看 /proc/sys/net/ipv4/icmp_echo_ignore_all 来验证当前设置。 [root@host ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all 0 例如,内核默认会回复ICMP回显请求。发送单个ICMP回显请求即可收到回复。 [root@host ~]# ping -c1 localhost PING localhost (127.0.0.1)56(84)bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.082 ms --- localhost ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.082/0.082/0.082/0.000 ms 将net.ipv4.icmp_echo_ignore_all可调参数设置为true(1)会使内核忽略所有ICMP回显请求。将该可调参数修改为1后,再发送单个ICMP回显请求将收不到回复。 [root@host ~]# echo '1'> /proc/sys/net/ipv4/icmp_echo_ignore_all [root@host ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all 1 [root@host ~]# ping -c1 localhost PING localhost (127.0.0.1)56(84)bytes of data. --- localhost ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms /proc/sys中的部分文件包含多个值,例如/proc/sys/net/ipv4/tcp_rmem。要修改该条目,需将所有值一并写入/proc/sys文件。例如,net.ipv4.tcp_rmem可调参数包含多个值: [root@host ~]# cat /proc/sys/net/ipv4/tcp_rmem 4096873806291456 [root@host ~]# echo '8192 87380 6291456'> /proc/sys/net/ipv4/tcp_rmem [root@host ~]# cat /proc/sys/net/ipv4/tcp_rmem 8192 87380 6291456 ### 使用sysctl修改内核可调参数 sysctl命令可通过参数名称直接修改内核可调参数。该命令可编辑参数、列出可用参数,并从指定配置文件加载和应用设置。 sysctl-a命令会列出所有可用的内核可调参数及其对应的值。 [root@host ~]# sysctl -a ...output omitted... vm.stat_interval = 1 vm.swappiness = 30 vm.user_reserve_kbytes = 56825 vm.vfs_cache_pressure = 100 vm.watermark_scale_factor = 10 vm.zone_reclaim_mode = 0 使用sysctl-n命令可以隐藏可调参数的名称,仅打印其值。例如,以下命令会打印vm.swappiness可调参数的值: [root@host ~]# sysctl -n vm.swappiness 30 使用sysctl-w命令可以修改运行中内核的可调参数值。在以下示例中,vm.swappiness可调参数被设置为10,覆盖了默认值30。vm.swappiness参数的值越低,内核将内存内容写入交换空间的积极性就越低。 [root@host ~]# sysctl -w vm.swappiness=10 vm.swappiness = 10 ### 持久化修改内核可调参数 系统启动时,内核会从以下目录的配置文件中加载可调参数设置: - /etc/sysctl.d/*.conf - /run/sysctl.d/*.conf - /usr/lib/sysctl.d/*.conf 内核可调参数配置文件必须以 .conf 结尾才能被自动加载。当从 /etc/sysctl.d 加载了指定文件名的配置文件后,内核会忽略 /run/sysctl.d 和 /usr/lib/sysctl.d中同名的文件。/usr/lib/sysctl.d 目录包含发行版供应商设置的配置,切勿修改该目录下的文件。如需覆盖供应商默认设置,可在 /etc/sysctl.d 中创建同名配置文件。这些配置文件中的设置会在每次系统启动时加载,因此是持久化的。 例如,在 /etc/sysctl.d 目录下创建新文件并写入对应的键值对。在以下输出中,vm.swappiness 内核可调参数在 /etc/sysctl.d/swappiness.conf 中被设置为新值 10。 [root@host ~]# cat /etc/sysctl.d/swappiness.conf vm.swappiness=10 sysctl-p 命令可以加载配置文件并应用设置,无需重启系统。 [root@host ~]# sysctl -p /etc/sysctl.d/swappiness.conf
四、配置内核模块参数并持久化设置
### 介绍 sysfs 文件系统 sysfs 文件系统也是一种伪文件系统,挂载在 /sys目录下。/sys 目录下的文件提供了对设备、文件系统以及其他作为内核模块加载的软件的信息和参数的访问。与 /proc 类似,/sys 文件系统会根据其所代表的结构来设置文件权限:部分文件为只读信息,另一部分为可写设置。sysfs 目录树曾是 /proc 的一部分,后被迁移为独立文件系统,以提升内核稳定性——因为设备驱动由大量经验水平各异的贡献者编写。 ### `/sys` 中常用的子目录 /sys/module/ 包含当前内核中已加载的内核模块信息,每个模块对应独立子目录。 /sys/devices/ 包含系统所连接设备的属性信息。 /sys/bus/ 包含内核中各类总线类型的信息。 /sys/dev/ 包含系统中块设备与字符设备的信息。 ### 配置模块参数 Linux 内核采用模块化设计,允许设备驱动和组件仅在需要时自动加载、不再需要时自动卸载。许多内核模块具备可修改的设置,所有内核模块设置会在模块加载时加载或恢复为默认值。通过 sysfs 暴露的参数可在运行中的系统上修改。 大多数内核模块在kernel-doc包中包含文档,包括参数设置。可使用modinfo命令查询当前已加载的模块。modinfo命令会列出模块信息,例如文件名、许可证、描述和可配置参数。 [root@host ~]# modinfo loop filename:/lib/modules/4.18.0-80.el8.x86_64/kernel/drivers/block/loop.ko.xz alias:devname:loop-control alias:char-major-10-237 alias:block-major-7-*license:GPL rhelversion:8.0 srcversion:3D71AF3926DFBFA6C0C0FA9 depends: intree:Y name:loop ...output omitted... parm:max_loop:Maximum number of loop devices (int)parm:max_part:Maximum number of partitions per loop device (int)使用-p选项仅列出模块参数。 [root@host ~]# modinfo -p loop parm:max_loop:Maximum number of loop devices (int)parm:max_part:Maximum number of partitions per loop device (int)模块加载后,可通过 /sys/module 目录查看模块参数的当前设置。在以下输出示例中,loop 模块的 max_loop 参数值为 0。/sys/module/loop 目录及其参数文件仅在 loop 模块加载后才会存在于系统中。 [root@host ~]# cat /sys/module/loop/parameters/max_loop 0 若 /sys 中的参数文件可写入,则可将新值重定向写入该文件以修改参数。要在每次加载模块时持久化设置模块参数,需在 /etc/modprobe.d 目录中创建配置文件。新文件名必须以 .conf 结尾才能被自动加载。文件内容必须遵循 modprobe.conf(5)手册页中规定的语法规则。 options modulename parameter=value 要在loop模块加载时自动将其max_loop参数设置为5,需在新建的/etc/modprobe.d/loop.conf文件中添加以下条目: options loop max_loop=5 在手动加载模块时,也可将参数添加到modprobe命令行中。手动配置的参数不会持久化。 [root@host ~]# modprobe loop max_loop=5
五、tuned调优
Linux 提供名为 tuned 的调优服务,帮助系统管理员针对不同类型的工作负载场景优化性能。tuned 服务可通过配置好的调优配置文件,静态或动态地应用调优调整,以满足特定工作负载需求。系统内置了多种预定义调优配置文件,分别对应不同调优目标,如节能或提升网络吞吐量。tuned 架构还支持自定义配置文件规则,以适配具体工作负载要求。 静态调优 tuned 服务在服务启动或切换配置文件时应用系统设置。静态调优指一次性设置预定义的 sysctl 和 /sys 参数。通过静态调优,内核可调参数会被设置为符合整体性能预期的值,且不会随系统活动水平变化而调整。 动态调优 在动态调优模式下,tuned 服务会监控系统活动,并根据运行时行为变化调整设置。动态调优会持续适配当前工作负载,以所选调优配置文件的初始设置为起点进行调整。动态调优旨在平衡性能与节能,因此在性能增强型配置文件中默认禁用。 例如,考虑一个需要转码的视频文件:在转码任务期间,网络连接并非必需,大多处于闲置状态,仅在上传转码后视频时才需要。网络接口无需像默认状态那样始终全速运行。通过动态调优,tuned 会监控到网络接口的低活跃度,并通过调优插件自动降低接口速率以减少功耗。当接口活跃度持续升高(如开始上传转码视频)时,tuned 监控插件会检测到该变化,并重置接口最大速率,以在高网络活动期间提升性能。 注意:红帽企业 Linux 8 默认禁用动态调优。在 /etc/tuned/tuned-main.conf 中将 dynamic_tuning 设为 1 可启用动态调优。启用动态调优后,tuned 会每 10 秒调整一次系统调优参数。可在 /etc/tuned/tuned-main.conf 中设置 update_interval 来修改调整间隔,单位为秒。修改 /etc/tuned/tuned-main.conf 配置后需要重启 tuned 服务才能生效。 安装并启用 tuned 红帽企业 Linux 8 的最小化安装默认包含并启用 tuned 软件包。如需手动安装并启用该软件包: [root@host ~]# yum install tuned ...output omitted... [root@host ~]# systemctl enable --now tuned Created symlink /etc/systemd/system/multi-user.target.wants/tuned.service → /usr/lib/systemd/system/tuned.service. 选择调优配置文件 配置文件是 tuned 服务的核心,由针对特定用例配置的可调参数组成。可通过复制并编辑现有配置文件,或继承某个配置文件并扩展其内容来修改 tuned 配置文件。红帽建议不要修改任何预定义配置文件,因为部分文件是其他配置文件的父配置。tuned 软件包提供以下类别的预定义配置文件: 节能配置文件 节能配置文件通过提高磁盘回写值、禁用磁盘日志同步来实现主动磁盘降速。在服务器上,它会为 SATA 主机适配器启用主动链路电源管理(ALPM)节能功能,通过 HAL 禁用 CD-ROM 轮询,并激活 tuned 的 CPU 和磁盘插件。 性能增强配置文件 性能增强配置文件会禁用节能机制,启用可提升磁盘和网络I/O吞吐量性能的系统设置,并禁用透明大页和NUMA平衡。这类配置文件会将CPU调控器设置为performance模式。