当前位置: 首页 > 科技观察

Linux系统性能评估基准系统配置及其原理

时间:2023-03-12 06:04:02 科技观察

总结开发者在高性能系统的性能调优过程中,经常会遇到各种背景噪音,导致采集到的数据不准确。本文主要从CPU和Linux操作系统的角度分析各种噪声的来源和排除方法。最终目标是打造一个对特定cpu实现“0”干扰的benchmark平台。CPU运行中背景噪声干扰的几种来源1.调度器:进程调度器对系统的影响几乎无处不在,Linux内核一般采用公平分时调度策略(CFS)。需要特定参数来调整调度程序的行为,以最大限度地减少对测量过程的干扰。2.中断:中断是系统必须响应的事件。它具有更高的优先级,可以抢占普通用户进程。A。硬件中断主要来自外部事件,CPU需要非常及时的响应。比如最常见的IO、clock,Linux内核支持大量的硬件中断,需要注意affinity配置。一些特殊的中断可以被取消。b.软中断Softirq软中断是硬件中断处理的衍生子系统。LInux硬件中断响应只需要处理一些必须立即响应的操作,而将一些可以延迟的操作交给软中断处理。Linux中的软中断有10种,后面我们会分析。C。WorkqueueWorkqueue也是LInux中常见的延时操作任务类型。3.电源管理:现代处理器通常支持一些高级电源管理功能,以便更有效地使用能源。如果这些电源管理功能使用不当,也会影响性能评估。4、时间来源:如果要进行性能评估,就离不开时间戳。因此,时间戳的正确采集方式也很关键。上述因素往往交织在一起。例如,进程调度器需要由时钟中断驱动,电源管理子系统需要由调度器驱动。时间戳的收集也与微架构密切相关。下面我们将对每个案例一一进行分析。系统配置示例系统配置信息:CPU:Intel9900KFP1Frequency3.6Ghz1-coreTurbo5.0GhzHT-disabledRAM:16GBDDR4-3200Ubuntu19.04:Kernel5.0.0-38-genericX86_64BootParameter:BOOT_IMAGE=/boot/vmlinuz-5.0.0-38-genericroot7auid6-2de2-4b9c-921d-5bd5f963c91froipv6.disable=1isolcpus=7nohz_full=7mce=offtsc=reliableno_watchdogirqaffinity=0hpet=disablequietsplashvt.handoff=1Baseline系统配置目标:裸机上(vt-x环境配置控制会比较复杂),将Core7与scheduler隔离开来,将各种因素对Core7的干扰降到最低。启动参数详解:这些红色标记的启动参数,就是我们下面要详细分解的。isolcpus=managed_irqcpuslistisolcpus主要是将目标cpu与scheduler的调度算法隔离开来。也就是说,从用户进程的角度来看,调度器不会主动调度任何进程到目标cpu上。但是仅仅这个参数还是不能保证所有的软/硬中断和一些其他的内核组件不会在目标cpu上运行。nohzfull=cpulist这个参数也有比较弱化的版本nohz。nohz的意思是当目标cpu的runqueue上没有可调度的实体时,cpu进入idle状态。在这种情况下,cpu停止时钟节拍(默认为10ms一次)。然后nohzfull更进一步,当运行队列中只有一个活动实体时停止时钟滴答。这将大大减少(不是100%消除)对唯一正在运行的进程的干扰。值得注意的是,在非服务器版本的内核中一般不会启用nohzfull,需要重新编译内核。可以查看相应的内核编译选项CONFIGNOHZFULL=y。如果未开启,启动日志中会显示警告。同时nohzfull也暗示了rcunocbs=cpulist下图是开启选项成功的日志。下图是未启用编译选项的错误信息。修改内核TimerSystem中的Nowatchdog选项,禁用所有软硬件死锁监控hpet=disable,tsc=reliable这部分主要针对时间子系统。hpet=disable主要是为了避免hpet造成的中断太多而干扰系统。tsc=reliable将tsc标记为可靠,减少运行时间、时间源检查。在我们的验证过程中,这个参数对减少抖动很有帮助mce=offdisablemachinecheck避免中断机器检查是一个高级的RAS功能,对于产品环境来说非常重要,但是我们在评估部分禁用了它。软硬中断的隔离禁用irqblance服务我们不希望任何硬件中断被发送到core7,所以我们需要禁用irqblance服务注意irqaffinity硬件中断的亲和性也需要注意。也是为了防止任何硬件中断被发送到core7。修改/sys/devices/virtual/workqueue/cpumask为1。下面的截图是/proc/interrupts,下图是/proc/softirqs。下图是htop显示的信息。观察到core7上的可调度实体已经被压缩到最少。MSRMSR(ModelSpecificRegister)是配置处理器和获取处理器状态信息的关键接口。有两种主要类型的MSR。Per-CoreMSRMSR等MSR的读写指令必须由本核执行,因此尽量避免从其他核进行读写。比如从core7读写Core3。这样,LInux内核也需要把这个读写操作调度到目标core3上,这样会带来不必要的延迟。同时,如果试图在用户层(ring3)读写msr,则需要切换到内核来完成这个操作(通过IPI、CAL中断)。它还会干扰应用程序。对于性能评估,最典型的是APERF/MPERF,HWP对应的MSR,PMU的配置界面MSR都是Per-Core。访问Per-MSR的延迟是无法完全避免的,所以要注意采样的频率,防止过采样。Un-CoreMSR这种MSR不属于任何特定的核心,是一种公共资源。最典型的是UNCORE_RATIO_LIMITMSR。Un-CoreMSR可以从任何内核发起读写。只是避免从被评估的核心读取和写入。一般来说,MSR需要加载内核模块msr(/dev/msr),然后使用rdmsr/wrmsr工具进行操作。电源管理Linuxkernel中的电源管理主要由以下两个子系统完成。内核4.10之后,电源管理系统由调度器触发。CpufreqCpufFreq子系统主要管理C0状态下处理器频率的调整。它主要由两部分组成。Cpufreq驱动主要是适配各种硬件的相应调频驱动。Cpufreqgovernor主要针对X86环境的各种频率调整策略。acpi_cpufreq驱动及其对应的7个governors主要有两个选项,参考链接:https://www.kernel.org/doc/html/v4.14/admin-guide/pm/cpufreq.htmlIntel_pstate驱动及其对应这两个调速器(这是系统默认配置)intel_pstate驱动程序是一个特殊的驱动程序,与其他平台相比。intel_pstate驱动主要利用x86的HWP硬件特性来调节频率。提供有限的可定制政策。更好的自动化和更少的开销。Sysfs入口见参考链接:https://www.kernel.org/doc/html/v4.14/admin-guide/pm/cpufreq.htmlCpuIdleCpu空闲子系统主要管理空闲状态的调整处于C1-C7状态的处理器,主要由两部分组成。cpuidledriver主要是适配各种硬件对应的idledriver。cpuidlegovernor主要针对各种idleduration策略。X86环境中有两个主要选择。acpi_idle驱动程序的默认值是菜单。governorIntel_idle驱动默认为menugovernor(这是系统默认配置,ladder需要重新编译内核)sysfs入口(见参考链接)参考链接:https://www.kernel.org/doc/html/latest/admin-guide/pm/cpuidle.html推荐配置方法:在BIOS中,禁用Turbo使用power.py[2]脚本锁定目标内核的频率(或在BIOS中禁用Pstate)设置内核参数intel_idle.max_cstate=1。如果有必要,完全禁止闲置。建议processor.max_cstate=0,idle=poll。注意intel_idle.max_cstate=0只是禁用intel_idle驱动,使用acpi_idle驱动根据工作负载的特点调整UNCORE_RATIO_LIMIT的min/maxratioIPI。TLBShootdown优化进程隔离会减少shootdown,但内核部分无法隔离地址空间。仍然会导致一定数量的tlb击落。禁用VT-X以降低IPI。不要过度采样MSR!因为percore的MSR读写操作是从non-localcores调用的,所以LInux是通过IPI调度到targetcore上执行的另外还有调度算法/NUMAAware/L3CacheQoS(RDT)/SMM-BMC/SmartEngine等模块会对系统性能测试产生噪声干扰,敬请期待后续内容~参考IntelSDMPower.pyhttps://github.com/intel/CommsPowerManagementhttps://www.kernel.org/doc/Documentation/kernel-per-CPU-kthreads.txt