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

时间:2020-12-02 12:14:10   收藏:0   阅读:8
原创 Liam Linux阅码场 3月3日


概要

开发人员在高性能系统的性能调优过程中,经常会碰到各种背景的噪声干扰, 从而使得收集的数据不够精确。本文主要从CPU 以及Linux操作系统的角度来分析各种噪声的来源以及消除方法。最终的目标是搭建基准平台,在特定的cpu上实现”0”干扰。

Cpu 运行中存在的几种背景噪声干扰来源

1. 调度器:
进程调度器对于系统的影响几乎无处不在, Linux 内核一般来说是使用公平的分时调度策略(CFS)。需要特定的参数来调整调度器的行为,从而尽量减少对于测量进程的干扰。

2.中断:

中断是系统必须要响应的事件, 具有较高优先级,可以抢占普通的用户进程。

现代处理器通常为了更高效的利用能源,都会支持一些高级电源管理的功能。这些电源管理的功能如果使用不当也会对于性能评测造成影响。

4. 时间源:

如果要进行性能评测, 就离不开时间戳。所以时间戳的正确采集方法也是至关重要的。

以上这几种因素往往是互相交织的, 比如进程调度器需要时钟中断来驱动, 电源管理子系统需要调度器来驱动 。时间戳的采集和微架构也是息息相关的。下面我们将通过案例逐一分析。

系统配置案例

CPU: Intel 9900KF   P1 Frequency 3.6Ghz   1-core Turbo  5.0Ghz   HT-disabled
RAM: 16GB DDR4-3200
Ubuntu 19.04:  Kernel  5.0.0-38-generic  X86_64
Boot Parameter:
BOOT_IMAGE=/boot/vmlinuz-5.0.0-38-generic
root=UUID=697aea9f-2de2-4b9c-921d-5bd5f963c91f ro ipv6.disable=1
isolcpus=7 nohz_full=7 mce=off tsc=reliable no_watchdog  irqaffinity=0
hpet=disable
quiet splash vt.handoff=1

。nohzfull = cpulist
这个参数还有一个相对弱化的版本nohz。nohz 的含义是在目标cpu的runqueue上没有任何可调度实体时,cpu 进入idle状态, 在此情况下 该cpu停止 时钟tick(缺省是10ms一次)。那么nohzfull就更进一步, 在runqueue上只有一个活动的实体的时候也会停止时钟tick。这样就会大大减少对正在运行的唯一的进程的干扰(不是100%消除)。值得注意的是在非服务器版本的内核中 nohzfull一般是没有打开的,需要重新编译内核。大家可以检查对应的内核编译选项 CONFIGNOHZFULL=y。如果没有打开则会在启动日志中显示警告。同时nohzfull 也就隐含了rcunocbs= cpulist

下图是成功打开选项的日志

技术图片
下图是没有打开编译选项的报错信息

技术图片
在内核的Timer System 中修改选项
技术图片

。Nowatchdog
关闭所有的软/硬件 死锁监测

。hpet=disable, tsc= reliable
这部分主要是针对时间子系统。hpet=disable 主要是避免hpet产生过多的中断干扰系统。tsc= reliable 标记tsc 为可靠的, 减少运行时,时间源校验。在我们的验证过程中, 这个参数对于减少jitter有较大帮助

。mce=off disable machine check to avoid interrupt
Machine checking 是一种高级的RAS 功能,对于产品环境非常重要, 但是对于评测环节我们先禁止掉它。

软硬中断的隔离

下图是 /proc/softirqs
技术图片

下图是htop显示的信息, 可以观察到core 7上的可调度实体已经压缩到了最少
技术图片
MSR

通常来讲, MSR需要通过 加载内核模块 msr(/dev/msr), 之后通过rdmsr/wrmsr 工具来操作。

电源管理

Linuxkernel 中的电源管理主要由以下的两个子系统来完成。在kernel 4.10以后, 电源管理系统是由调度器来触发。

推荐的配置方法:

  1. 在BIOS中,Disable Turbo
  2. 应用power.py[2] 脚本锁定目标core的频率(或者在BIOS 中disable Pstate)
  3. 设定内核参数 intel_idle.max_cstate=1.
    如果需要彻底禁止idle 推荐 processor.max_cstate=0 ,idle=poll
    这里需要注意 intel_idle.max_cstate=0只是disable intel_idle driver 转而使用 acpi_idle driver
    根据workload特点 调整 UNCORE_RATIO_LIMIT 的min/max ratio
    IPI,TLB Shootdown优化

    进程隔离会减少shootdown, 但是内核部分做不到隔离地址空间。仍然会导致一定数量的tlb shootdown。 禁用 VT-X 减少 IPI.
    MSR不要过采样!因为per core 的MSR读写操作从非本地core调用,LInux 是通过IPI 调度到目标core上执行

除此之外, 调度算法/NUMA Aware/L3Cache QoS(RDT)/SMM-BMC/SmartEngine等模块都会对系统性能测试有着噪音干扰, 敬请期待后续内容~

Reference

  1. Intel SDM
  2. Power.py
    https://github.com/intel/CommsPowerManagement
  3. https://www.kernel.org/doc/Documentation/kernel-per-CPU-kthreads.txt
    (END)
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!