AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 43383
Accepted
Andrioid
Andrioid
Asked: 2009-07-21 23:01:39 +0800 CST2009-07-21 23:01:39 +0800 CST 2009-07-21 23:01:39 +0800 CST

将 Linux 上的文件缓存/预加载到 RAM 中

  • 772

我有一个相当旧的服务器,它有 4GB 的 RAM,它几乎整天都在提供相同的文件,但是它是从硬盘驱动器上这样做的,而 3GB 的 RAM 是“免费的”。

任何尝试过运行 ram-drive 的人都可以见证它在速度方面的出色表现。这个系统的内存使用量通常不会超过 1GB/4GB,所以我想知道是否有办法将额外的内存用于一些好的事情。

  • 是否可以告诉文件系统始终从 RAM 中提供某些文件?
  • 有没有其他方法可以通过使用 RAM 来提高文件读取能力?

更具体地说,我不是在这里寻找“黑客”。我希望文件系统调用从 RAM 中提供文件,而无需创建 ram 驱动器并手动复制文件。或者至少是一个为我执行此操作的脚本。

这里可能的应用是:

  • 带有大量读取的静态文件的 Web 服务器
  • 具有大型库的应用程序服务器
  • 具有过多 RAM 的台式计算机

有任何想法吗?

编辑:

  • 发现这个非常有用:Linux Page Cache and pdflush
  • 正如 Zan 指出的那样,内存实际上并不是免费的。我的意思是它没有被应用程序使用,我想控制应该缓存在内存中的内容。
linux cache virtual-memory
  • 18 18 个回答
  • 82936 Views

18 个回答

  • Voted
  1. Best Answer
    seeker
    2012-09-02T13:40:40+08:002012-09-02T13:40:40+08:00

    vmtouch似乎是完成这项工作的好工具。

    强调:

    • 查询一个目录缓存了多少
    • 查询缓存了多少文件(还有哪些页面,图形表示)
    • 将文件加载到缓存中
    • 从缓存中删除文件
    • 锁定缓存中的文件
    • 作为守护进程运行

    vmtouch手册

    编辑: 问题中所问的用法列在vmtouch Hompage上的示例 5 中

    Example 5
    
    Daemonise and lock all files in a directory into physical memory:
    
    vmtouch -dl /var/www/htdocs/critical/
    

    EDIT2: 如评论中所述,现在有一个可用的git 存储库。

    • 73
  2. ewwhite
    2012-10-24T08:50:34+08:002012-10-24T08:50:34+08:00

    这也可以使用vmtouch Virtual Memory Toucher实用程序来实现。

    该工具允许您控制 Linux 系统上的文件系统缓存。您可以强制或锁定 VM 缓存子系统中的特定文件或目录,或使用它来检查文件/目录的哪些部分包含在 VM 中。

    How much of the /bin/ directory is currently in cache?
    
    $ vmtouch /bin/
               Files: 92
         Directories: 1
      Resident Pages: 348/1307  1M/5M  26.6%
             Elapsed: 0.003426 seconds
    

    或者...

    Let's bring the rest of big-dataset.txt into memory...
    
    $ vmtouch -vt big-dataset.txt
    big-dataset.txt
    [OOo                                                 oOOOOOOO] 6887/42116
    [OOOOOOOOo                                           oOOOOOOO] 10631/42116
    [OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
    [OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
    [OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
    [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
    [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
    [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
    [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
    [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116
    
               Files: 1
         Directories: 0
       Touched Pages: 42116 (164M)
             Elapsed: 12.107 seconds
    
    • 31
  3. cagenut
    2009-07-21T23:19:58+08:002009-07-21T23:19:58+08:00

    一个穷人将东西放入文件系统缓存的技巧是简单地对它进行分类并将其重定向到/dev/null。

    • 26
  4. David Pashley
    2009-07-21T23:17:52+08:002009-07-21T23:17:52+08:00

    Linux 会在内存中缓存尽可能多的磁盘 IO。这就是缓存和缓冲内存统计信息。在存储正确的东西方面,它可能会比你做得更好。

    但是,如果您坚持将数据存储在内存中,则可以使用 tmpfs 或 ramfs 创建一个 ram 驱动器。不同之处在于 ramfs 将分配您要求的所有内存,因为 tmpfs 只会使用您的块设备正在使用的内存。我的记忆有点生疏,但你应该能够做到:

     # mount -t ramfs ram /mnt/ram 
    

    或者

     # mount -t tmpfs tmp /mnt/tmp
    

    然后将您的数据复制到目录中。显然,当您关闭机器或卸载该分区时,您的数据将会丢失。

    • 20
  5. Andrioid
    2009-07-22T00:09:55+08:002009-07-22T00:09:55+08:00

    在大量阅读 2.6 内核交换和页面缓存功能后,我发现了“fcoretools”。其中包括两个工具;

    • fincore:将显示应用程序在核心内存中存储了多少页
    • fadvise:允许您操作核心内存(页面缓存)。

    (如果其他人觉得这很有趣,我会在这里发布)

    • 18
  6. Petr
    2012-10-24T08:17:30+08:002012-10-24T08:17:30+08:00

    即使不使用其他工具,也有两个内核设置可以提供很大帮助:

    交换性

    告诉 linux 内核它应该多积极地使用交换。引用维基百科的文章:

    Swappiness 是 Linux 内核的一个属性,它改变了换出运行时内存之间的平衡,而不是从系统页面缓存中删除页面。Swappiness 可以设置为 0 到 100 之间的值(包括 0 到 100)。较低的值意味着内核将尽可能避免交换,而较高的值将使内核积极尝试使用交换空间。默认值为 60,对于大多数桌面系统,将其设置为 100 可能会影响整体性能,而将其设置为较低(甚至为 0)可能会提高交互性(减少响应延迟。)

    vfs_cache_pressure

    引用vm.txt:

    控制内核回收用于缓存目录和 inode 对象的内存的趋势。

    在默认值 vfs_cache_pressure=100 时,内核将尝试以相对于 pagecache 和 swapcache 回收的“公平”速率回收dentries 和 inode。减小 vfs_cache_pressure 会导致内核更喜欢保留 dentry 和 inode 缓存。...


    通过设置swappiness高(如 100),内核移动它不需要交换的所有内容,释放 RAM 用于缓存文件。通过设置vfs_cache_pressure较低(假设为 50,而不是 0!),它将有利于缓存文件而不是将应用程序数据保存在 RAM 中。

    (我在一个大型 Java 项目上工作,每次运行它都会占用大量 RAM 并刷新磁盘缓存,所以下次我编译项目时,一切都从磁盘读取。通过调整这两个设置,我管理将源代码和编译后的输出缓存在 RAM 中,从而大大加快了进程。)

    • 9
  7. Brad Gilbert
    2009-07-22T09:24:53+08:002009-07-22T09:24:53+08:00

    您也许可以拥有一个程序,该程序只mmap存储您的文件,然后保持运行。

    • 4
  8. Thorbjørn Ravn Andersen
    2009-07-21T23:44:30+08:002009-07-21T23:44:30+08:00

    如果你有足够的内存,你可以简单地用 cat 或类似的方法读入你想要缓存的文件。然后,Linux 会很好地保留它。

    • 3
  9. Zan Lynx
    2009-07-21T23:11:08+08:002009-07-21T23:11:08+08:00

    我非常怀疑它实际上是从具有 3 GB RAM 空闲的磁盘中提供文件。Linux 文件缓存非常好。

    如果您看到磁盘 IO,我会查看您的日志记录配置。许多日志被设置为无缓冲,以保证在发生崩溃时可以获得最新的日志信息。在无论如何都必须快速的系统中,使用缓冲日志 IO 或使用远程日志服务器。

    • 2
  10. osgx
    2010-02-07T17:53:20+08:002010-02-07T17:53:20+08:00

    台式计算机(例如 ubuntu)已经在启动时使用预加载文件(至少是流行的共享库)到内存中。它用于加快不同bloarware的引导和启动时间,如 FF、OO、KDE ​​和 GNOME(带有进化 bloat-mailer)。

    该工具名为readahead http://packages.ubuntu.com/dapper/admin/readahead

    还有对应的系统调用:readahead(2) http://linux.die.net/man/2/readahead

    还有预加载守护进程的项目:http: //linux.die.net/man/8/preload

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve