Linux 中的无缓冲 I/O

2024-05-17

我正在写入大量的数据,这些数据数周内都不会再次读取 - 由于我的程序运行,机器上的可用内存量(显示为“空闲”或“顶部”)很快下降,我的内存量应用程序使用量不会增加 - 其他进程使用的内存量也不会增加。

这让我相信内存正在被文件系统缓存消耗——因为我不打算长时间读取这些数据,所以我希望绕过系统缓冲区,这样我的数据就会直接写入磁盘。我没有提高性能或成为超级忍者的梦想,我的希望是向文件系统暗示我不会很快回来获取这段内存,所以不要花时间针对这些情况进行优化。

在 Windows 上,我遇到了类似的问题,并使用 FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH 修复了问题 - 我的应用程序没有消耗机器内存,并且机器总体上更可用。我希望在 Linux 上复制我所看到的改进。在 Windows 上,写入扇区大小的块有限制,我对我测量的增益量的这种限制感到满意。

Linux 中有类似的方法吗?


我能想到的与您提到的 Windows 标志最接近的等效项是使用以下命令打开文件open(2) http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html flags O_DIRECT | O_SYNC:

   O_DIRECT (Since Linux 2.4.10)
          Try to minimize cache effects of the I/O to and from this file.  In
          general this will degrade performance, but it is useful in special
          situations, such as when applications do their own caching.  File I/O
          is done directly to/from user space buffers.  The O_DIRECT flag on its
          own makes at an effort to transfer data synchronously, but does not
          give the guarantees of the O_SYNC that data and necessary metadata are
          transferred.  To guarantee synchronous I/O the O_SYNC must be used in
          addition to O_DIRECT.  See NOTES below for further discussion.

          A semantically similar (but deprecated) interface for block devices is
          described in raw(8).

当然,试图对这个标志进行研究以确认它是你想要的我发现这个有趣的作品 http://web.archive.org/web/20120618090457/http://kerneltrap.org/node/7563Linus 告诉你无缓冲 I/O 是一个坏主意,他将其描述为“大脑受损”。据此你应该使用madvise() http://www.kernel.org/doc/man-pages/online/pages/man2/madvise.2.html相反,告诉内核如何缓存页面。 YMMV。

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

Linux 中的无缓冲 I/O 的相关文章

  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • 如何使用通配符在C中删除多个文件?

    C 有什么方法可以删除 使用remove 使用多个文件 通配符 我有一组文件 全部以 Index 开头 例如 Index1 txt Index 39 txtETC 它们都以 Index 开头 但我不知道后面是什么文本 同一目录中还有其他文件
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • PHP mkdir() 和 fopen() 不起作用 - 权限问题? umask问题?

    以下 PHP 脚本无法创建目录 它也将无法创建文件 当目录已经存在时 ini set error reporting E ALL define ABSPATH SERVER DOCUMENT ROOT echo ABSPATH br br
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o

随机推荐

  • 简单的 Xml - 元素的顺序未保留?

    我在我的 Android 应用程序中使用 SimpleXml 2 6 1 尽管文档 http simple sourceforge net download stream doc javadoc index html org simplef
  • PHPExcel下载文件

    我想下载使用 PHPExcel 生成的 Excel 文件 我按照以下代码PHPExcel 强制下载问题 https stackoverflow com questions 26265108 phpexcel force download i
  • 将 Pandas TimeDelta 转换为整数

    假设我有一个包含 TimeDelta 数据的 Pandas Series 事实上 它是通过将 DateTimeIndex 与其自身的移位版本进行差值生成的 从而给出了连续时间戳之间的增量 它看起来像 timestamp 2015 02 01
  • rvest 和 NHL 统计数据的 CSS 选择器问题

    我想从 hockey reference com 中抓取数据 特别是从以下链接中抓取数据 https www hockey reference com leagues NHL 1991 html https www hockey refer
  • Django Rest Framework——没有名为rest_framework的模块

    我已经使用安装了 django rest 框架pip install djangorestframework但当我运行 python3 manage py sycndb 时 我仍然收到此错误 导入错误 没有名为 rest framework
  • 在哪里放置 OpenFL android 扩展的可绘制资源?

    我正在为我的 OpenFL 应用程序制作一个 android 扩展 当我从 Haxe 调用函数时 它应该显示一条通知 我需要在我的扩展项目中放置一个可绘制图标 因为通知需要一个图标 但是 Java 文件扩展了一个 Extension 类 该
  • SQL 约束最小值/最大值?

    有没有办法为数字字段设置 SQL 约束 最小值应为 1234 最大值应为 4523 SQL Server 语法为the check约束 http technet microsoft com en us library ms179491 as
  • 将自定义误差线添加到 seaborn regplot 和 residplot

    有没有一种方法可以将自定义错误栏添加到seaborn regplot和residplot中 就像使用yerr对matplotlib错误栏所做的那样 例子在这里 如果我只是添加 yrr 参数就会发生错误 import seaborn as s
  • css mime 类型返回为 text/plain 而不是 text/css

    我正在使用此代码从给定文件中获取 mime 类型 finfo new finfo FILEINFO MIME TYPE mime finfo gt buffer file get contents file 如果我给它提供一个 PHP 文件
  • 选择前 n 个字符相等的行(MySQL)

    我有一张带有玩家句柄的桌子 如下所示 1 N Laka 2 N James 3 nor Brian 4 nor John 5 Player 2 6 Spectator 7 N Joe 从那里我想选择第一个 n 字符匹配的所有玩家 但我不知道
  • 将 C++ 库嵌入到 .Net 库中

    在我的 Net 程序集中 我必须使用一些本机 C dll 通常我们需要将C dll复制到bin文件夹中并使用PInvoke来调用它 为了节省分发成本 我想将 C 直接嵌入到我的 Net dll 中 这样分发的程序集数量就会更少 知道如何做到
  • 调用擦除()后 std::map::iterator 出现问题

    erasing from map include
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 导入 matplotlib.pyplot 时出错

    当我跑步时import matplotlib pyplot as plt 我收到以下错误消息 ImportError Traceback most recent call last
  • Apache kafka - 消费者延迟选项

    我想在 Kafka 中为特定主题稍稍延迟启动一个消费者 具体来说 我希望消费者在从生成消息的时间起经过特定的时间延迟后开始使用该主题的消息 Kafka 中有任何属性或选项可以启用它吗 我们对火花流做了同样的事情 我希望 这种方法也适合您 这
  • 在 DatePickerDialog 中使用 DatePicker setMaxDate() 时出现 NullPointerException

    我正在使用 DatePickerDialog 并且尝试设置最小和最大日期 以便用户只能选择前 24 小时或后 24 小时内的日期 这是代码 请注意 如果在 Android 3 0 或更高版本上运行 它只会尝试设置最小 最大范围 privat
  • 从 markdown 转换为 pandoc 时的 \newcommand 环境

    我使用 ipython 笔记本输入数学 然后转换为乳胶 让 mathjax 理解 newcommand 我必须把它放进去 例如 newcommand cl operatorname cl 与 mathjax 配合良好 问题是 当我使用 pa
  • 如何通过 Android 中小部件上的按钮运行活动?

    我正在开发一个由按钮组成的切换小部件 当按下时 我希望它运行一个活动而不打开任何东西 只是像往常一样在桌面上说 有没有办法通过桌面小部件上的按钮直接运行活动 谢谢 更新 现在我尝试在代码中切换静默模式而不运行新的活动 这是我当前的代码 当我
  • Rust 为什么要费心“let”? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对 Rust 很感兴趣 所以我开始阅读 Rust 网站上的 Rust 编程指南 发现变量是通过以下方式声明的 let x i32 5 这意味着
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算