05内核调优

配置内核可调项

PROC 文件系统简介

proc 文件系统是⼀种伪⽂件系统,可提供内核数据结构接⼝。内核在启动过程中将 proc ⽂件挂载⾄/proc ⽬录中的⽂件系统中。/proc⽬录中的⽂件具有与所引⽤参数相匹配的权限,例如静态信息为只读;可配置设置和内核可调项为可写
image.png

伪⽂件系统中的⽂件,如 proc,代表其他更为复杂的结构。有些 /proc⽂件有效指向单个内核参数,⽽另⼀些 /proc ⽂件则调⽤例程来收集多个数据并以数据流形式呈现相应信息,在外观和表现上就如普通⽂件⼀般。如有相应的权限,则编辑 /proc⽂件中的设置与直接编辑内核参数字段的⽅式相同。例如,vmstat命令可读取 /proc/meminfo ⽂件,提供有关系统内存使⽤情况的各种信息。

在开发 proc ⽂件系统之前,开发⼈员编写了⼀些代码来访问和分析各种不同类型的内核结构,以获取和设置参数,这需要理解复杂的内核结构并维护程序代码,以匹配所发布的内核增强功能。通过提供 proc 伪⽂件系统作为具有常规基于⽂件语义(如打开、读取和写⼊)的公共接⼝,程序员⽆需再使⽤内部结构进⾏编程。开发⼈员现在可编写程序,以便使⽤在内核更新中始终不变的稳定/proc⽂件名来访问内核参数。

当相应静态内核被加载⾄内核结构,或在启动期间或后续运⾏时期间加载了动态内核模块或驱动程序时,便会⾃动创建 /proc⽬录下的⽂件。

/proc 中的常用文件和子目录

  1. /proc/cpuinfo
  • 提供有关处理器的信息。
  1. /proc/meminfo
  • 提供有关内存使⽤情况(物理内存和交换内存)的信息。
  1. /proc/swaps
  • 提供有关交换空间使⽤率的信息。
  1. /proc//
  • 提供有关系统上运⾏的特定进程的信息。/proc 中⼦⽬录的名称为相应进程的 ID。
  1. /proc/cmdline
  • 提供最近⽤于启动此内核的内核参数和选项。

内核可调项

Linux 内核通过 /proc⽬录向⽤⼾空间提供信息和可调项。/proc/sys⼦⽬录中包含⽤于内核⾏为和活动调优的可配置参数。/proc/sys 中的⼤部分⽂件均可通过 root 写⼊,通过相应内核结构上的可写标志继承了相应⽂件权限。

尽管出于调优⽬的所做的更改预计可改善系统性能,但修改 /proc/sys 可调项也可能对其他⽣产⼯作负载和系统产⽣不利影响。例如,增加内核分配的 TCP 内存缓冲区的⼤⼩可提⾼⽹络吞吐量。 但也会导致内核在为系统建⽴或接收各个 TCP 连接时,消耗更多内存。系统的⽹络连接越多,消耗的内存也就越多,从⽽会对⽤⼾空间应⽤的可⽤内存构成限制。

由于所有 /proc/sys⽂件更改均直接写⼊内存中的内核,因此所作更改⽆法在重新启动后继续保持。除⾮在适当配置⽂件中持久配置,否则重新启动后,内核可调项设置将重新恢复到内核模块的默认设置。/proc/sys⽬录树包含多个内核可调项的⼦⽬录。

/proc/sys下常用子目录

  1. /proc/sys/dev
  • 包含系统设备的可调项,如 RAID 设备、CD-ROM、SCSI 设备和⼀个或多个并⾏端⼝。
  1. /proc/sys/fs
  • 包含有关⽂件系统的可调项,如配额处理参数。
  1. /proc/sys/kernel
  • 包含改变内核内部⼯作⽅式的可调项,如共享内存设置。
  1. /proc/sys/net
  • 包含改变⽹络设置的可调项,如接收和发送套接字缓冲区⼤⼩。
  1. /proc/sys/vm
  • 包含改变内核虚拟内存管理的可调项,如⼤⻚⾯的数量。

并⾮ /proc/sys 中的所有⽂件均可写。在以下⽰例中,osrelease⽂件包含操作系统版本,仅可在更新操作系统时修改该⽂件,其他时间不可⼿动修改。
image.png

thread-max⽂件可写⼊,且可编辑,以设置并⾏处理线程的最⼤数量。
image.png

修改内核可调项

管理员可修改正在运⾏的系统上的⼤部分内核可调项,以调整当前系统或应⽤的表现。这些参数可直接在内存中修改,系统重新启动后随即失效。要设置重新启动后仍保持的参数值,需在持久配置⽂件中创建设置。
image.png

修改内核可调项的方式

  • 使⽤编辑器或重定向来修改 /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的当前设置。

验证
默认情况下,内核会回复 ICMP 回显请求。发送⼀条 ICMP 回显请求,并获得回复
image.png

修改后
image.png

/proc/sys 中的⼀些⽂件会保留多个值,如 /proc/sys/net/ipv4/tcp_rmem。若要更改条⽬,请将所有值⼀起写⼊ /proc/sys⽂件中。例如,net.ipv4.tcp_rmem 可调项保留多个值:
image.png

使用sysctl命令修改内核可调项

sysctl 命令可直接按名称修改内核可调项。该命令可编辑可调项,列出可⽤的可调项,并从指定的配置⽂件加载和应⽤设置。

  1. 使⽤** sysctl -a 命令**可列出所有可⽤的内核可调项及其相关值:

image.png

  1. 使⽤** systctl -n 命令可隐藏可调项的名称,仅打印数值**。例如,以下命令打印了 vm.swappiness 可调项的数值

image.png

  1. 使⽤ sysctl -w 命令可更改正在运⾏的内核中内核可调项的数值。在以下⽰例中,vm.swappiness 可调项被设置为 10,覆盖了默认值 30。vm.swappiness 可调项的数值越低,内核将内存内容写⼊交换空间的情况就越少。

image.png

永久修改内核可调项

在启动过程中,内核会将从以下⽬录中发现的配置⽂件加载可调项设置:

  • /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⽬录包含供应商
在软件包发⾏版中设置的配置。不得修改 /usr/lib/sysctl.d 中的⽂件。但可通过使⽤ **/etc/sysctl.d **中的
设置创建匹配的⽂件名来覆盖供应商默认值。这些配置⽂件中的设置具有持久性,因为每次系统启动时均
会加载。
例如,⽤适当键值对在 /etc/sysctl.d⽬录中创建⼀个新⽂件。在以下输出中,net.ipv4.ip_forward.conf内核可调
项在/etc/sysctl.d/net.ipv4.ip_forward.conf中被设置成了⼀个新值 1。
image.png

SYSFS 文件系统简介

sysfs ⽂件系统也是挂载⾄ /sys ⽬录的⼀个伪⽂件系统。/sys 下的⽂件提供了对设备、⽂件系统和作为内核模块加载的其他软件的信息和参数的访问权限。与 /proc 类似,/sys ⽂件系统为⽂件提供了其所代表结构的权限。⼀些为只读信息,另⼀些则提供可写设置。Sysfs 树之前是 /proc 的⼀部分,但考虑到设备驱动程序的编写⼈很多,且经验⽔平各有不同,为了提⾼系统稳定性,sysfs 树后来被迁移到其⾃有⽂件系统中。

/sys⽬录中的常⽤⼦⽬录

  1. /sys/module/
  • 包含有关当前加载⾄内核中不同⼦⽬录下的内核模块的信息。
  1. /sys/devices/
  • 包含有关系统中附属设备属性的信息。
  1. /sys/bus/
  • 包含有关内核中各种总线类型的信息。
  1. /sys/dev/
  • 包含有关系统上区块和字符设备的信息。

image.png

配置模块参数

Linux 内核采⽤模块化设计,允许仅在需要时⾃动加载设备驱动程序和组件,不需要时即可卸载。很多内核模块都有可修改的设置。加载模块时,所有内核模块设置均会加载或设置为默认值。通过 sysfs 提供的参数可在运⾏中的系统上修改。

⼤部分内核模块的** kernel-doc **软件包中均含有⽂档,包含参数设置。使⽤ modinfo 命令查询当前加载的模块。使⽤ **modinfo **命令列出模块信息,如⽂件名、许可证、说明和可配置参数。
:::tips
modinfo loop | grep -v "^\s"
:::
image.png

parm是可调优的参数

使⽤ -p 选项仅列出模块参数
image.png

image.png

RHEL8默认不支持ntfs系统,手动安装驱动让其支持
ntfs-3g下载地址:http://www.linuxfromscratch.org/blfs/view/svn/postlfs/ntfs-3g.html

image.png

看INSTALL或者README即可知道怎么安装
./configure && make install即可安装(如果有错误提示,根据提示做出修改即可)
image.png

lsmod查看系统中已经加载的模块
image.png

系统中模块是按需加载的,只有系统检测到对应的硬件才会加载此模块
如检测到USB接口,会自动加载,n个USB接口,加载n次

modprobe手动加载模块
image.png

加载模块时,查看 /sys/module⽬录中模块参数的当前设置。在以下输出中,loop 模块的 max_loop 参数值为 0。不加载 loop 模块,系统中便不会存在 /sys/module/loop ⽬录及其参数⽂件。
image.png

:::tips
cat /sys/module/loop/parameters/max_loop
:::
image.png
如果 /sys 中的参数⽂件可写,则可重定向新值⾄该⽂件。要在每次加载模块时持续设置模块参数,可在/etc/modprobe.d⽬录中创建⼀个配置⽂件。新⽂件名称必须以** .conf 结尾**,才可⾃动加载。⽂件内容必须符合 **modprobe.conf(5) man page **中的语法规则:
:::tips
options modulename parameter=value
:::

要在模块加载时将 loop 模块的 max_loop 参数⾃动设置为 5,可在 **/etc/modprobe.d/loop.conf **新⽂件中添加以下条⽬:

编辑好后,若要配置文件生效,需要执行modprobe 模块名(注意:若该模块已经加载到内存中,需要先使用modprobe -r 模块名卸载后,再加载才会生效)
若此配置文件的模块名出错,加载不出报错(因为匹配不到此配置文件);若此配置文件的模块参数出错,RHEL7及之前版本会报错,但RHEL8不会(但会在日志中报错);若出错,调整的参数也不会生效

:::tips
options loop max_loop=5
:::

⼿动加载模块时,也可在 modprobe 命令⾏中添加参数。⼿动配置的参数不具有持久性。
:::tips
modprobe loop max_loop=5
:::

若要调整模块参数的大小,RHEL8推荐在/etc/modprobe.d目录下创建以*.conf为文件名的配置文件
image.png

编辑好后,若要配置文件生效,需要执行modprobe 模块名(注意:若该模块已经加载到内存中,需要先使用modprobe -r 模块名卸载后,再加载才会生效)
若此配置文件的模块名出错,加载不出报错(因为匹配不到此配置文件);若此配置文件的模块参数出错,RHEL7及之前版本会报错,但RHEL8不会(但会在日志中报错);若出错,调整的参数也不会生效

扩展--内核升级

  1. 下载内核

下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/ (阿里云的,kernel官网下载较慢)

  1. 解压

  2. 安装编译工具
    :::tips
    yum -y install gcc kernel-devel ncurses-devel bison flex elfutils-libelf-devel openssl openssl-devel
    :::

  3. 进入解压后的文件夹,配置内核
    :::tips
    make menuconfig
    :::
    menuconfig是基于ncurse库编制的图形工具界面,截图如下:
    image.png
    进入到该图形界面后,进行内核配置。配置时,大部分都是使用其默认选项,小部分才根据需要进行选择。
    其中,每一个配置选项有三种选择,它们的含义如下:

  • <>或[]:表示将该功能编译进内核
  • [ ]:表示不将该功能编译进内核
  • [M]:表示将该功能编译成在需要时动态插入到内核的代码

用户根据需要进行配置。

  1. 进行编译
    :::tips
    make -j4
    sudo make modules_install
    sudo make install
    reboot
    :::

其中,j4表示分成4个任务运行,以加快速度,建议使用机器的所有CPU核来进行编译以加快速度,为此可以使用指令“make -j getconf _NPROCESSORS_ONLN

驱动缺失案例

场景:

  1. 华科国家光电实验室
  2. DELL 服务器,OS(RHEL5.4),kernel(2.6.18-164.el5)

需求:
升级内核到2.6.27

出现问题:
用户的RHEL5.4系统的内核由2.6.18升级到2.6.27后,无法通过2.6.27内核进行启动,因为该内核里没有对应的RAID卡驱动;但是RHEL5.4有两个内核,可以通过旧的2.6.18内核启动系统
如图所示:
image.png
发现提示No controller found,没有发现控制器,经验来谈,应该是没有RAID卡驱动

解决思路:
首先回顾Linux系统启动流程

  1. 开机,BIOS自检
  2. 读取引导设备引导扇区(一般是MBR)
  3. MBR读取/boot/grub2/grub.cfg
  4. 加载boot分区
  5. 加载内核
  6. 加载根分区

根分区如果使用的是xfs文件系统,硬盘在RAID卡上,需要有RAID卡驱动,有xfs文件系统驱动等

  1. 加载RAM DISK文件(initramfs,里面放着加载根分区所需的驱动程序)

加载initramfs文件到内存中,从而驱动了RIAD卡,识别硬盘,识别xfs文件系统

image.png
可以看到内核只有7.2M,而initramfs文件有17M(若是X86架构的更大,ARM架构使用精简指令集)

image.png

可以

RAID信息既保存在硬盘中,也保存在RAID卡中

解压initramfs文件
:::tips
/usr/lib/dracut/skipcpio iniramfs-4.18.6.img | zcat | cpio -id
:::
image.png

解决问题:

  1. 自己的笔记本中,安装RHEL5.4,将内核从2.6.18升级到2.6.27模拟错误环境,发现自己笔记本可以通过2.6.27内核进行启动系统;此时在lsi官网下载对应版本的源码包(已知用户的RAID卡类型为lsi2008),在自己的环境下编译安装,生成RAID模块
  2. 将生成的RAID模块拷贝到用户DELL服务器的RHEL5.4系统中(先通过2.6.18内核启动)/lib/modules/2.6.27-308.el5/kernel/lsi_2008目录中

模块放在哪儿并不重要,重要的是在/lib/modeulers/2.6.27-308.el5/moudles.dep文件中写入模块所在路径

  1. 将编译好的模块封装到initrd.img文件中
    :::tips
    mkinitrd --with=lsi2008 -f /boot/initrd-2.6.27.img 2.6.27
    :::

  2. 重启系统,由2.6.27内核进入系统即可

调优配置集

调优系统性能

红帽企业 Linux 提供名为 tuned 的调优服务,来帮助系统管理员针对不同类型的⼯作负载⽤例实施性能优化。tuned 服务既可静态也可动态应⽤调优调整,使⽤所配置的调优配置集来满⾜特定的⼯作负载需求。有多个预定义的调优配置集可⽤于不同的调优⽬标,如节省电能或⽹络吞吐量⽅⾯的⽬标。调优架构⽀持⾃定义配置集规则,以满⾜⼯作负载要求。

  1. 静态调优

tuned 服务会在服务启动期间或在配置集之间切换时应⽤系统设置。静态调优由⼀次性设置预定义的sysctl 和 /sys 组成。通过静态调优,可为了满⾜整体性能期望⽽设置内核可调项,且该参数不会随着活动级别的变化⽽调整

  1. 动态调优:

通过动态调优,tuned 服务会监控系统活动,并根据运⾏时的⾏为变化调整设置。动态调优会从选定调优配置集的初始设置开始,不断调整以适应当前⼯作负载。动态调优会尝试在性能和节能之间找到平衡,所以在性能提升配置集中会被禁⽤。
例如:⼀个需要转码的视频⽂件。转码期间,不需要⽹络连接,⼤多处于不活跃状态。只有在上传转码视频时,才需要⽹络连接。⽹络接⼝不必像默认情况那样始终全速运⾏。借助动态调优,tuned 服务会通过调优插件监控⽹络接⼝的低活动,并⾃动降低接⼝速度以降低功耗。如果接⼝活动在很⻓⼀段时间内不断增加(如转码视频开始上传时),调优监控插件便会检测并重置最⼤接⼝速度,以便在⽹络活动增加期间提⾼性能。

安装和启用tuned

默认情况下红帽企业 Linux 8 的最低配安装也会包含并启⽤ tuned 软件包。

选择调优配置集
该配置集是 tuned 服务的核⼼所在,由为特定⽤例配置的可调项设置组成。调优配置集可通过复制并编辑现有配置集,或继承该配置集并加以扩展来修改。红帽不建议修改任何预定义的配置集,因为其中⼀些是其他配置集的⽗项。 tuned 软件包提供以下类别的预定义配置集:

  1. 节能配置集

节能配置集通过增加磁盘回写值和禁⽤磁盘⽇志同步功能来主动为磁盘降速。在服务器上,该配置集为SATA 主机适配器启⽤积极链路电源管理 (ALPM) 实现节能⽬的,通过 HAL (Hardware Abstract Layer 硬件抽象层)禁⽤ CDROM (光盘)轮询,并激活已调优的 CPU 和磁盘插件。

禁止 hal 轮询你的 cdrom: hal-disable-polling --device /dev/cdrom

  1. 性能提升配置集

性能提升配置集禁⽤节能机制,启⽤可提⾼磁盘和⽹络 I/O 吞吐量性能的系统设置,并禁⽤透明⼤内存⻚和 NUMA 平衡。这些配置集将 CPU 调控器设置为 performance。

tuned服务自带的配置集:
image.png

  1. balanced
  • ⾮常适合需要兼顾节能和性能的系统。该配置集启⽤了 CPU、磁盘、⾳频和视频插件,并激活了conservative CPU 控制器。该配置集使⽤动态调优,但在系统上激活时,配置集会增加延迟。
  1. desktop
  • 从 balanced 配置集衍⽣⽽来。该配置集可提⾼交互式应⽤的响应速度。
  1. throughput-performance
  • ⾮常适合需要最⼤限度增加吞吐量的系统。该配置集将 CPU 调控器和能源性能偏差设置为 performance。磁盘的 readahead 可调项将设置为⼤于或等于 4096 值。throughputperformance 配置集还⽀持内核可调项,以提⾼磁盘和⽹络 I/O 的吞吐量性能。
  1. latency-performance
  • ⾮常适合⽤⾼功耗换取低延迟的系统。与 throughput-performance 配置集⼀样,CPU 调控器和能源性能偏差被设置为 performance,以确保达到最⾼时钟频率。通过静态设置时钟频率,latency-performance可避免为响应⼯作负载波动切换 CPU 频率⽽造成的延迟。
  1. network-latency
  • 该配置集从 latency-performance 配置集衍⽣⽽来,⽀持其他⼀些⽹络调优参数,以提供低⽹络延迟。该配置集禁⽤透明⼤内存⻚和 NUMA 平衡,并会对其他⼏个⽹络相关内核调优参数进⾏调优,以降低⽹络延迟。
  1. network-throughput
  • 该配置集从 throughput-performance 配置集衍⽣⽽来,可增加内核⽹络缓冲区,以提⾼⽹络性能,最⼤限度增加⽹络吞吐量
  1. powersave
  • ⾮常适合需要最⼤限度节能的系统。该配置集通过为 SATA 主机适配器启⽤ USB ⾃动挂起、WiFi 节能和积极链路电源管理 (ALPM) 节能来限制性能,从⽽最⼤限度降低功耗。
  1. oracle
  • 基于 throughput-performance 配置集,针对 Oracle 数据库负载进⾏了优化。tunedprofiles-oracle软件包提供此配置集。
  1. virtual-guest
  • 对在虚拟机上运⾏的系统进⾏调优,以获得最⾼性能。该配置集减少了虚拟内存的交换进程,并增加了磁盘预读值。
  1. virtual-host
  • 对充当虚拟机主机的系统进⾏调优,以获得最⾼性能。该配置集减少了虚拟内存的交换进程,增加了磁盘预读值,并⽀持更为主动的脏⻚⾯回写值。

命令行管理配置集

tuned-adm 命令可⽤于管理 tuned 服务。tuned-adm 命令可查询当前设置,列出可⽤配置集,为系统推荐调优配置集,更改正在运⾏的系统上的配置集,以及打开和关闭调优服务。

  1. tuned-adm active 命令可确定系统上当前活动的调优配置集。

image.png

  1. tuned-adm list 命令可列出所有可⽤的调优配置集,既包括内置配置集,也包括由系统管理员创建的⾃定义调优配置集

  2. 当前活跃的配置集如果不符合系统调优要求,可以进⾏更改。根据系统当前调优要求,使⽤tuned-adm profile 命令将活跃配置集切换为其他配置集。

image.png

  1. tuned-adm recommend命令可为系统推荐调优配置集。该机制⽤于在系统安装后为系统确定默认配置集。

image.png

  1. 任何 tuned 服务的调优活动均可使⽤** tuned-adm off 命令**⽴即关闭。使⽤ tuned-adm off 命令暂时禁⽤所有 tuned 设置。重新启动 tuned 服务后,所有设置将重新再次应⽤。

调优配置集

调优配置集⽀持各类配置更改机制,如可⽤作 tuned 插件的 sysctl、sysfs 或内核启动参数。配置集将其所有配置存储在以下⽬录中:
/usr/lib/tuned/

  • 该⽬录存储由红帽企业 Linux 发⾏版提供的配置集。 每个配置集的配置均保存在各⾃⼦⽬录中。每个配置集的主配置均写⼊ tuned.conf⽂件中。

/etc/tuned/

  • 红帽企业 Linux ⽀持继承了另⼀配置集设置,且可进⼀步⾃定义的⾃定义配置集。 该⽬录⽤于存储⾃定义配置集。每个配置集的配置均保存在各⾃⼦⽬录中。/etc/tuned⽬录还包含 active_profile ⽂件,其中包含当前活跃的调优配置集的名称,以及⽤于配置动态调优的 tuned-main.conf 配置⽂件。

tuned.conf⽂件包含多个部分。第⼀部分为 [main]。其他部分为插件实例的配置。每个 tuned 插件对单个⼦系统进⾏调优,且需要填充调优配置集的多个参数。
以下输出显⽰了 network-latency 调优配置集的 tuned.conf ⽂件:

#
# tuned configuration
#
# [main]部分可从现有调优配置集中添加设置的摘要、描述和继承。在上面的示例中,network-latency配置集从latency-performance配置集中继承了其属性。
[main]
summary=Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
include=latency-performance

# [vm]部分可启用或禁用透明大内存页,具体取决于vm插件参数的设置值。在上面的示例中, network-latency 配置集通过修改/sys/kernel/mm/transparent_hugepage/enabled文件禁用了transparent_hugepages参数。
[vm]
transparent_hugepages=never

# [sysct1]部分使用sysctl插件参数来设置通过sysctl命令管理的各种内核可调项。在上面的示例中,network-latency配置集通过修改/proc/sys/net/core/busy_read文件将net.core.busy_read可调项设置成了20。
[sysctl]
net.core.busy_read=50
net.core.busy_poll=50
net.ipv4.tcp_fastopen=3
kernel.numa_balancing=0

[bootloader]
cmdline=skew_tick=1

disk 插件提供了设置为调优磁盘 I/O 的 readahead 参数。当看到连续的请求进⼊时,readahead 参数会影响内核尝试提前读取的数据量。内核尝试读取的数据量从/sys/block/device/queue/read_ahead_kb中配置的⼀半数据量开始算。顾名思义,此设置的单位为 KiB。当内核检测到连续访问时,会将预先读取的数据量增加到 read_ahead_kb 中定义的最⼤值;⽽当检测到随机访问时,则会降低数据量(如果需要最多可降低到零)。

Readahead预读机制:由于内存的速度比磁盘速度快很多,如果每一次访问文件数据都要从磁盘读取一次数据,就会导致非常严重的时延。因此Linux为了提高性能,通过page cache机制,将多个用户数据缓存在内存当中,从而避免多次再磁盘读取。Readahead预读机制正是将用户数据缓存到内存的方法之一。

使⽤ blockdev 命令可读取和写⼊ read_ahead_kb 可调项。--getra 和 --setra 选项与 blockdev 命令结合在⼀起可获取和设置 readahead 值。
[root@host ~]# blockdev --getra /dev/vda
8192
[root@host ~]# blockdev --setra 512 /dev/vda

调优配置集⽀持带扇区的 readahead 参数配置。以下⽰例配置 vdb 设备,其 readahead 值为 4096 个
扇区。
:::tips
[disk]
devices=vdb
readahead=4096 sectors
:::

创建自定义调优配置集

tuned 软件包提供适合⼤部分常⻅⼯作负载的调优配置集。红帽企业 Linux 中的内置配置集可能会因定期更新或勘误表⽽有所变动。 创建⾃定义调优配置集可免受更新影响。此外,某些情况下,需要进⾏更精细调优才能达到所需性能。tuned 服务⽀持创建和使⽤⾃定义的调优配置集。tuned 软件包附带内置的配置集,存于 **/usr/lib/tuned **⽬录中:
image.png

/etc/tuned⽬录保存 active_profile ⽂件,其中包含当前活跃的调优配置集的名称以及 tuned-main.conf调优配置集。该⽬录还存储⾃定义配置集的配置以及其他⽂件。
image.png

在 Linux 中,/usr/lib⽬录包含随应⽤发⾏的库和默认配置⽂件。更新软件包时,可替换应⽤⽂件;它们旨在对系统相关更改保持不变,且不得修改。因为内置的调优配置集位于 /usr/lib/tuned⽬录中,所以⾃定义配置集不应放在该⽬录中,以避免软件更新期间遭遇意外更改

创建/etc/tuned/http-performance⽬录,以创建名为 http-performance 的⾃定义配置集。
在新创建的⾃定义配置集⽬录中,tuned 需要 tuned.conf 配置⽂件。⾃定义配置集的 tuned.conf 配置⽂件可由多个部分组成。所有部分均为可选项。

  1. 从现有配置集继承设置

将现有配置集继承到⾃定义配置集可按照环境所需,处理其他调优要求。其中⼀个内置配置集通常是⼤部分⾃定义配置集的良好起点。[main] 部分⽀持继承现有调优配置集的设置。要继承设置,tuned.conf 配置⽂件需包含可选部分 [main],后跟 include=parent profilename。

调优配置集的继承
image.png

要在 http-performance ⾃定义配置集中继承 network-throughput 配置集的设置,/etc/tuned/http-performance/tuned.conf 配置⽂件必须包含:
:::tips
[main]
include=network-throughput
:::

  1. 在自定义配置集中使用插件

调优配置集使⽤插件来监控或调优系统上的不同⼦系统,共有两类插件:

  • 监控插件
  • 调优插件

每当调优插件需要监控插件的指标来动态调优时,启⽤的调优插件便要实例化监控插件。当前实施的监控插件有:提供各个设备磁盘 I/O 数量指标的 disk,提供传输软件包数量指标的 net,以及提供 CPU 负载指标的 load。

各个调优插件会对单独⼦系统进⾏调优,并定义各个属性。管理员会在 tuned.conf 配置⽂件中设置调优配置集的这些属性值。这些属性值既可⾯向所有设备来设置,也可⾯向⼦系统附带的特定设备来设置。最常⽤于服务器调优的插件有 cpu、disk、mount、net、vm、sysctl 和 script

在 tuned.conf⽂件中,某⼀⼩节会定义要实例化的调优插件及其相关属性:
:::tips
[NAME]
type=TYPE
devices=DEVICES
:::

  1. 定义插件实例的小节名称。小节名称必须唯一,但可以是任何所需的字符串,因为调优日志会使用小节名称。
  2. 该属性指定了调优插件的类型。如果小节名称与调优插件的名称相同,type属性可选,其他情况下为必选。
  3. 该属性指定了插件实例处理的设备列表。devices属性可包含以逗号分隔的设备列表,以及通配符( * ),也可用在设备名称前加上否定符号( ! )以排除特定设备。如果devices属性不存在,则假设devices=*,且调优适用于目标系统中的所有受影响设备。

案例:
disk调优插件中的readahead可调项可迫使内核提前读取指定数量的512字节块。要在设备名称匹配sd的所有硬盘上设置
:::tips
disk
[all_sd_disks]
type=disk
devices=sd

readahead=4096
:::

当调优参数不应应⽤于 /dev/sda 和 /dev/sdc 设备时,devices 属性便可使⽤否定符号 ( ! ) 排除这些设备。
:::tips
[not_all_sd_disks]
type=disk
devices=!sda, !sdc
readahead=4096
:::

在自定义配置集中执行脚本

script 插件在加载或卸载配置集时会执⾏⼀个外部脚本或可执⾏⽂件。在 [script] 部分中,script 属性会指定要执⾏的脚本。shell 脚本驻留在 /etc/tuned/profilename⽬录中。
shell 脚本库 /usr/lib/tuned/functions 可⽤于导⼊常⽤功能。

调优脚本必须识别 start 和 stop 参数。start 参数会在激活配置集时启⽤调优设置。当配置集停⽤时,stop参数会恢复先前应⽤的所有调优设置。建议查看 tuned 软件包中提供的并由内置调优配置⽂件、/usr/lib/tuned/powersave/script.sh 以及 /usr/lib/tuned/sap/script.sh 使⽤的现有脚本。

以下⽰例显⽰⼀个空脚本模板,不含任何调优内容,但为⾃定义脚本提供了⼀个不错的起点:

#!/usr/bin/sh
./usr/lib/tuned/functions

satrt(){

}

top(){

}

process $@

image.png

若要添加 /etc/tuned/RH442/script.sh 脚本⾄ RH442 配置集,可将以下内容添加⾄ /etc/tuned/RH442/tuned.conf:
:::tips
[script]
script=${i:PROFILE_DIR}/script.sh
:::
在以上示例中,${i:PROFILE_DIR} 使⽤了可返回配置集和 tuned.conf ⽂件的位置的 PROFILE_DIR 内置
函数。

验证是否生效:
image.png

使用tuned-adm verify验证是否配置都生效了,发现错误
image.png
查看日志var/log/tuned/tuned.log
image.png
发现是energy_perf_bias的问题,注释掉重启服务即可
image.png
image.png

使用当前目录下的脚本
:::tips
[my_script]
type=script
script=profile.sh
:::

tuned.conf的具体使用看man tuned.conf

查看tuned支持的插件:
:::tips
rpm -ql tuned | grep 'plugins/plugin_.*.py$'
:::
image.png

在⾃定义配置集中设置 sysctl 参数:
⾃定义调优配置集可设置 sysctl 参数。sysctl 调优插件⽤于为 /proc/sys 中管理的内核可调项设置值。
在配置集配置⽂件中,创建⼀个名为 [sysctl] 的部分。在 [sysctl] 部分中,按照在 /etc/sysctl.conf 或/etc/sysctl.conf.d/ ⽂件中为⾃定义配置集定义可调项的相同⽅式来设置内核可调项。

要在 RH442 ⾃定义配置集中将 net.ipv4.icmp_echo_ignore_all 设置为 1,/etc/tuned/RH442/tuned.conf 配置⽂件必须包含以下内容:
:::tips
[sysctl]
net.ipv4.icmp_echo_ignore_all=1
:::

开机脚本是系统启动后最后一个启动的文件
比如挂载可以写开机脚本里,也可以写fstab里
mount -t ntfs-3g /dev/sdb1 /var/www/html
cat /etc/fstabe

系统启动时,会启动 web 服务, web 服务读取/var/www/html中的文件,但是当系统启动时,该目录还未加载,等到系统启动完成后才加载

跟随服务一起启动和关闭更符合业务需求

posted @ 2023-03-19 08:42  风有遗霜  阅读(326)  评论(0编辑  收藏  举报