虚拟机中的时统卡功能和性能调优

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。 点击这里开始你的技术升级之旅吧

image.png​​

 本文分享至飞腾开发者平台《虚拟机中的时统卡功能和性能调优》

1 介绍

  时统卡作为时统终端之一,可以输出准确的 UTC(Coordinated Universal Time)时间,作为授时功能模块广泛应用于航天、航海等领域中。PCI-Express(PCI-E)由于其点对点的串行设计以及双通道高带宽的传输模式,具有较高数据的传输速率,因此时统卡一般使用 PCI-E 接口接入计算机,称之为 PCI-E 时统卡。而随着虚拟化技术和云计算的飞速发展,越来越多的应用运行于云计算的虚拟机中,目前对于虚拟机中授时一般采用宿主机(host)上插入 PCI-E 时统卡进行授时,再通过网络对虚拟机进行授时的方法,不能直接在多台虚拟机中获得时统卡中断脉冲信号进行精度校准,具有较大的延迟。
  本文旨在提供一种优化方案,解决时统卡在虚拟机中进行精度校准带来的延迟。

2 测试环境

2.1 宿主机环境

  机器类型:FT-2000+/64 服务器

  操作系统:centos7.6

  内核版本:4.19.105

  时统卡:pcie 时统卡

2.2 虚拟机环境

  操作系统:centos7.6

  内核版本:4.19.105

2.3 适配要求

  时统卡为非标设备,需要特殊配置才可以支持,因此需确保三个条件:

  1、首先必须确保在 BIOS 中使能 smmu。

  2、内核需打上飞腾补丁,即内核中使能 smmu。

  3、设备树文件(uboot)或 acpi 描述文件(UEFI)支持。

这3步做完才能在虚拟机中识别时统卡。此外,中断捕获异常是因为,arm平台对于INTx类型的中断没有做虚拟化的硬件支持,所以在arm平台的虚拟机中只能使用msi类型的中断。

3 系统参数调优

3.1 宿主机参数

  1)cpu隔离,isolated_cores表示需要隔离的cpu

isolcpus=${isolated_cores}rcu_nocbs=${isolated_cores}rcu_nocb_pollnohz=onnohz_full=${isolated_cores}nmi_watchdog=0quiet

  2)禁止带宽限制

echo -1 > /proc/sys/kernel/sched_rt_runtime_usecho -1 > /proc/sys/kernel/sched_rt_period_us

  3)关闭隔离cpu的中断均衡,isolated_cpumask位与isolated_cores相对应

vim /etc/sysconfig/irqbalanceIRQBALANCE_BANNED_CPUS=${isolated_cpumask}

3.2 虚拟机参数

  1)虚拟机核绑定并设置调度类型和优先级,配置文件如下:

  <cputune><vcpupin vcpu='0' cpuset='0'/><vcpupin vcpu='1' cpuset='1'/><vcpupin vcpu='2' cpuset='2'/><vcpupin vcpu='3' cpuset='3'/><vcpupin vcpu='4' cpuset='4'/><vcpupin vcpu='5' cpuset='5'/><vcpupin vcpu='6' cpuset='6'/><vcpupin vcpu='7' cpuset='7'/><vcpusched vcpus=’0-7’ scheduler=’fifo’ priority=’99’/></cputune>

  2)添加时统卡设备到虚拟机,address中bdf对应于pcie时统卡设备的总线号、设备号、功能号

  <hostdev mode='subsystem' type='pci' managed='yes'><source><address domain='0x0000' bus='0x09' slot='0x00' function='0x0'/></source></hostdev>

  3)添加虚拟机内核启动参数,可在grub配置文件中添加以下参数:

 nohltquietnosoftlockupnmi_watchdog=0

4 时统卡驱动优化

4.1 驱动架构设计和修改

  1)原驱动程序中断处理程序BUG:对全局共享变量_isr未加锁保护,属内核编程错误。

  原来的程序:

  2)原驱动程序中断处理采用常用的上、下半部机制,且下半部使用netlink接口递送时间事件,不适合高性能、低延时的特点,属于编程架构设计不合理。

  修改后的驱动中断处理程序:去掉中断下半部;重写时间事件分发处理逻辑;使用eventfd通

知机制。

  3)时统卡字符设备的功能接口实现:重新实现其他必要的功能接口。

  原来的驱动程序:

  修改后的驱动程序:

  在ioctl接口中实现evenfd的功能代码。

  4)pci驱动probe里使能msi中断。

  原来的pci probe驱动程序使能intx中断

  修改后的驱动程序使能msi中断:

  5)重写字符设备驱动代码:字符设备只需在module_init注册,无需在pci驱动的probe里注册。
  原来的驱动程序:

  修改后的驱动程序:字符驱动和pci驱动分开注册,代码简洁且更符合工程要求。

  6)映射时统卡的bar空间到用户空间,便于用户空间线程直接轮询中断,进一步优化时间延迟。

static int dti_mmap(struct file *file, struct vm_area_struct *vma){int ret;unsigned long addr;spin_lock(&(dti_p->lock_reg));addr = dti_p->pci_addr;if (addr & (PAGE_SIZE - 1))return -ENOSYS;vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);ret = vm_iomap_memory(vma, addr, PAGE_SIZE);spin_unlock(&(dti_p->lock_reg));return ret;}

  7)实现时统卡设备其他的通用接口

static unsigned int dti_poll(struct file *file, poll_table *wait){int l;poll_wait(file, &dti_wait, wait);spin_lock_irq(&dti_lock);l = dti_has_irq;spin_unlock_irq(&dti_lock);if (l != 0)return POLLIN;return 0;}static ssize_t dti_read(struct file *file, char __user *buf, size_t
count, loff_t *ppos){DECLARE_WAITQUEUE(wait, current);unsigned long data;ssize_t retval;spin_lock_irq(&dti_lock);if (dti_has_irq == 0)return -EIO;spin_unlock_irq(&dti_lock);if (count != sizeof(unsigned int) && count != sizeof(unsigned long))return -EINVAL;add_wait_queue(&dti_wait, \&wait);do {__set_current_state(TASK_INTERRUPTIBLE);spin_lock_irq(&dti_lock);data = dti_has_irq;dti_has_irq = 0;spin_unlock_irq(&dti_lock);if (data != 0)9break;if (file->f_flags & O_NONBLOCK) {retval = -EAGAIN;goto out;}if (signal_pending(current)) {retval = -ERESTARTSYS;goto out;}schedule();} while (1);if (count == sizeof(unsigned int)) {retval = put_user(data, (unsigned int __user *)buf) ?: sizeof(int);} else {retval = put_user(data, (unsigned long __user *)buf) ?: sizeof(long);}if (!retval)retval = count;out:__set_current_state(TASK_RUNNING);remove_wait_queue(&dti_wait, &wait);return retval;}

5 时统卡应用程序优化

5.1 应用程序架构设计和修改

  1)主线程(master)的处理逻辑

  测试程序如果在物理机上运行,主线程通过eventfd/poll接口轮询内核中断事件,可以到达测试目标。

  测试程序如果在虚拟机上运行,主线程则需要直接轮询设备的中断寄存器,才可以达到测试目标。

  下面以虚拟机为例:

  2)从线程(slave)的处理逻辑

6 测试结果

  1)下图表示未进行任何优化的结果。

  2)下图表示最后的优化结果,且运行时间超过48h。

  3)下图表示不同阶段的优化结果趋势图,其中横坐标表示中断频率,纵坐标表示中断丢失lost数。

推荐阅读

  • 飞腾平台Ne10安装使用指南
  • 飞腾平台VSIPL-FT安装使用指南

欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们


版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501055.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GXUOJ-算法-补题:22级《算法设计与分析》第一次课堂练习

2.最大子数组和 问题描述 代码解答 #include<bits/stdc.h> using namespace std; const int N1005; int sum,n,a[N]; int res-1;int result(){for(int i0;i<n;i){if(sum<0) suma[i];else{suma[i];resmax(res,sum);}}return res; } int main(){cin>>n;for(i…

信息学奥赛一本通:1311:【例2.5】求逆序对

1311&#xff1a;【例2.5】求逆序对 时间限制: 1000 ms 内存限制: 65536 KB提交数:74572 通过数: 17809 【题目描述】 给定一个序列a1,a2,…,an&#xff0c;如果存在i<j并且ai>aj&#xff0c;那么我们称之为逆序对&#xff0c;求逆序对的数目。 【输入】 第一…

免登录游客卡密发放系统PHP网站源码

源码介绍&#xff1a; 这是一个简单易用的卡密验证系统&#xff0c;主要功能包括&#xff1a; 卡密管理和验证&#xff0c;多模板支持&#xff0c;响应式设计&#xff0c;验证码保护&#xff0c;防刷机制&#xff0c;简洁的用户界面&#xff0c; 支持自定义模板&#xff0c;移…

关于 PPPOE技术的详细解释

PPPoE&#xff08;以太网点对点协议&#xff09;是一种网络协议&#xff0c;它通过光纤将点对点协议&#xff08;PPP&#xff09;封装以实现宽带接入点。PPPoE主要用于ADSL和光纤等宽带接入技术中&#xff0c;它允许多个用户共享同一个交换机连接&#xff0c;同时为每个用户提供…

C# 服务应用研究

文章目录 创建Windows Service项目选中serviceInstaller1组件&#xff0c;查看属性生成和发布服务安装服务卸载服务重新再安装服务停止服务再次卸载服务调试服务 创建Windows Service项目 选中serviceInstaller1组件&#xff0c;查看属性 生成和发布服务 安装服务 卸载服务 重新…

MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别 在MySQL中&#xff0c;我们经常需要对查询结果进行去重&#xff0c;而DISTINCT和GROUP BY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用&#xff0c;但它们之间还是存在一些差异的。接下来&#xff0c;我们将通过创建测…

三维场景重建3D高斯点渲染复现

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 三维场景重建概述MVSNetNerf3D gaussian-splatting 效果演示3D gaussian-splatting原理高斯分布的数学基础渲染过程优化与加速 3D Gaussian-sp…

小波滤波器处理一维信号-附Matlab源代码

⭕⭕ 目 录 ⭕⭕ 一、引言二、多分辨率分析原理2.1 概念解析2.2 尺度函数和小波函数的关系2.3 滤波器本质2.4 二维正交多分辨率分析 三、一维信号小波滤波器处理实例四、Matlab程序获取与验证 一、引言 Fourier变换无法同时描述和定位信号在时间和频率上的突变部分。小波变换的…

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件

文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗&#xff1f;2.1.1、场景一&#xff1a…

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…

Mac 版本向日葵退出登录账号

找遍整个软件&#xff0c;Mac 版本的向日葵甚至逆天到没有提供退出登录的功能… 随后我发现可以直接删除向日葵的配置文件达到退出登录的效果&#xff0c;具体操作如下&#xff1a; cd /etc # 确认存在 orayconfig.conf 文件 ls orayconfig.conf  # 删除 sudo rm -f oray…

双目视觉:reprojectImageTo3D函数

前言 reprojectImageTo3D 是 OpenCV 中用于从视差图生成三维点云的函数。它的原理是利用视差图和相机的校准参数&#xff0c;通过三角测量法&#xff0c;计算每个像素对应的三维坐标。以下内容根据源码分析所写&#xff0c;觉得可以的话&#xff0c;点赞收藏哈&#xff01;&am…

苍穹外卖04——Redis初入门 在店铺打烊or营业状态管理功能中的使用

Redis入门 redis简介 它以键值对的形式存储数据在内存中,并且以极高的性能和灵活性而著称,通常用于缓存、消息代理以及持久化数据。 - 基于内存存储,读写性能高- 适合存储热点数据(热点商品、资讯、新闻)- 企业应用广泛Windows版下载地址:https://github.com/microsoft…

No.1十六届蓝桥杯备战|第一个C++程序|cin和cout|命名空间

第一个C程序 基础程序 使用DevC5.4.0 写一个C程序 在屏幕上打印hello world #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 运行这个C程序 F9->编译 F10->运行 F11->编译运行 mai…

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言&#xff1a; 该类博客的学习是基于b站黑马视频springbootvue视频学习&#xff01;具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍&#xff08;需求&#xff09;。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…

LoRA微调系列笔记

系列文章目录 第一章&#xff1a;LoRA微调系列笔记 第二章&#xff1a;Llama系列关键知识总结 第三章&#xff1a;LLaVA模型讲解与总结 文章目录 系列文章目录LoRA&#xff1a;Low-Rank Adaptation of Large Language Models目的&#xff1a;依据&#xff1a;优势&#xff1a;…

Python - 游戏:飞机大战;数字华容道

Pygame是一个利用SDL库的写的游戏库&#xff0c;SDL呢&#xff0c;全名Simple DirectMedia Layer&#xff0c;是一位叫做Sam Lantinga的大牛写的 SDL是用C写的&#xff0c;不过它也可以使用C进行开发&#xff0c;当然还有很多其它的语言&#xff0c;Pygame就是Python中使用它的…

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机&#xff1a;指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 &#xff0c;是物理机的软件实现。常用的虚拟机有VMWare&#xff0c;Visual Box&…

GitHub 及 GitHub Desktop 详细使用教程(通俗易懂)

目录 Δ前言 一、Github教程 1.什么是Github&#xff1f; 2.仓库和对仓库的操作&#xff1a; 2.1 Repository&#xff08;仓库&#xff09; 2.2 Fork&#xff08;派生&#xff09; 2.3 Star&#xff08;收藏&#xff09; 2.4 Watch&#xff08;追番&#xff09; 2.5 Issue&am…

OpenLinkSaas使用手册-待办事项和通知中心

在OpenLinkSaas工作台上&#xff0c;你可以查看待办事项和未读通知。 待办事项 目前待办事项支持: 个人待办项目待办:在项目中指派给你的任务/缺陷Git待办:在Git仓库中指标给你的Issue,目前只有在AtomGit和Gitee账号登录时才支持。 通知中心 通知中心支持Git通知和邮件通知两种…