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

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

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

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

从硬件的角度上来说,首先要移除不必要的外围设备,这样可以使操作系统减少一些不必要的中断处理,也降低了驱动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 = 21000000net.core.wmem_max = 21000000net.core.rmem_default = 20000000net.core.wmem_default = 20000000net.ipv4.udp_mem = 3072960 20000000 21000000net.ipv4.tcp_timestamps = 0net.ipv4.tcp_ato_min = 4net.ipv4.tcp_delack_min = 4kernel.sched_nr_migrate = 2

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

 SELINUX=disabled

4、关闭服务

    chkconfig cpuspeed offchkconfig irqbalance off

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

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

湖南麒麟实时操作系统调优指南相关推荐

  1. 国产数据库清单;微盟《生产环境和数据恢复》;TiDB招聘;Oracle备份还原指南、GaussDB性能调优指南……墨天轮数据库周刊-第5期

    热门资讯 1.国产数据库清单(2020年第1季度)发布! modb.pro/db/22488 [摘要]本文统计了国产数据库产品清单,共58个产品仅供参考,同时在清单下方简单整理了各产品的基本介绍.应用 ...

  2. GPU性能优化之CUDA调优指南

    GPU性能优化之CUDA调优指南 GPU性能优化之CUDA调优指南 1 整体性能优化策略 2 最大化利用率 2.1 应用程序层次 2.2 设备层次 2.3 多处理器层次 2.3.1 占用率计算 3 最 ...

  3. 软件性能测试完整指南,软件性能测试与调优指南.pdf

    软件性能测试与调优指南 软件性能测试与调优指南 Page 1 of 36 版本信息 名称 编 号 1.0 拟 制 版本号 初稿 审 核 软件性能测试与调优指南 密 级 普通 共38页 批 准 更改信息 ...

  4. Hadoop数据库性能调优指南

    Hadoop数据库性能调优指南 作为谷歌云计算基础架构的模仿实现,Hadoop堪称业界最经典的开源云计算平台软件. 详细解读 和小伙伴们一起来吐槽

  5. 高性能服务器编程代码清单9-3,JRockit JVM优化清单/调优指南

    摘要 本文的目的是以清单的方式提供BEA JRockit JVM的调优信息.从深奥的命令行选项到迭代性能测试,本文涵盖了许多方面.大部分数据都是我与用户合作过程中收集的.您要是也有什么技巧的话,请告诉 ...

  6. 【Flink】Flink on RocksDB 参数调优指南

    1. 背景 对于需要保存超大状态(远超于内存容量)的流计算场景来说,目前 RocksDB [1] 是 Flink 平台上官方实现的唯一选择.业界也有使用 Redis 等其他服务作为状态后端的方案,但终 ...

  7. Flink on RocksDB 参数调优指南

    对于需要保存超大状态(远超于内存容量)的流计算场景来说,目前 RocksDB [1] 是 Flink 平台上官方实现的唯一选择.业界也有使用 Redis 等其他服务作为状态后端的方案,但终究不够成熟, ...

  8. HotSpot虚拟机GC调优指南

    原文:https://docs.oracle.com/javase/9/gctuning/JSGCT.pdf 1简介 从桌面小程序applet到大型服务器上的Web服务,有各种各样的应用程序在使用Ja ...

  9. 微信小游戏的内存调优指南

    微信小游戏开发.测试.现网三阶段的内存调优工具使用指南: 包含微信开发者工具,微信Android性能面板,PerfDog,小游戏云测试和小游戏性能助手等工具. 前言 在开发微信小游戏的过程中,开发者往 ...

  10. linux 分析磁盘性能,03.分析性能瓶颈 - 3.4.磁盘瓶颈 - 《Linux性能调优指南》 - 书栈网 · BookStack...

    磁盘瓶颈磁盘瓶颈性能调优选项 磁盘子系统通常是服务器性能的最重要方面,是瓶颈问题的高发部件.但是,磁盘问题表现的有时候并不是那么直接,比如说可能是内存不足.如果CPU周期浪费在等待I/O任务完成,应用 ...

最新文章

  1. xpath选择器简介及如何使用
  2. 《小账本》开发日志 第三天
  3. 暴走英雄坛html5游戏在线玩,暴走英雄坛h5
  4. 打开应用蜂窝移动数据就关闭_基于移动应用行为数据的客户流失预测
  5. Android之tint图片着色器
  6. C——用冒泡排序法、选择排序法对随机输入的10个整数从小到大排序
  7. http://www.iteye.com/topic/114392
  8. 数据结构分类概述【转载】
  9. web.xml mysql_JSP登录验证脚本失败(mysql后端)web.xml servlet映射?
  10. MIT研制出空陆自动切换型无人机技术,构想多年的“飞行车”或将实
  11. Linux文件查看与查找命令
  12. 汉庭季琦:我用IT精神打造传统产业
  13. android 按钮添加图片并靠左显示
  14. VideoProc for mac(全能视频处理软件)
  15. 1.NanoPi M1(全志H3)基于wiringPi的GPIO控制总结
  16. python竖着展示诗_竖着写诗的格式
  17. 达梦数据库全文索引使用示例
  18. 虚拟服务器 vmotion,vSphere vMotion能够同时迁移多少台虚拟机?
  19. axure 表格自适应界面
  20. 《物联网NB-IoT》软件安装及环境配置

热门文章

  1. UNIX环境高级编程-#include “apue.h“
  2. [XJTUSE编译原理]第四章 语法分析——自上而下分析
  3. java gbk转机内码_gbk内码转中文方法
  4. 家谱宗族网站源码_云码宗谱网络家谱软件
  5. Rhadoop集群搭建
  6. 格雷码(Gray Code)编码、实现及规律(附编码)
  7. c语言棋盘上的麦粒switch,C语言教材后习题及答案.doc
  8. edius隐藏快捷键_Eduis快捷键,大家参考一下!【EDIUS】史上最全的EDIUS快捷键资料分享!...
  9. php++redius,【答疑】请问edius音波显示快捷键是什么呢?怎么使用的呢? - 羽兔网问答...
  10. 基于weber的齿轮啮合刚度计算