虚拟机上奇怪的程序延迟行为

2024-02-29

我编写了一个程序来读取 256KB 数组以获得 1 毫秒的延迟。该程序非常简单并附带。 然而,当我在Xen上的VM上运行它时,我发现延迟不稳定。它具有以下模式: 时间单位是ms。

    #totalCycle CyclePerLine  totalms
    22583885 5513 6.452539
    3474342 848 0.992669
    3208486 783 0.916710
    25848572 6310 7.385306
    3225768 787 0.921648
    3210487 783 0.917282
    25974700 6341 7.421343
    3244891 792 0.927112
    3276027 799 0.936008
    25641513 6260 7.326147
    3531084 862 1.008881
    3233687 789 0.923911
    22397733 5468 6.399352
    3523403 860 1.006687
    3586178 875 1.024622
    26094384 6370 7.455538
    3540329 864 1.011523
    3812086 930 1.089167
    25907966 6325 7.402276

我认为某个流程正在做某事,就像一个事件驱动的流程。有人遇到过这种情况吗?或者任何人都可以指出可以实现这一点的潜在流程/服务?

下面是我的程序。我运行了1000次。每次都得到上面的一行结果。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <ctime>

using namespace std;

#if defined(__i386__)
static __inline__ unsigned long long rdtsc(void)
{
    unsigned long long int x;
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
    return x;
}
#elif defined(__x86_64__)
static __inline__ unsigned long long rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
#endif

#define CACHE_LINE_SIZE 64

#define WSS 24567 /* 24 Mb */
#define NUM_VARS WSS * 1024 / sizeof(long)

#define KHZ 3500000

// ./a.out memsize(in KB)
int main(int argc, char** argv)
{
    unsigned long wcet = atol(argv[1]);
    unsigned long mem_size_KB = 256;  // mem size in KB
    unsigned long mem_size_B  = mem_size_KB * 1024; // mem size in Byte
    unsigned long count       = mem_size_B / sizeof(long);
    unsigned long row         = mem_size_B / CACHE_LINE_SIZE;
    int           col         = CACHE_LINE_SIZE / sizeof(long);

    unsigned long long start, finish, dur1;
    unsigned long temp;

    long *buffer;
    buffer = new long[count];

    // init array
    for (unsigned long i = 0; i < count; ++i)
        buffer[i] = i;

    for (unsigned long i = row-1; i >0; --i) {
        temp = rand()%i;
        swap(buffer[i*col], buffer[temp*col]);
    }

    // warm the cache again
    temp = buffer[0];
    for (unsigned long i = 0; i < row-1; ++i) {
        temp = buffer[temp];
    }

    // First read, should be cache hit
    temp = buffer[0];
    start = rdtsc();
    int sum = 0;
    for(int wcet_i = 0; wcet_i < wcet; wcet_i++)
    {
        for(int j=0; j<21; j++)
        {
            for (unsigned long i = 0; i < row-1; ++i) {
                if (i%2 == 0) sum += buffer[temp];
                else sum -= buffer[temp];
                temp = buffer[temp];
            }
        }
    }
    finish = rdtsc();
    dur1 = finish-start;

    // Res
    printf("%lld %lld %.6f\n", dur1, dur1/row, dur1*1.0/KHZ);
    delete[] buffer;
    return 0;
}

RDTSC指令在虚拟机中的使用比较复杂。管理程序 (Xen) 很可能通过捕获 RDTSC 指令来模拟它。最快的运行显示大约 800 个周期/缓存行,这非常非常慢...唯一的解释是 RDTSC 导致由虚拟机管理程序处理的陷阱,该开销是性能瓶颈。我不确定您定期看到的更长的时间,但考虑到 RDTSC 被困住,所有计时赌注都取消了。

你可以在这里读更多关于它的内容

http://xenbits.xen.org/docs/4.2-testing/misc/tscmode.txt http://xenbits.xen.org/docs/4.2-testing/misc/tscmode.txt

rdtsc 系列中的指令是非特权指令,但是 特权软件可能会设置一个 cpuid 位来导致所有 rdtsc 系列 指示陷阱。该陷阱可以被 Xen 检测到,Xen 可以 然后透明地“模拟” rdtsc 指令的结果并 将控制权返回给 rdtsc 指令后面的代码

顺便说一句,那篇文章是错误的,因为虚拟机管理程序没有设置cpuid bit要使 RDTSC 陷入陷阱,它是控制寄存器 4 (CR4.TSD) 中的位 #2:

http://en.wikipedia.org/wiki/Control_register#CR4 http://en.wikipedia.org/wiki/Control_register#CR4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟机上奇怪的程序延迟行为 的相关文章

  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • MS SQL 中文排序规则

    我在我们的亚洲市场生产数据库中发现了奇怪的行为 在中文字母的情况下 条件并不像人们所期望的那样工作 create table Temp TextContent nvarchar 20 ChineseType varchar 10 inser
  • 相同的命令在不同的设备上输出不同的值

    我有两个树莓派 3 当我做 tfenv pi raspberrypi pip install opencv python 在第一个 Raspberry Pi 上 我得到 Collecting opencv python Could not
  • 增加空指针的定义是否明确?

    在进行指针算术时 有很多未定义 未指定行为的示例 指针必须指向同一数组内部 或超出末尾的一个 或同一对象内部 限制何时可以基于上述内容进行比较 操作 ETC 以下操作定义明确吗 int p 0 p 5 2 6 1 通过添加来修改操作数对象的
  • 切换到 VS 2010 后,编译的程序运行速度变慢了

    我们的关键公司应用程序 C 处理高分辨率图像 我们付出了巨大的努力来优化它 它在约 2 5 秒内执行超过 250 万次操作 我们已经使用 VS 2005 多年 上周 我们将所有内容都转移到了 VS 2010 完全相同的项目代码 现在 当我构
  • 如何在 WP7 中访问播客?

    如何访问手机上的播客列表并在 WP7 中播放它们 Thanks 目前无法查询播客 流派不会告诉您正在使用的内容是否是播客 MediaLibrary 将仅访问常规歌曲 而不是其他内容 希望 Mango 更新能够为媒体访问 API 带来一些扩展
  • 匹配第一个和最后一个字符的正则表达式

    我正在尝试使用正则表达式来检查字符串中的第一个和最后一个字符是否是 a z 之间的字母字符 我知道这与第一个字符匹配 a z i 但是我如何检查最后一个字符呢 This a z a z i 不起作用 我怀疑这两个子句之间应该有一些东西 但我
  • MIPS汇编将整数转换为二进制并读取1的数量?

    我正在开发一个程序 它从用户那里获取一个整数 然后输出它的二进制等价物中有多少个 1 所以首先我认为我需要将其转换为二进制 然后使用循环检查所有 32 位以找出有多少个 1 我已经浏览了几个小时并尝试不同的方法来首先将整数转换为二进制 最好
  • 如何使用 React DatePicker 选择时间

    我在用着反应日期选择器 https github com Hacker0x01 react datepicker我还需要包括选择日期的时间 我没有从文档中找到任何如何实现这一点的示例 DatePicker 是否提供了任何开箱即用的功能 还是
  • 从批处理文件执行存储过程

    如何从批处理文件执行 SQL Server 中的存储过程 使用 Windows 身份验证 如果您使用的是 Sql Server 2005 则可以使用sqlcmd http msdn microsoft com en us library m
  • SwiftUI 简化许多文本字段的 .onChange 修饰符

    我正在寻找一种方法来简化 重构 SwiftUI 中添加 onChange of 具有许多文本字段的视图 如果解决方案简洁 我也会移动修饰符 更接近适当的字段 而不是位于 ScrollView 的末尾 在这个 在这种情况下 所有 onChan
  • NuxtJS 上的 ESLint 和 Prettier 冲突

    当我创建一个新的 Nuxt js 项目时 我遇到了 ESLint 和 Prettier 的一个非常令人筋疲力尽的问题 如果我节省这个 vue文件中 Prettier 尝试修复它 但 ESLint 阻止它这样做 所以 我无法删除这方面的错误
  • 拖动进入时突出显示按钮

    刚刚开始探索iOS SDK 我有一些按钮 需要突出显示它们 触摸一次然后拖动 据我了解 当您单击按钮然后拖动到外部然后再次拖动到内部时 会触发 TouchDragEnter 事件 当您单击按钮外部然后拖动到内部时 是否会触发任何事件 亚历山
  • 数据注释、IDataErrorInfo 和 MVVM

    我正在尝试找到验证 MVVM 中数据的最佳方法 目前 我正在尝试使用 MVVM 模式将 IDataErrorInfo 与数据注释结合使用 然而 似乎没有任何作用 我不确定我可能做错了什么 我有这样的东西 Model public class
  • 使用 numpy/scipy 的快速 B 样条算法

    我需要在 python 中计算 bspline 曲线 我研究了 scipy interpolate splprep 和其他一些 scipy 模块 但找不到任何可以轻松满足我需要的东西 所以我在下面编写了自己的模块 代码运行良好 但速度很慢
  • 如何保护 web.config 中存储的密码的安全?

    我在 web config 文件中添加了以下设置 以启动对外部系统的 API 调用 因此 我存储 API URL 用户名 密码 如下所示
  • 包含 MySQL 查询结果中未找到的值

    我有以下 MySQL 表 tbl pet owners id name pet city date adopted 1 jane cat Boston 2017 07 11 2 jane dog Boston 2017 07 11 3 ja
  • cygwin中如何杀死进程?

    您好 我有以下无法杀死的进程 我在 windows xp 32 位中运行 cygwin 我尝试发出以下命令 bin kill f 4760 bin kill 9 5000 kill 9 5000 kill 5000 当我写 bin kill
  • 如何在 .net 中获取可用的 wifi AP 及其信号强度?

    有没有办法使用 NET 访问所有 WiFi 接入点及其各自的 RSSI 值 如果我可以在不使用非托管代码的情况下完成它 那就太好了 或者如果它可以在 Mono 和 NET 中工作 那就更好了 如果可能的话 我将不胜感激代码示例 谢谢 以下是
  • 使用隐藏代码的 nbextensions 时查找并转到文本

    这是来自的重复this https stackoverflow com questions 530245473年前的问题 目前还没有令人满意的解决方案 问题是在使用 nbextensions 时 在 Jupyter Notebook 的所有
  • 虚拟机上奇怪的程序延迟行为

    我编写了一个程序来读取 256KB 数组以获得 1 毫秒的延迟 该程序非常简单并附带 然而 当我在Xen上的VM上运行它时 我发现延迟不稳定 它具有以下模式 时间单位是ms totalCycle CyclePerLine totalms 2