内核实时性能调优

内核实时性能调优

参考 Red Hat Tuning Guide

常用的系统优化选项

  • 编辑 /etc/sysctl.conf

    任何在 /proc/sys/ 下的参数都可以通过编辑 /etc/sysctl.conf 把参数固定

    比如 echo 0 > /proc/sys/kernel/hung_task_panic 可以编辑 /etc/sysctl.conf

    # Enable gettimeofday(2)
    kernel.hung_task_panic = 0
    

    然后使用 sysctl -p 命令刷新

    ~]# sysctl -p
    ...[output truncated]...
    kernel.hung_task_panic = 0
    

    也可以通过编辑 /etc/rc.d/rc.local 实现,这个脚本是SysV Init启动脚本时代的产物,现在systemd也会去启动它,由于这个脚本无法处理依赖什么的,而且有可能会在tty下输出日志,导致切换登陆登出(切换到tty过度时)显示日志,所以不推荐

  • 设置BIOS

    禁用BIOS的电源管理选项,EDAC(Error Detection and Correction, 错误检测和纠正功能),编辑SMI功能

  • 绑定中断和进程

    1.首先关闭 irqbalance 服务,这个服务强制将中断平均分给每个核

    2.从 IRQ 平衡中排除 CPU,通过编辑 /etc/sysconfig/irqbalance 的 IRQBALANCE_BANNED_CPUS= 参数,比如在一个16核的机器上排除8-15核,即参数编辑为 IRQBALANCE_BANNED_CPUS=0000ff00,这个时候irqbalance就会忽略8-16核,当cpu核比较多时,每三十二个核用逗号隔开,比如IRQBALANCE_BANNED_CPUS=00000001,0000ff00

    3.手动设置中断的cpu亲和性,通过 /proc/interrupts 查看所有中断,然后将某个中断指定仅在某个cpu上处理,比如中断142仅在cpu0上处理使用 echo 1 > /proc/irq/142/smp_affinity 实现

  • 使用taskset

    taskset可以设置未运行/已运行的程序的cpu亲和性,taskset 8/0x00001000 /usr/local/bin/example_process 设置example_process仅在cpu3上运行,taskset -p 1 110 设置PID为7013的进程仅在cpu0上运行;taskset在NUMA系统上工作,但是他不能将进程绑定到cpu和最近的NUMA内存节点,如果要设置请使用numactl

  • 文件系统禁用atime

    编辑/etc/fstab文件,挂载点添加 noatime,nodiratime参数限制对文件系统日志的写入次数来提高性能并降低功耗

  • 使用硬件时钟作为系统时间戳

    由于有些时钟的已知问题,系统使用的时钟可能无法满足实时系统的最低要求,可以更换时钟源,也可以为 TSC 时钟配置附加引导参数,比如 idle=poll processor.max_cstate=1 避免时钟进入空闲和节能模式

  • 关掉非必需的程序

    比如关掉桌面服务,使用 systemctl set-default multi-user.target 配置系统启动进入文本模式,MTA(邮件传输)服务,RPC(远程过程调用),NFS,鼠标服务(GPM),自动化任务(corn等)

  • 保证有足够的内存,避免产生内存交换

    OOM行为的开关为 /proc/sys/vm/panic_on_oom ,设置为1时OOM会出发kernel panic,设置为0时内核会调用oom_killer

  • 网络方面的优化

    可以关闭tcp的时间戳来减少资源占用,在sysctl.conf文件添加net.ipv4.tcp_timestamps = 0

  • 系统日志优化

    配置系统日志服务的配置文件,可以将本地的部分/所有日志传输到远程机器上记录

  • 禁用PC卡守护进程

    PC卡守护进程 pcscd daemon 用于管理PC/SC智能卡读卡器的连接,虽然这个服务优先级低,但是占用的cpu资源多,可以考虑禁用这个服务

  • CPU隔离

    隔离一组cpu核,供系统的一个或者多个实时进程独占使用;首先应该分析CPU拓扑,将相关线程放置在同一NUMA节点包含的核心上,最大限度的共享二/三级缓存,lscpu和tuna命令可以用来确定cpu拓扑结构,tuna gui可以动态隔离cpu,还能将线程和中断从一个cpu移动到另一个cpu,方便测量性能影响

    tuna包提供tunad守护进程,实现开机自动进行cpu隔离和其他优化,主要的两个配置文件为 /etc/tuned/realtime-variables.conf , /usr/lib/tuned/realtime/tuned.conf ,其中/etc/tuned/realtime-variables.conf 指定了要隔离的cpu内核组,下面是个配置文件例子

    # Examples:
    # 隔离cpu 1,2,3,5,9,10,11,12,13,14
    isolated_cores=1-3,5,9-14
    

    也可以将参数添加进内核启动参数,开机时服务会自动加载插件

    isolcpus=1-3,5,9-14 nohz=on nohz_full=1-3,5,9-14 intel_pstate=disable nosoftlockup
    如上,参数含义分别为隔离指定cpu核;在空闲的cpu上关闭timer tick;当 CPU 上只有一个可运行任务时,关闭该 CPU 上的timer tick;防止 Intel 空闲驱动程序管理电源状态和 CPU 频率;防止内核检测用户线程中的软锁定 
    

    注:NOHZ模式:系统为了节约功耗或者进入idle模式后不希望系统提供默认的HZ次tick事件,而是希望动态调整tick事件数。以上函数对应tick_device中的event_handler回调函数。

  • 降低CPU性能峰值

    实时 Linux 系统上延迟峰值的常见来源是多个 CPU 抢占 Linux 内核timer tick处理程序中的公共锁时产生的,使用 skew_tick=1 启动参数减少这些锁的抢占

实时特定调优

注意:请在完成 常用系统优化选项 之后再使用这一章的工具,不然不会有效果

  • 设置调度优先级

    RedHat的实时内核支持微调调度优先级,使用systemd可以实现,比如更改程序xxxx的优先级,新建 /etc/systemd/system/xxxx.system.d/priority.conf 文件,插入一下内容

    [SERVICE]
    CPUSchedulingPolicy=fifo
    CPUSchedulingPriority=20
    EOF
    

    Policy和Priority可以参考如下两图

    7 PriorityMap

配置 /etc/systemd/system/xxxx.system.d/affinity.conf 可以设置程序的CPU亲和性

[SERVICE]
CPUAffinity=0,1
EOF

配置完记得执行 systemctl daemon-reload 重启systemd守护进程,systemctl restart xxxx.service 重启xxxx服务

posted @   Ditvelo  阅读(958)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示