Linux 中 mmap 物理内存的用户空间 memcpy 性能较差

2023-12-25

在我的计算机上安装的 192GB RAM 中,我有 188GB RAM 以上 4GB(硬件地址 0x100000000)由 Linux 内核在启动时保留(mem=4G memmap=188G$4G)。数据采集​​内核模块使用 DMA 将数据累积到用作环形缓冲区的大区域中。用户空间应用程序将此环形缓冲区映射到用户空间,然后在准备好后从当前位置的环形缓冲区复制块进行处理。

使用 memcpy 从 mmap 区域复制这些 16MB 块的效果并不符合我的预期。看来性能取决于启动时保留的内存大小(稍后映射到用户空间)。http://www.wurmsdobler.org/files/resmem.zip http://www.wurmsdobler.org/files/resmem.zip包含实现 mmap 文件操作的内核模块的源代码:

module_param(resmem_hwaddr, ulong, S_IRUSR);
module_param(resmem_length, ulong, S_IRUSR);
//...
static int resmem_mmap(struct file *filp, struct vm_area_struct *vma) {
remap_pfn_range(vma, vma->vm_start,
    resmem_hwaddr >> PAGE_SHIFT,
    resmem_length, vma->vm_page_prot);
return 0;
}

和一个测试应用程序,其本质上是(删除检查):

#define BLOCKSIZE ((size_t)16*1024*1024)
int resMemFd = ::open(RESMEM_DEV, O_RDWR | O_SYNC);
unsigned long resMemLength = 0;
::ioctl(resMemFd, RESMEM_IOC_LENGTH, &resMemLength);
void* resMemBase = ::mmap(0, resMemLength, PROT_READ | PROT_WRITE, MAP_SHARED, resMemFd, 4096);
char* source = ((char*)resMemBase) + RESMEM_HEADER_SIZE;    
char* destination = new char[BLOCKSIZE];
struct timeval start, end;
gettimeofday(&start, NULL);
memcpy(destination, source, BLOCKSIZE);
gettimeofday(&end, NULL);
float time = (end.tv_sec - start.tv_sec)*1000.0f + (end.tv_usec - start.tv_usec)/1000.0f;
    std::cout << "memcpy from mmap'ed to malloc'ed: " << time << "ms (" << BLOCKSIZE/1000.0f/time << "MB/s)" << std::endl;

我在 Ubuntu 10.04.4、Linux 2.6.32、SuperMicro 1026GT-TF-FM109 上对不同大小的保留 RAM (resmem_length) 的 16MB 数据块进行了 memcpy 测试:

|      |         1GB           |          4GB           |         16GB           |        64GB            |        128GB            |         188GB
|run 1 | 9.274ms (1809.06MB/s) | 11.503ms (1458.51MB/s) | 11.333ms (1480.39MB/s) |  9.326ms (1798.97MB/s) | 213.892ms (  78.43MB/s) | 206.476ms (  81.25MB/s)
|run 2 | 4.255ms (3942.94MB/s) |  4.249ms (3948.51MB/s) |  4.257ms (3941.09MB/s) |  4.298ms (3903.49MB/s) | 208.269ms (  80.55MB/s) | 200.627ms (  83.62MB/s)

我的观察是:

  1. 从第一次到第二次运行,memcpy 从 mmap'ed 到 malloc'ed 似乎受益于内容可能已经缓存在某个地方。

  2. 从 >64GB 开始,性能会显着下降,这在使用 memcpy 时都可以注意到。

我想了解为什么会这样。也许 Linux 内核开发人员小组中的某个人认为:64GB 对于任何人来说都应该足够了(这是否引起了注意?)

亲切的问候, 彼得


根据 SuperMicro 的反馈,性能下降是由于 NUMA(非均匀内存访问)造成的。 SuperMicro 1026GT-TF-FM109 使用 X8DTG-DF 主板,其核心为一个 Intel 5520 Tylersburg 芯片组,连接到两个 Intel Xeon E5620 CPU,每个 CPU 都连接有 96GB RAM。

如果我将应用程序锁定到 CPU0,我可以观察到不同的 memcpy 速度,具体取决于保留的内存区域以及随后进行 mmap 的内存区域。如果保留的内存区域不在 CPU 之外,则 mmap 需要花费一段时间才能完成其工作,并且任何后续进出“远程”区域的 memcpy 都会消耗更多时间(数据块大小 = 16MB):

resmem=64G$4G   (inside CPU0 realm):   3949MB/s  
resmem=64G$96G  (outside CPU0 realm):    82MB/s  
resmem=64G$128G (outside CPU0 realm):  3948MB/s
resmem=92G$4G   (inside CPU0 realm):   3966MB/s            
resmem=92G$100G (outside CPU0 realm):    57MB/s   

这几乎是有道理的。只有第三种情况,64G$128,这意味着最高的64GB也有不错的成绩。这在某种程度上与理论相矛盾。

问候, 彼得

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

Linux 中 mmap 物理内存的用户空间 memcpy 性能较差 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 我们可以拥有一台只用寄存器作为内存的计算机吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 寄存器是计算机中最快的存储器 那么如果我们想构建一台只有寄存器甚至没有缓存的计算机 可能吗 我什至考虑用寄存器代替磁盘 尽管它们本质上是易
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 如何提高包含大量小图像的 UCollectionView 的性能?

    在我的 iOS 应用程序中我有UICollectionView显示大约 1200 个小 35x35 点 图像 图像存储在应用程序包中 我正确地重用了UICollectionViewCell但仍然存在性能问题 具体取决于我处理图像加载的方式
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使

随机推荐

  • 如何将 TServerSocket 绑定到特定 IP 地址

    有谁知道有什么方法可以绑定 Delphi TServerSocket 组件以仅接受特定本地地址上的请求吗 服务器有多个IP 但要求服务器应用程序在运行时仅接受一个I P上的请求 TServerSocket不会直接公开您所要求的功能 但是可以
  • JMeter 3.2 版本 - SOAP 请求

    如何在 JMeter 3 2 版中发出测试 SOAP 请求 在旧版本中 我有 Soap XML RPC 数据采样器 而在 3 2 版本中 我没有看到此选项 请帮忙 Use HTTP请求 http jmeter apache org user
  • 如何管理非英语客户? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 管理涉及非英语客户的软件项目时 最佳实践是什么 哪些沟通问题是相关的 您会维护两种语言的文档 特别是定期更新规范 吗 此类项目的基本风险是沟通不畅 因
  • Android DatePickerDialog:设置选择的最小和最大日期

    我知道对此有很多问题 但没有一个解决方案对我有用 所以这个问题 我想限制用户选择今天之前的日期 但我无法这样做 public class DatePickerDialogFragment extends DialogFragment pri
  • 多个安装:单个 pom.xml 中的安装文件

    在回答之前请至少阅读以下内容 这是临时措施 不 我们不想设置本地存储库管理器并手动运行脚本 我们有一个遗留项目 有一些依赖项 我们有一个包含源代码和 javadoc 的本地副本 并且已被证明在生产中运行良好 但在 Central 中无法以相
  • 如何保存以 Data-URI 编码的图像?

    我正在尝试找到一种技巧来保存在 Data URI 中编码的图片 如下所示 data image png base64 iVBORw0KGgoAAAANSUhEUgAAA1MAAAE7CAYAAAA4gNuCAAAgAElEQ i fPjJw
  • IE9 支持 Windows 7 上的触摸事件吗?

    我正在尝试在基于 Windows 7 的平板电脑上使用触摸事件 即触摸移动 在画布元素上绘图 我想知道 IE9 DOM 是否支持触摸事件 如果有人也能向我指出一些示例代码 那就太好了 IE9中没有触摸事件 我想很多人在 IE9 预览阶段就向
  • 在 dplyr 中分组并计算百分比

    我在 r 中有以下数据框 Service Container Pick Day ABC 0 ABC 1 ABC 1 ABC 2 ABC NA ABC 0 ABC 1 DEF NA DEF 0 DEF 1 DEF 1 DEF 1 DEF 2
  • Renderpartial 位于共享文件夹的子文件夹中。如何让MVC找到它?

    简短但简单 我有一个 edit ascx 位于共享文件夹中 我这样称呼它 如果我把它放在子文件夹中 它找不到该文件 如何解决这个问题 至于如何排列视图 您可以根据需要将视图放入子文件夹中并创建自己的视图结构 所有视图始终可以使用 语法通过其
  • 朴素贝叶斯分类的简单解释[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我发现很难理解朴素贝叶斯的过程 我想知道是否有人可以用英语用简单的一步一步过程来解释它 我知道它需要将发生的次数作为概率进行比较 但我不知
  • 为什么 Android 的进度对话框中没有取消按钮?

    我正面临着类似的令人头疼的时刻这个人 http groups google com group android developers browse thread thread cdae98b7832b4754 567ffa7107a73f7
  • ActionView::缺少模板

    将 mysite 部署到 VPS 后 我遇到此运行时错误 请注意 在我的本地计算机中 一切正常 当我尝试访问控制器路由的任何视图时 假设 Posts Controller index 我收到这个错误 Completed 500 Intern
  • 将数据帧传递给函数时,pandas 何时进行引用传递和值传递?

    def dropdf copy df df df drop y axis 1 def dropdf inplace df df drop y axis 1 inplace True def changecell df df y 0 99 x
  • dotnet test > 有没有办法显示在控制台中运行的测试列表?

    跑步时dotnet test 有没有办法显示在控制台中运行的所有测试的列表而不是某些输出文件 在控制台中看到这样的列表是理想的 x test1 test2 test3 x test4 而不仅仅是总体测试统计数据 运行 失败 跳过 我在 ma
  • 如何执行 URL 中没有 .php 扩展名的 PHP 网页?

    抱歉 菜鸟问题 无法理解我应该搜索的内容 我正在用该页面创建一个网站product php id 777我希望它是product 777 谢谢你 在您的 Web 根目录中创建 htaccess 文件并在其中输入以下内容 Options Fo
  • UICollectionView 滚动到项目不适用于水平方向

    我有一个UICollectionView在一个UIViewController启用分页 由于某种奇怪的原因 collectionView scrollToItem工作时的方向collectionview is vertical但当方向为ho
  • python:无意中修改传递给函数的参数

    有几次我不小心修改了函数的输入 由于 Python 没有恒定的引用 我想知道什么编码技术可以帮助我避免经常犯这种错误 Example class Table def init self fields raw data fields is a
  • 除非您更新 Google Play 服务,否则此应用将无法运行

    我现在一直在不断尝试让 Android V2 的谷歌地图能够工作 我正在设备上尝试此操作 Samsung Galaxy S 2 3 3 和模拟器 我的清单 我尝试过同时使用 Debug 键和 Release 键
  • C# 可以从派生类调用基类属性

    我有一个基类 其属性具有 setter 方法 有没有一种方法可以从派生类调用基类中的 setter 并为其添加更多功能 就像我们使用 base 关键字覆盖方法一样 抱歉 我应该添加一个例子 这是一个例子 希望我做对了 public clas
  • Linux 中 mmap 物理内存的用户空间 memcpy 性能较差

    在我的计算机上安装的 192GB RAM 中 我有 188GB RAM 以上 4GB 硬件地址 0x100000000 由 Linux 内核在启动时保留 mem 4G memmap 188G 4G 数据采集 内核模块使用 DMA 将数据累积