内核实时性能调优
内核实时性能调优
常用的系统优化选项
-
编辑 /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,0000ff003.手动设置中断的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可以参考如下两图
配置 /etc/systemd/system/xxxx.system.d/affinity.conf
可以设置程序的CPU亲和性
[SERVICE]
CPUAffinity=0,1
EOF
配置完记得执行 systemctl daemon-reload
重启systemd守护进程,systemctl restart xxxx.service
重启xxxx服务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具