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

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

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_poll

nohz=on

nohz_full=${isolated_cores}

nmi_watchdog=0

quiet

  2)禁止带宽限制

echo -1 > /proc/sys/kernel/sched_rt_runtime_us

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

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

vim /etc/sysconfig/irqbalance

IRQBALANCE_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配置文件中添加以下参数:

 nohlt

   quiet

   nosoftlockup

   nmi_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和其他飞腾商标均为飞腾信息技术有限公司的商标。

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

注意

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创新驱动智能运维,护航军工新时代

随着数字化转型的加速推进&#xff0c;智能运维技术在各行业的重要性愈加凸显。军工行业作为国家安全和技术创新的核心&#xff0c;对运维解决方案的安全性、可靠性及自主可控性提出了严格要求。美信时代科技有限公司以自主创新为基础&#xff0c;推出监控易一体化智能运维管理…

《计算机网络》(B)复习

目录 一、问答题测试 1.论述具有五层协议的网络体系结构的要点&#xff0c;包括各层的主要功能。 2.物理层的接口有哪几个方面的特性&#xff1f;各包含些什么内容&#xff1f; 3.小明想要访问淘宝&#xff0c;当他打开浏览器输入www.taobao.com浏览淘宝的 过程是什么&#…

如何配置【Docker镜像】加速器+【Docker镜像】的使用

一、配置Docker镜像加速器 1. 安装/升级容器引擎客户端​ 推荐安装1.11.2以上版本的容器引擎客户端 2. 配置镜像加速器​ 针对容器引擎客户端版本大于1.11.2的用户 以root用户登录容器引擎所在的虚拟机 修改 "/etc/docker/daemon.json" 文件&#xff08;如果没有…

logback之自定义过滤器

logback有两种过滤器&#xff0c;一种是context中的过滤器叫TurboFilter&#xff0c;是一个全局的过滤器&#xff0c;会影响所有的日志记录。另一种是Appender中的过滤器&#xff0c;只对所在的append有效。两者大同小异&#xff0c;这里我们以Appender的过滤器为例。 &#x…

springboot+vue实现SSE服务器发送事件

思路 一个基于订阅发布机制的SSE事件。客户端可以请求订阅api&#xff08;携带客户端id&#xff09;&#xff0c;与服务器建立SSE链接&#xff1b;后续服务器需要推送消息到客户端时&#xff0c;再根据客户端id从已建立链接的会话中找到目标客户端&#xff0c;将消息推送出去。…

使用XGBoost算法进行机器学习任务:从理论到实践

目录 使用XGBoost算法进行机器学习任务&#xff1a;从理论到实践引言1. XGBoost算法简介2. XGBoost的数学原理3. 环境准备与数据集介绍3.1 环境准备3.2 数据集介绍 4. XGBoost的PyTorch实现4.1 数据预处理4.2 XGBoost模型定义4.3 模型训练与评估 5. 结果分析与可视化5.1 绘制损…

NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)

Accepted by NeurIPS 2024 文章链接&#xff1a;https://arxiv.org/pdf/2412.19806 项目链接&#xff1a;https://vitron-llm.github.io/ Github链接&#xff1a;https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型&#xff08;MLLM&…

P8打卡——YOLOv5-C3模块实现天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, dat…

OpenCV-Python实战(16)——单/多模板匹配

一、模板匹配函数 cv2.matchTemplate() result cv2.matchTemplate(image*,templ*,method*,mask*) result&#xff1a;函数返回值&#xff0c;比较结果的数组。 image&#xff1a;原始图像。 templ&#xff1a;模板图像。templ.shape<image.shape。 method&#xff1a;…

分布式 L2 网关下的 OVS 未知单播泛洪

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 1 问题描述 2 基础设施和环境信息 3 故障排除 3.1 确认&#xff1a;单播泛洪 3.2 确认&#xff1a;所有泛洪流量都以 L2 GW 为目标 3.3 验证&#xff1a;容器 ARP 处于活动状态时&…

天猫推荐数据集实践

参考自 https://github.com/xufengtt/recom_teach_code&#xff0c;学习记录。 环境配置&#xff08;maxcomputedataworks&#xff09; 下载天猫推荐数据集&#xff1b;开启 aliyun 的 maxcompute&#xff0c;dataworks&#xff0c;pai&#xff1b;使用 odpscmd 上传本地数据…

库的概念:动态库与静态库

在软件开发中&#xff0c;库是代码复用的核心工具&#xff0c;它帮助开发者避免重复造轮子&#xff0c;提升开发效率。库可以分为动态库和静态库&#xff0c;这两者在程序开发中的使用方式、链接过程和性能上存在显著区别。本文将详细讲解动态库与静态库的定义、区别、链接过程…

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之&#xff1a;如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中&#xff0c;我们介绍了Flink如何根据StreamGraph生成JobGraph的流程&#xff0c;并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;91.4&#xff05;准确识别率&#xff0c;18912张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载&#xff1a; &#xff59;&#xff4f;&#xff4c;&#xff4f; &#xff56;&#…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

linux中执行命令

1.1 命令格式 命令格式&#xff1a; 主命令 选项 参数&#xff08;操作对象&#xff09; 命令分为两类&#xff1a; 内置命令&#xff08; builtin &#xff09;&#xff1a;由 shell 程序自带的命令 外部命令&#xff1a;有独立的可执行程序文件&#xff0c;文件名即命令…

Elasticsearch:当混合搜索真正发挥作用时

作者&#xff1a;来自 Elastic Gustavo Llermaly 展示混合搜索何时优于单独的词汇或语义搜索。 在本文中&#xff0c;我们将通过示例探讨混合搜索&#xff0c;并展示它与单独使用词汇或语义搜索技术相比的真正优势。 什么是混合搜索&#xff1f; 混合搜索是一种结合了不同搜索…

Python pyside6 设置的一个《广告图片生成器》

一、图&#xff1a; 二、说明书&#xff1a; 广告图片生成器使用说明 软件功能 这是一个用于生成广告图片的工具&#xff0c;可以快速制作包含产品图片和文字的广告图片。 主要特点 自定义广告尺寸&#xff08;默认620420像素&#xff09; 智能去除产品图片背景 自动排版&…

Spark基本介绍

一&#xff0c;Spark是什么 1.定义&#xff1a;Aache Spark是用于大规模数据处理的统一分析引擎。 二&#xff0c;Spark的发展 三&#xff0c;Spark的特点 高效性 计算速度快 提供了一个全新的数据结构RDD&#xff08;弹性分布式数据集&#xff09;。整个计算操作&#xff0c;…

Elasticsearch操作笔记版

文章目录 1.ES索引库操作(CRUD)1.mapping常见属性(前提)2.创建索引库3.查询&#xff0c;删除索引库4.修改索引库 2.ES文档操作(CRUD)1.新增文档2.查询、删除文档查询返回的数据解读&#xff1a; 3.修改文档 3.RestClient操作(索引库/文档)(CRUD)1.什么是RestClient2.需要考虑前…