我应该将“旋转”线程“绑定”到某个核心吗?

2024-01-02

我的应用程序包含几个“旋转”的延迟关键线程,即从不阻塞。 这样的线程预计会 100% 占用一个 CPU 核心。然而,现代操作系统似乎经常将线程从一个核心转移到另一个核心。例如,使用以下 Windows 代码:

void Processor::ConnectionThread()
{
    while (work)
    {
        Iterate();
    }
}

我在任务管理器中没有看到“100% 占用”核心,总体系统负载为 36-40%。

但如果我把它改成这样:

void Processor::ConnectionThread()
{
    SetThreadAffinityMask(GetCurrentThread(), 2);
    while (work)
    {
        Iterate();
    }
}

然后我确实看到其中一个 CPU 核心被 100% 占用,整体系统负载也减少到 34-36%。

这是否意味着我应该倾向于SetThreadAffinityMask对于“旋转”线程?如果我改进延迟添加SetThreadAffinityMask在这种情况下?我还应该为“旋转”线程做些什么来改善延迟?

我正在将我的应用程序移植到 Linux,所以如果这很重要的话,这个问题更多是关于 Linux 的。

upd发现这张幻灯片显示将忙等待线程绑定到 CPU 可能会有所帮助:


如果这是代码中最重要的事情,则在大多数情况下,运行锁定到单个核心的线程可以为该线程提供最佳延迟。

原因(R)是

  • 您的代码可能位于您的 iCache 中
  • 分支预测器根据您的代码进行调整
  • 您的数据可能已在 dCache 中准备就绪
  • TLB 指向您的代码和数据。

Unless

  • Your running a SMT sytem (ex. hyperthreaded) in which case the evil twin will "help" you with by causing your code to be washed out, your branch predictors to be tuned to its code and its data will push your out of the dCache, your TLB is impacted by its use.
    • 成本未知,每个缓存未命中数据的成本约为 4 纳秒、约 15 纳秒和约 75 纳秒,这很快就会达到数千纳秒。
    • 它节省了上述每个 R 的原因,但仍然存在。
    • If the 邪恶双胞胎也只是旋转,成本应该低得多。
  • Or your allowing interrupts on your core, in which case you get the same problems and
    • 你的TLB被刷新了
    • 你受到 1000ns-20000ns 的打击上下文切换 http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html,如果驱动程序编程良好,大多数应该处于低端。
  • Or you allow the OS to switch your process out, in which case you have the same problems as the interrupt, just in the hight end of the range.
    • 切换出去还可能导致线程在整个片中暂停,因为它只能在一个(或两个)硬件线程上运行。
  • Or you use any system calls that cause context switches.
    • 根本没有磁盘IO。
    • 其他只有异步 IO。
  • 拥有比核心更多的活动(非暂停)线程会增加出现问题的可能性。

因此,如果您需要低于 100 纳秒的延迟来防止应用程序爆炸,您需要防止或减轻 SMT、中断和任务切换对核心的影响。 完美的解决方案是具有静态调度的实时操作系统 http://en.wikipedia.org/wiki/RTLinux。这与您的目标几乎完美匹配,但如果您主要完成服务器和桌面编程,那么这将是一个新世界。

将线程锁定到单核的缺点是:

  • It will cost some total throughput.
    • 因为如果上下文可以切换,一些线程可能会运行。
    • 但在这种情况下,延迟更为重要。
  • If the thread gets context switched out it will take some time before it can be scheduled potentially one or more time slices, typically 10-16ms, which is unacceptable in this application.
    • 将其锁定到核心及其 SMT 将减轻这个问题,但不能消除它。每个添加的核心都会减轻这个问题。
    • 将其优先级设置得更高会减轻问题,但不能消除问题。
    • 使用 SCHED_FIFO 和最高优先级进行调度将阻止大多数上下文切换,中断仍然会像某些系统调用一样导致临时切换。
    • 如果您有一个多 cpu 设置,您可能能够通过以下方式独占其中一个 CPU 的所有权:cpuset http://man7.org/linux/man-pages/man7/cpuset.7.html。这会阻止其他应用程序使用它。

Using pthread_setschedparam http://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html使用 SCHED_FIFO 和在 SU 中运行的最高优先级并将其锁定到核心及其邪恶双胞胎应该确保所有这些的最佳延迟,只有实时操作系统才能消除所有上下文切换。

其他链接:

讨论中断 https://stackoverflow.com/questions/10235011/how-are-interrupts-handled-on-smp.

你的 Linux 可能会接受你的调用sched_setscheduler http://linux.die.net/man/2/sched_setscheduler, using SCHED_FIFO,但这要求您拥有自己的 PID 而不仅仅是 TID,或者您的线程是协作多任务处理。
这可能并不理想,因为所有线程都只会“自愿”切换,从而消除了内核调度它的灵活性。

进程间通信在100ns http://tradexoft.wordpress.com/2012/10/22/how-to-move-data-between-threads-in-100-nanoseconds/

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

我应该将“旋转”线程“绑定”到某个核心吗? 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List

随机推荐

  • 获取 numpy 矩阵中正方形的坐标

    给定以下 numpy 矩阵 import numpy as np np matrix np array 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 如何在 Excel 或 apache POI 中“格式化为表格”?

    在 Excel 2010 中 可以将一组单元格 格式化为表格 从而轻松排序和过滤 主页 gt 格式化为表格 Can I do the same in Apache POI Alternatively can one accomplish t
  • 如何在 QML Javascript 中创建和使用 C++ 对象

    我的应用程序同时使用 C 和 QML 我在 C 部分定义了几个对象来访问 SQL 等 看起来像 class MyObject public QObject Q OBJECT public MyObject QObject parent 0
  • 如何在 Swift 中创建 NSMutableDictionary?

    我试图创建一个 NSMutableDictionary 来使用 iOS 中的钥匙链 但出现以下错误 找不到接受提供的参数的 init 重载 这是我正在使用的代码 var keychainQuery NSMutableDictionary N
  • 使用键盘快捷键从系统托盘最大化 C# 应用程序

    我是否可以知道是否可以使用键盘快捷键而不是单击它来从系统托盘最大化我的 Windows 窗体应用程序 我目前正在尽量减少使用这段代码 Minimize to Tray with over ride for short cut private
  • 在 Inno Setup 中运行 schtask.exe 之前,使用安装路径创建 XML 任务文件

    我正在尝试使用 XML 文件中的计划任务创建 Inno Setup 计划任务是 我的应用程序需要以用户登录启动 在 Inno 安装脚本中 Run Filename schtasks exe Parameters create XML app
  • Visual Studio Code 未签名的 Powershell 脚本

    我开始使用 Visual Studio Code 进行 Powershell 脚本编写 我想关闭对未签名代码的检查 但不知道如何执行此操作 我在论坛中也没有找到任何东西 您可以通过向 powershell exe 命令添加参数来调整策略 为
  • 如何在 XCode 4 中为代码添加书签?

    我找不到在 XCode 4 的代码中添加书签的方法 我知道 pragma mark的事情 但这不是我要找的 我需要的是可以通过单击鼠标放置和删除并在下一个和上一个之间导航的东西 就像在 VS 中一样 我有什么遗漏的吗 2023 更新 Xco
  • conv1d 层的输入 0 与该层不兼容::预期 min_ndim=3,发现 ndim=2。收到完整形状:(无,30)

    我一直在研究一个使用时间序列数据与天气数据相结合来估计交通流量的项目 我的时间序列使用了 30 个值的窗口 并且使用了 20 个与天气相关的特征 我已经使用函数式 API 来实现此目的 但我不断收到相同的错误 并且我不知道如何解决它 我看过
  • SGE 提交的作业状态不会从“qw”改变

    我在 ubuntu 14 04 上使用 Sun Grid Engine 对要在多核 CPU 上运行的作业进行排队 我已经在我的系统上安装并设置了 SGE 我创建了一个 hello world 目录 其中包含两个 shell 脚本 即 hel
  • Facebook App Like 服务器错误?

    我有一个带有 喜欢 按钮的示例应用程序 以前可以用 但现在不行了 我之前在 jsfiddle net 上测试过这个 它也有效 但是当我将文件上传到服务器后 它出现了一个错误 弹出 赞 按钮 然后出现以下错误 我已经读过这个article h
  • 渲染要在 JSX 中列出的对象数组

    我尝试将对象数组转换为列表 现在 我只想将对象的 类型 属性转换为列表项 但它不起作用 这是我的代码 constructor props super props this travelRawdata type 15 render retur
  • MVC5 Web API 和依赖注入

    尝试在不使用第三方工具的情况下在 Web API 2 上进行一些 DI 所以 从一些例子中我得到了自定义依赖解析器 为什么没有集成的 奇怪 甚至Microsoft Extensions DependencyInjection不提供任何内容
  • 计算一个坐标是否在另一个坐标的范围内

    我正在编写一个需要位置感知的 Windows Phone 7 应用程序 具体来说 我希望当手机进入特定位置的 固定 范围 例如 0 5 英里 时运行一些 c 代码 我拥有内存中物理位置的所有纬度 经度数据 我将使用地理坐标观察者类 http
  • Gitlab CI - 唯一的内部版本号

    Gitlab CI 中是否有唯一的编号可以用作我们在 Jenkins 中使用的构建号 我开始了解变量 CI PIPELINE IID 但该变量的问题是 它会更新所有分支 并且每个分支都不存在这样的变量 我们使用变量解决了同样的问题 CI P
  • CMake:添加构建目录以包含路径

    我正在寻找将构建目录 与我的源目录 git 存储库不同 添加到 gcc 的包含路径的好方法 以便在汇编 我在寻找 include directories CMAKE BINARY DIR 添加构建目录以防源外构建
  • 更改日期选择器 SSRS 中的日期时间格式

    我如何更改报告服务的日期和时间选择器中的格式 当前始终采用 dd MM yyyy 格式 系统日期时间格式相同 我想将日期更改为 MM dd yyyy 格式 在您的设计器中 日期格式由操作系统的文化决定 部署后 日期格式由浏览器的语言决定
  • 使用 OpenCV 和 Tesseract 的摩洛哥车牌识别 (LPR)

    我正在开展一个关于识别摩洛哥车牌的项目 如下图所示 摩洛哥车牌 请问我如何使用 OpenCV 切出车牌并使用 Tesseract 读取中间的数字和阿拉伯字母 我研究过这篇研究论文 https www researchgate net pub
  • 这是什么意思 ?图像/png;base64? [复制]

    这个问题在这里已经有答案了 我不知道我们称之为什么 但我在谷歌404找到了一张图片 url data image png base64 iVBORw0KGgoAAAANSUhEUgAAAKsAAADVCAMAAAAfHvCaAAAAGFBM
  • 我应该将“旋转”线程“绑定”到某个核心吗?

    我的应用程序包含几个 旋转 的延迟关键线程 即从不阻塞 这样的线程预计会 100 占用一个 CPU 核心 然而 现代操作系统似乎经常将线程从一个核心转移到另一个核心 例如 使用以下 Windows 代码 void Processor Con