湖南麒麟实时操作系统调优指南

本文详细介绍了针对硬实时操作系统进行性能调优的策略,包括硬件优化、内核调整和应用软件的优化。调优过程涉及关闭电源管理、禁用不必要的硬件功能、优化中断处理、调整内核参数以及限制实时任务迁移等。此外,还强调了实时任务的优先级设置、文件系统优化、网络配置和日志管理等方面的重要性。通过这些措施,可以显著提高操作系统的实时性和稳定性。
摘要由CSDN通过智能技术生成

        湖南麒麟实时操作系统的实时性是建立在正确地调优之上的。硬实时任务的要求较为苛刻,对系统的确定性以及稳定性有较高要求,需要硬件、系统以及软件的相互配合才能达到其要求。

         硬实时任务对操作系统的延迟以及稳定性提出了非常苛刻的要求,为了满足这一要求,需要硬件、系统以及应用软件自身的配合。硬件与操作系统在设计时往往是要综合考虑各种各样的需求的,力图综合性能强大。而硬实时任务是一种特化的需求,这时就需要对操作系统以及硬件进行精细调整,以求收益的最大化。实时软件在部署时也需要针对硬件做出一些调整。

         调优是一个比较枯燥的任务,需要大量的分析和尝试,因此调优中最经常用到的手法就是控制变量法。也就是说,在调优过程中,保持大部分参数不变,只改动一个或者几个参数,然后测试并观察结果。通过这样的微调慢慢地找到最佳参数,而大跨度的参数调整往往会让人迷失方向。

         一般从硬件、内核、应用软件三个大方面入手,进行调优。

从硬件的角度上来说,首先要移除不必要的外围设备,这样可以使操作系统减少一些不必要的中断处理,也降低了驱动bug导致延迟异常的可能性。其次就是要关闭电源管理,以x86架构为例,我们可以在BIOS中关闭ACPI的部分电源模式。不同主板的BIOS之间是存在差异的,但是只要遵照“一切降低能耗的行为都会对系统整体的性能有影响”这一准则行动即可。对于x86架构来说,还有一个比较重要的影响因素,被称作SMI中断。简单来说,SMI中断是一类比较特殊的中断,对操作系统是透明的,即不受操作系统管制,触发时会使CPU进入SMM模式并执行BIOS中的中断处理代码。硬件厂商用它来完成一些与硬件故障检测相关的例行任务。

对内核的调整比较杂乱,涉及的东西比较多,主要分为对内核子系统的参数微调与处理器的重分配。对调度延迟影响比较大的内核子系统有中断子系统、调度器和定时器。对于一个线程来说,运行时的page fault与cache命中率对延迟有较大影响。同一个线程在不同处理器上的迁移(migrate)操作由于要刷新TLB和cache也会对延迟有较大影响,一般会限制此类操作。由于实时内核强制使用内核线程进行中断处理,我们可以启用CPU隔离将大部分的中断处理内核线程和全部的普通优先级进程分配给一个单独的CPU进行处理,剩余的CPU可以专门处理实时任务。但是某些特定情况下将实时任务和其依赖的硬件中断处理线程放到一个CPU上也是可以降低延迟的。从应用的角度上来说,我们应该将实时任务设置为SCHED_FIFO调度策略并设置一个比较高的优先级。

一、基本调优策略

1)    系统和应用隔离
        a)    使用隔离的CPU运行应用;
        b)    绑定线程和IRQ到隔离的CPU;
        c)    至少预留一个CPU给系统使用,一般把cpu0给系统使用。


2)    评定应用的优先级,更重要的任务拥有更高的优先级,不要使用优先级99,尽可能使用较低的优先级。一般原则为,在满足实时要求下给予一个进程最低的优先级。由于SCHED_FIFO调度策略在线程没有主动释放CPU时不会被强行抢占,高优先级的SCHED_FIFO有可能会影响重要的内核线程。
3)    周期性发生的中断和相关线程可绑定相同的CPU,最大限度的使用cache共享。
4)    确定IRQ的优先级,一般来说NIC中断要高于USB中断。
5)    把应用和对应产生的IRQ绑定到相同CPU。


二、系统tuning项

1.BIOS options

对BIOS的基本调整原则为
    1)     关闭一切电源管理相关选项,禁止系统通过任何手段进行降频、节能等操作。一切此类操作都会对系统性能产生影响,同时充满各类不确定性,可能产生各种延迟。
    2) 关闭一切与SMI中断有关的BIOS选项。X86处理器可以通过SMI中断进入SMM模式,执行BIOS指定的代码,该特性经常用于实现各类硬件异常检测与日志功能。由于此类中断绕过了操作系统,在操作系统层面不容易检测到,可能会产生较大延迟。rt-tests包中提供了hwlatdetect工具可以监测此类中断产生的延迟。

X86主板BIOS中常见选项:
1)    Power Management
        a)    Intel SpeedStep//一个通过降低CPU运行主频来达到降低功耗的技术
        b)    AMD PowerNow//省热降频
2)    System Management Interrupts (SMI)/ System management mode//系统管理模式SMM
        a)    Not handled by OS, handled by BIOS code
        b)    Used by many system services
        –    Thermal management//温度管理
        –    Error Detection and Correction(EDAC)//错误检测与纠正单元
        –    IPMI(Intelligent Platform Management Interface)//智能平台管理接口,管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准,用户可以利用IPMI监视服务器的物理健康特征,如温度、电压、风扇工作状态、电源状态。IPMI 信息通过基板管理控制器 (BMC)(位于 IPMI 规格的硬件组件上)进行交流。

2.System Services/SELinux

对系统服务调整的原则为尽量关闭一切无关系统服务,系统安装时可能会默认安装并启动一些与实时任务无关的系统任务,如sendmail(邮件服务)等等。与此同时,需要关闭一些与电源管理和负载均衡相关的系统服务。

关闭相关服务:
1)    Cpuspeed – 控制电源管理相关的特性
2)    Irqbalance – 根据负载情况动态分配中断
3)    pcscd

# /sbin/chkconfig cpuspeed off
# systemctl stop irqbalance
# systemctl disable irqbalance
# systemctl disable pcscd
# systemctl stop pcscd


SELinux会对大部分系统操作进行权限检查,增加额外开销,导致关机时间变长,所以部署系统一定要关闭SELinux。可以修改/etc/selinux/config文件,将SELINUX字段设置为disabled。
 

3.Cores/NUMA memory nodes

由于现代的SMP系统拥有大量的CPU,内存访问成了系统整体的瓶颈,NUMA架构就是这个背景下的产物。NUMA(Non-uniform memory access)是一种内存模型,在这个模型下,系统中每个CPU对于各个内存区域的访问速度是不一样的。将每个CPU访问速度最快的内存区域称为它的本地内存,访问较慢的内存称为远内存。Linux中使用Node表示这样的内存区域。对于互相关联的进程或线程(如存在共享内存,进程间通信等),尽量分配到同一个NUMA节点中。 
进程从一个CPU的调度队列(Run Queue)被转移至另一个CPU的调度队列的操作被Linux内核称为Migration。在实时系统中,需要尽量避免这样的操作,被转移的任务在新的CPU上被第一次执行时,新的CPU需要重新建立TLB缓存,以及CPU本地cache,会有比较大的延迟。
对于实时系统,可以将一部分CPU从系统整体中隔离开来,专门用于执行实时任务,这样可以减小实时任务被系统任务干扰的可能。
    partrt工具可以将SMP系统中的CPU核心划分成两个部分,一个部分为实时部分,默认称为rt,另一部分用于运行非实时任务,默认称为nrt。其具体原理为使用cgroup中的cpuset子系统进行CPU的再分配。常见操作举例,假设系统有0-40号CPU:
  

  partrt create ‘#10-39’       // 将系统中10-39号CPU隔离出来,用以执行实时任务
                            // 10-39号用于执行实时任务的cpu集合称为rt,其余为nrt


创建的rt集合默认是关闭SMP负载均衡的,即一个进程在某个CPU上开始运行后不会被迁移到其他的CPU上。可以使用:
  

  partrt config sched_load_balance 1


开启SMP负载均衡。

partrt move $$ rt    // 将当前shell进程移动到rt中,之后此shell运行的命令
// 都会自动被分配到rt中


4.Timers//计时器选择

1)    Realtime中使用tsc(Timestamp Counter Register)
grub参数:clocksource=tsc
powernow-k8.tscsync=1 //AMD速龙CPU频率同步转换

5.其他内核启动参数


1)    idle=poll //禁止cpu进入idle状态,更小的延迟,带来更高的能量损耗
2)    processor.max_cstate=1 //禁止时钟进入c-state
3)    nohz=on //在特定情况下停止系统时钟中断。
4)    nosoftlockup //阻止内核使用soft lockup
5)    intel_pstate=disable//禁止intel idle驱动进行电源管理和CPU频率调整
 

6.Journal fs


文件系统的日志功能会增加文件写入以及文件属性修改的不确定性,可以修改/etc/fstab文件中的文件系统挂载选项禁用掉atime和diratime。
禁止更新xfs日志文件系统的atime(文件最后访问读取时间)和nodiratime(目录最后访问读取时间)。

#vim /etc/fstab
/dev/mapper/kylin-root  /     xfs     noatime,nodiratime        0 0 


7.避免运行额外程序


1)    使用多用户模式,关闭图形界面:

# systemctl set-defaul t multi-user. target


2)    禁用sendmail服务
3)    禁用Remote Procedure Calls (RPCs)
4)    禁用Network File System (NFS)
5)    禁用Mouse Services
    如果不使用图形界面,取消鼠标设备,卸载gpm
6)    Automated tasks
    检查cron或at任务。
 

8.内存交换(menory swapping)


1)    确保系统有足够的内存,vmstat中si、so最好是0。
2)    Out of Memory ( OOM)
OOM时,推荐使内核进入panic,而不是用oom_killer。因为OOM状态下,系统具有不确定性。

#echo 1 > /proc/sys/vm/panic_on_oom
/proc/PID/ oom_adj、/proc/PID/ oom_score  //决定oom_killer杀掉进程的2个参数


9.网络


1)    考虑是否必须用TCP。TCP协议的重传,Nagle算法,建立及关闭存在不确定性,在协议层面上就有高延迟的可能。
2)    考虑在socket编程中使用TCP_NODELAY套接字选项禁用Nagle buffering algorithm。
3)    Interrupt Coalescing //ethtool –C
4)    Congestion //ethtool –A
5)    使用Infiniband(IB)
6)    设置/etc/sysctl.conf

net.ipv4.tcp_timestamps = 0 //关闭timestamps
net.ipv4.tcp_ato_min = 4 // The ACK timeout interval (ATO),ACK超时时间
net.ipv4.tcp_delack_min = 4 //Delayed ACK


7)    使用RoCEE (RDMA over Converged Enhanced Ethernet)and High Performance Net working

10.Syslog


1)    禁用syslogd

#service rsyslog stop


2)    必须使用时请设置合适的syslog日志上传时间。

11.OTHER migration


1)    Using sched _nr_migrate to Limit SCHED _OTHER Task Migration//限制使用OTHER调度策略的进程转移到空闲CPU

# echo 2 > /proc/sys/kernel/sched_nr_migrate


12.实时调度节流


1)    /proc/sys/kernel /sched_rt_period_us //设置实时进程使用CPU的带宽
2)    /proc/sys/kernel/sched_rt_runtime_us //设置实时进程使用CPU的百分比
 

三、实时应用程序调优


1)    避免使用POSIX signals。使用POSIX Threads运行工作线程或通信。
2)    避免使用sched _yield系统调用和其他同步机制。
3)    互斥锁处理。使用POSIX thread (pthread) mutex constructs。
4)    Socket编程中使用TCP_NODELAY、TCP_CORK选项。
5)    使用rtctl设定调度优先权。
6)    程序开始时加载动态链接库。
7)    使用_COARSE POSIX Clocks。

四、附录

  • 参数的持久化方法


直接修改/proc/sys/目录下对应的文件的值只作用于当前运行状态,在系统重新启动之后就会失效。可以通过修改/etc/sysctl.conf文件的值将修改持久化,使得系统重新启动之后仍然保留这些设置。具体方法如下:

以/proc/sys/kernel/sched_rt_runtime_us文件为例,首先将/proc/sys/前缀去掉,得到kernel/sched_rt_runtime_us。然后将/替换为.得到kernel.sched_rt_runtime_us最后在/etc/sysctl.conf文件中写入
kernel.sched_rt_runtime_us = <对应的值>

这样一行即可。

  • grub.conf内核命令行参数举例
clocksource=tsc idle=poll processor.max_cstate=1 intel_pstate=disable nosoftlockup nohz=on rcu_nocb_poll
  • 调优实例

1、修改内核参数
    grub里增加参数:
  

clocksource=tsc idle=poll process.max_cstate=1 intel_pstate=disable nosoftlockup nohz=on rcu_nocb_poll


2、修改/etc/sysctl.conf
    增加: 

 net.core.rmem_max = 21000000
    net.core.wmem_max = 21000000
    net.core.rmem_default = 20000000
    net.core.wmem_default = 20000000
    net.ipv4.udp_mem = 3072960 20000000 21000000
    net.ipv4.tcp_timestamps = 0
    net.ipv4.tcp_ato_min = 4
    net.ipv4.tcp_delack_min = 4
    kernel.sched_nr_migrate = 2

3、关闭selinux
    修改/etc/selinux/config:
  

 SELINUX=disabled


4、关闭服务

    chkconfig cpuspeed off
    chkconfig irqbalance off


5、BIOS里把IPMI关闭了
    powermanager关闭
    超线程关闭
6、vim /etc/fstab
  

  /dev/mapper/kylin-root  /          xfs     noatime,nodiratime        0 0


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值