Linux 系统性能评测基准系统配置及其原理
概要
开发人员在高性能系统的性能调优过程中,经常会碰到各种背景的噪声干扰, 从而使得收集的数据不够精确。本文主要从CPU 以及Linux操作系统的角度来分析各种噪声的来源以及消除方法。最终的目标是搭建基准平台,在特定的cpu上实现”0”干扰。
Cpu 运行中存在的几种背景噪声干扰来源
1. 调度器:
进程调度器对于系统的影响几乎无处不在, Linux 内核一般来说是使用公平的分时调度策略(CFS)。需要特定的参数来调整调度器的行为,从而尽量减少对于测量进程的干扰。
2.中断:
中断是系统必须要响应的事件, 具有较高优先级,可以抢占普通的用户进程。
a. 硬件中断
主要来自外部事件, CPU需要非常及时的响应。比如最常见的IO,时钟,Linux 内核支持的硬件中断数量众多,需要注意亲和性配置。可以取消响应一些比较特殊的中断。b. 软中断 Softirq
软中断是硬件中断处理的衍生子系统。LInux 硬件中断响应只需要处理一些必须立即响应的操作, 而将一些可以延后处理的操作移交给软中断。Linux 中的有10类软中断, 后续我们将会分析。c. Workqueue
Workqueue 也是LInux中常见的一类延迟操作的任务类型
3. 电源管理 :
现代处理器通常为了更高效的利用能源,都会支持一些高级电源管理的功能。这些电源管理的功能如果使用不当也会对于性能评测造成影响。
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=0hpet=disablequiet splash vt.handoff=1
基准系统配置目标:
在baremetal 机器上(vt-x 环境下配置会更加复杂难以精确控制), 將 Core 7 隔离在调度器之外, 最大程度的减少各种因素对于Core 7的干扰。
启动参数详解:
标有红色的这些启动参数都是我们下面要来详细分解的
isolcpus = managed_irq cpuslist
Isolcpus 主要是将目标cpu 从调度器的调度算法中隔离出来。也就是说从用户进程的角度来说,调度器不会主动调度任何进程到目标cpu上来。但是仅仅靠这个参数仍然不能保证所有软/硬中断和一些其他的内核组件不会运行在目标的cpu上。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 功能,对于产品环境非常重要, 但是对于评测环节我们先禁止掉它。
软硬中断的隔离
Disable irqblance service
我们并不希望任何硬件中断被发送到core 7上
所以我们需要disable irqblance service
Take care irq affinity
硬件中断的亲和性也需要注意。
同样是避免任何硬件中断被发送到core 7
修改
/sys/devices/virtual/workqueue/cpumask to 1
效果对比截图
下图是/proc/interrupts
下图是 /proc/softirqs
下图是htop显示的信息, 可以观察到core 7上的可调度实体已经压缩到了最少
MSR
MSR(ModelSpecific Register) 是配置处理器和获取处理器状态信息的关键接口。 MSR 主要分为两类。
Per-Core MSR
这类的MSR 的读写指令都必须本地的core执行,所以要尽量避免从其它的core上来读写。例如 从core 7 上读写Core 3 。这样LInux kernel 还需要调度这个读写操作到目标core3 上来 会带来不必要的延迟。同时 如果在用户层(ring3)中试图读写msr 也需要切换到kernel 来完成这个操作(通过IPI,CAL 中断)。也会对应用有干扰. 对于性能评测来说最典型的就是APERF/MPERF, 以及HWP对应的MSR, 以及PMU的配置接口 MSR 都是Per-Core。访问Per-MSR的延迟 无法完全避免,所以要注意采样的频率,防止过度采样。
Un-Core MSR
这类MSR 并不属于任何具体的core,是公共资源。最典型的就是UNCORE_RATIO_LIMIT MSR。Un-Core MSR可以从任一core发起读写。只要避免从正在评测的core发起读写即可
通常来讲, MSR需要通过 加载内核模块 msr(/dev/msr), 之后通过rdmsr/wrmsr 工具来操作。
电源管理
Linuxkernel 中的电源管理主要由以下的两个子系统来完成。在kernel 4.10以后, 电源管理系统是由调度器来触发。
Cpufreq
Cpuf Freq 子系统主要管理在C0状态下 处理器频率的调整,主要由两部分组成
Cpufreq driver
主要是针对各种不同硬件适配的对应的调频驱动程序
Cpufreq governor
主要是各种不同的调频策略
X86环境下主要有两种选择
acpi_cpufreq driver 以及其对应的7种governor
见参考链接:
https://www.kernel.org/doc/html/v4.14/admin-guide/pm/cpufreq.html
Intel_pstate driver 及其对应的2种governor
(这是系统缺省的配置)
intel_pstate driver 是比较特别的驱动,相比于其它平台。intel_pstate driver 主要是利用x86 的HWP 硬件特性来调整频率。提供了有限的可定制策略。自动化程度更好,overhead更少。
Sysfs entries
见参考链接:
https://www.kernel.org/doc/html/v4.14/admin-guide/pm/cpufreq.html
CpuIdle
Cpu idle 子系统主要管理在C1-C7状态下 处理器idle状态调整, 主要由两部分组成
Cpu idle driver
主要是针对各种不同硬件适配的对应的idle驱动程序
Cpu idle governor
主要是各种不同的idle 时长策略
X86环境下主要有两种选择
acpi_idle driver
缺省是menu governor
Intel_idle driver
缺省是menu governor(这是系统缺省的配置, ladder 需要重新编译内核)
Sysfs entries(见参考链接)
参考链接:
https://www.kernel.org/doc/html/latest/admin-guide/pm/cpuidle.html
推荐的配置方法:
在BIOS中,Disable Turbo
应用power.py[2] 脚本锁定目标core的频率(或者在BIOS 中disable Pstate)
设定内核参数 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
Intel SDM
Power.py
https://github.com/intel/CommsPowerManagement
https://www.kernel.org/doc/Documentation/kernel-per-CPU-kthreads.txt
(END)
Linux阅码场原创精华文章汇总
更多精彩,尽在"Linux阅码场",扫描下方二维码关注
点一点右下角”在看”,为阅码场打Call~
Linux 系统性能评测基准系统配置及其原理相关推荐
- 《大数据》第1期“研究”——大数据管理系统评测基准的挑战与研究进展(下)...
4 BSMA:面向社交媒体数据分析型查询的基准评测 4.1 BSMA框架 BSMA是一个社交媒体数据分析型查询评测基准[8,9],它包含了社交媒体数据的形式化描述规范和一个真实的社交媒体数据集,定义了 ...
- AI开源评测基准AI-Rank,为开源建立标准
当前,数字经济已经成为经济发展的活力引擎和促进经济结构转型升级的重要动能,深刻改变着人类的生产生活方式.12月11日,2020中关村大数据日暨数字经济融合创新发展论坛在北京举行.本届中关村大数据日以& ...
- 中文语言能力评测基准「智源指数」问世:覆盖17种主流任务,19个代表性数据集,更全面、更均衡...
来源:AI科技评论 作者:琰琰 编辑:青暮 人工智能大模型时代,评测基准成为大模型发展的风向标.从扁平到全面系统,从简化到多重维度,智源指数CUGE旨在尝试为大模型评测设计一张全面评估综合能力的新考卷 ...
- Node_exporter+Prometheus+Grafana 快速实现Linux系统性能数据提取、存储和可视化展示
Node_exporter+Prometheus+Grafana 快速实现Linux系统性能数据提取.存储和可视化展示 1. 前言 2. Node_exporter 2.1 安装 node_expor ...
- 20个命令行工具监控 Linux 系统性能(转载)
1. top - Linux 系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具.Top 命令可以 ...
- linux下普通用户更改密码原理(S权限)、SetUID
linux下普通用户更改密码原理(S权限) 首先,我们来看 /etc/passwd 和 /etc/shadow 文件的权限: 可以看到passwd文件,所有者有读写权限,其他用户只能读 而sha ...
- 大规模中文多模态评测基准MUGE发布
简介:MUGE全称是Multimodal Understanding and Generation Evaluation Benchmark,是由达摩院智能计算实验室认知智能团队推出了大规模中文多模态 ...
- 【性能测试】如何用一条命令完全掌握linux系统性能监控(top高阶用法)
目 录 一 引 言 二 top命令高阶用法 场景1:采样3次,采样间隔为10s: 场景2:采样2h,采样间隔为10s,性能数据保存到test.csv文件中: 一 引 言 熟悉CentOS linux ...
- loadrunner监控linux性能指标,使用LoadRunner监控Linux系统性能.doc
使用LoadRunner监控Linux系统性能 性能监控案例 ■秘密 □机密 □绝密 PAGE Linux系统性能监控案例 (仅供内部使用) 版 本 号: V0.1 保 密 等 级: ■秘密 □机密 ...
最新文章
- BESR备份还原SERVER 2003域控制器
- mysql only_full_group_by报错的问题(转)
- zabbix 安装使用
- Duilib教程-自动布局2
- 如何修改textarea中placeholder的字体
- 阿里为什么推崇java_为什么阿里巴巴 Java 开发手册推荐使用 LongAdder,而不是 volatile?...
- Ubuntu硬盘全盘备份tar和clonezilla两种方案
- Android从启动到程序运行整个过程的整理
- Express4.x API (一):application (译)
- 使用SecretScanner发现容器镜像和文件系统中的敏感数据
- 四十三 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理...
- 通用双向循环链表学习
- 《昭君出塞》首映礼纪实——《心周刊》报道
- RGB/YUV/YIQ 颜色空间
- 色拉英语第3集第1幕: you flatter me
- python爬虫登录下载_Python爬虫实战入门四:使用Cookie模拟登录——获取电子书下载链接...
- vue-lazyload图片懒加载的简单使用
- markDown简单使用说明
- 蓝牙耳机选什么好?5款主打高性价比的蓝牙耳机推荐
- 68000多只海洋动物、占地18.3万平米,这才是全球最大海洋水族馆该有的气势!...
热门文章
- boost设计TCP服务器中的strand与心跳机制实现
- transform的translate属性
- 突发!Soul上市中止,因不正当竞争行为成被告,遭索赔410万美元
- ZBrush教程_次时代作品“行尸矿工”制作教程
- 问题 C: 等腰梯形
- python控制CAD画图
- 拳王虚拟项目公社:在闲鱼卖东西是怎么提高曝光率?提高曝光率的技巧
- $().click()和$().on('click','要选择的元素',function(){})的区别
- 让马云说说,我们为什么留不住员工
- C++类与对象基本语法(1)