English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 7|回复: 0

银河麒麟v10 sysctl内核参数加载顺序的思考

[复制链接]
查看: 7|回复: 0

银河麒麟v10 sysctl内核参数加载顺序的思考

[复制链接]
查看: 7|回复: 0

227

主题

0

回帖

691

积分

高级会员

积分
691
q4vqL2pB

227

主题

0

回帖

691

积分

高级会员

积分
691
4 天前 | 显示全部楼层 |阅读模式
背景

最近很多伙伴想使用银河麒麟高级服务器系统v10来部署最新版本的k8s集群,可能遇到了各式各样的问题,于是准备使用kylinOS v10重温一遍kubeadm部署最新版本k8s的流程,也是替大家踩踩坑。
在进行服务器基础配置优化时,到内核参数修改这一步,引发了一些新的思考。
过程

在修改内核参数时,我很熟练的执行了以下命令:
cat > /etc/sysctl.d/k8s.conf << EOFnet.ipv4.ip_forward = 1net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.conf.all.route_localnet = 1vm.overcommit_memory=1vm.panic_on_oom=0vm.swappiness = 0fs.inotify.max_user_watches=89100fs.file-max=52706963fs.nr_open=52706963net.netfilter.nf_conntrack_max=2310720net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_intvl =15net.ipv4.tcp_max_tw_buckets = 36000net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_max_orphans = 327680net.ipv4.tcp_orphan_retries = 3net.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_syn_backlog = 16384net.ipv4.tcp_max_syn_backlog = 16384net.ipv4.tcp_timestamps = 0net.core.somaxconn = 16384EOF然后:
sysctl -p 然后随便验证了一个ip_forward的参数,发现其值还是0:
cat /proc/sys/net/ipv4/ip_forward0突然就想到,我执行sysctl -p在不加任何参数的情况下,是同步/etc/sysctl.conf 文件的,而kylinOS v10默认的/etc/sysctl.conf文件中,ip_forward的值设置为0,所以其参数值并没有被修改。
引发的思考

既然我执行sysctl -p 时仅同步/etc/sysctl.conf文件,那如果我reboot后,其最终生效的文件是哪个呢?
以前没有深究过系统重启后内核参数的加载顺序问题,正好趁这次机会,好好学习一下完整的加载流程。
系统版本说明

# nkvers ############## Kylin Linux Version #################Release:Kylin Linux Advanced Server Release V10 (Trading)Kernel:4.19.90-89.18.v2401.ky10.x86_64Build:Kylin Linux Advanced ServerRelease V10 SP3 2403/(Trading)-x86_64-Build03/20240813#################################################内核参数加载顺序的深究

通过一些官方的相关文档和前辈的指导,基本摸清了重启后的加载顺序,详情如下。
内核参数加载的相关服务

系统重启后,与内核参数加载的服务,一共有两个,分别是systemd-sysctl.service和tuned.service。
查看服务状态:
# systemctl status systemd-sysctl.service ● systemd-sysctl.service - Apply Kernel Variables   Loaded: loaded (/usr/lib/systemd/system/systemd-sysctl.service; static; vendor preset: disabled)# systemctl status tuned.service ● tuned.service - Dynamic System Tuning Daemon   Loaded: loaded (/usr/lib/systemd/system/tuned.service; enabled; vendor preset: enabled)一般情况下,这两个服务都会生效,有时tuned.service会被设置为disable,不让其开启自启,我们先来介绍以下这两个服务单元的生效规则和配置文件范围。
systemd-sysctl.service服务

此服务时是系统初始化阶段sysinit.target隐式调用的,会在系统启动时,自动执行一次,其加载配置文件路径为:
/run/sysctl.d/*.conf/etc/sysctl.d/*.conf/usr/local/lib/sysctl.d/*.conf/usr/lib/sysctl.d/*.conf/lib/sysctl.d/*.conf/etc/sysctl.conftuned.service服务

此服务可设置为开机自启,也可取消,自由控制,其加载配置文件路径为:
/usr/lib/tuned/balanced/tuned.conf/usr/lib/tuned/desktop/tuned.conf/usr/lib/tuned/latency-performance/tuned.conf/usr/lib/tuned/network-latency/tuned.conf/usr/lib/tuned/network-throughput/tuned.conf/usr/lib/tuned/powersave/tuned.conf/usr/lib/tuned/recommend.d/50-tuned.conf/usr/lib/tuned/throughput-performance/tuned.conf/usr/lib/tuned/virtual-guest/tuned.conf/usr/lib/tuned/virtual-host/tuned.conf配置文件加载顺序

理论上软件包应将自带的配置文件安装在/usr/lib/目录下,/etc目录仅供系统管理员使用。
一般情况下,当tuned.service服务设置为enable时,加载顺序是先加载systemd-sysctl.service服务对应的配置文件,再加载tuned.service服务的配置文件。
多个文件中有相同内核参数的配置时,后加载的会将先加载的值覆盖掉,这是一个固定的规则!
每个服务又有这么多的配置文件生效路径,那他们的加载顺序是怎样的呢?
systemd-sysctl.service加载顺序


  • 配置文件必须符合filename.conf格式,不同目录下的同名配置文件,仅以优先级最高的目录中的配置文件为准。目录优先级顺序如下:/etc > /run > /usr/local/lib > /usr/lib > /lib
  • 读取完以上目录下的配置后,最后读取/etc/sysctl.conf。虽然/etc/sysctl.conf的读取优先级最低,但由于相同内核参数下,后加载会覆盖先加载的值,故最终生效的是/etc/sysctl.conf文件的值
  • 除了同名的配置文件,其他所有的配置文件与目录无关,统一按照文件名的字典顺序处理。为了便于排序,建议给配置文件都加上两位十进制数字的文件名前缀,这样会先加载数字小的,后加载数字大的文件,同样,相同参数后加载会覆盖先加载的
示例:
有以下几个配置文件:
/usr/lib/sysctl.d/10-default-yama-scope.conf/usr/lib/sysctl.d/50-pid-max.conf/etc/sysctl.d/99-sysctl.conf/usr/lib/sysctl.d/kylin.conf读取顺序一定是:
/usr/lib/sysctl.d/10-default-yama-scope.conf --> /usr/lib/sysctl.d/50-pid-max.conf --> /etc/sysctl.d/99-sysctl.conf --> /usr/lib/sysctl.d/kylin.conf --> /etc/sysctl.conf
tuned.service加载顺序


  • 如果tuned.service是enable状态,则其后于systemd-sysctl.service加载。
  • tuned分为多种模式,每种模式对应其配置文件,tuned-adm active可查看系统使用的哪种模式,tuned-adm list profiles查看系统支持的模式,tuned-adm profile [name]设置系统为某模式,例如,本系统为:
    # tuned-adm activeCurrent active profile: virtual-guest则其对应加载的配置文件为:/usr/lib/tuned/virtual-guest/tuned.conf
  • 对应的tuned.conf文件加载完毕后,tuned服务还会执行sysctl --system命令,如果配置的参数和之前加载的配置文件有相同内核参数,同样会覆盖。
    sysctl --system执行加载顺序如下:
    # sysctl --system | grep Applying* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...* Applying /usr/lib/sysctl.d/50-coredump.conf ...* Applying /usr/lib/sysctl.d/50-default.conf ...* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...* Applying /usr/lib/sysctl.d/50-pid-max.conf ...* Applying /etc/sysctl.d/99-sysctl.conf ...* Applying /etc/sysctl.d/k8s.conf ...* Applying /usr/lib/sysctl.d/kylin.conf ...* Applying /etc/sysctl.conf ...
临时主动加载配置文件

系统中还可以使用sysctl -p来主动加载指定内核参数配置文件生效,其后不指定任何文件时,默认加载/etc/sysctl.conf,若指定文件,则表示加载指定文件,例如:
sysctl -p /etc/sysctl.d/k8s.conf银河麒麟系统中需要注意的点

银河麒麟系统中默认有个/usr/lib/sysctl.d/kylin.conf内核参数配置文件,其中已经配置诸多优化参数,其命名规则加载顺序较为靠后,所以在配置与其文件相同的参数项时,需要注意:

  • 将文件命名修改为在kylin.conf其后加载
  • 也可以选择直接修改kylin.conf中的配置
  • 直接配置到/etc/sysctl.conf中
总结


  • tuned.service后于systemd-sysctl.service加载
  • 不同目录同名配置文件取目录优先级高的,非同名统一按照文件名的字典顺序加载
  • 优先级越高越先加载,越低越后加载,/etc/sysctl.conf最后加载
  • 别忘记/usr/lib/sysctl.d/kylin.conf文件
  • 别忘记相同参数覆盖的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

227

主题

0

回帖

691

积分

高级会员

积分
691

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-5-1 04:56 , Processed in 2.782264 second(s), 20 queries .

Powered by 智能设备

©2025