我有一台比较旧的服务器,它具有4GB的RAM,并且几乎全天都在提供相同的文件,但是它是从硬盘驱动器来完成的,而3GB的RAM是“免费的”。

任何人曾经尝试运行ram驱动器的人可以看到,它在速度方面很棒。该系统的内存使用率通常不会高于1GB / 4GB,因此,我想知道是否有一种方法可以使用这些额外的内存来达到良好的效果。


是否可以判断文件系统始终可以从RAM中提供某些文件?
我还有其他方法可以通过使用RAM来提高文件读取能力吗?

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

这里可能的应用程序是:


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

有什么想法吗?

编辑:


发现了这一点内容丰富:Linux Page Cache和pdflush

正如Zan所指出的那样,内存实际上并不是空闲的。我的意思是说应用程序没有使用它,我想控制应该在内存中缓存的内容。


评论

我也正在按照这些思路寻求帮助。我认为一般文件系统磁盘块缓存不是答案。假设我希望磁盘块X始终被缓存。有东西访问它,内核对其进行缓存。到目前为止很好,但是下一个进程需要块Y,因此内核将丢弃我的块X并缓存Y。想要X的下一个进程将不得不等待它离开磁盘。那就是我要避免的。我想要的(以及我认为原始发布者也想要的)是将直写式缓存覆盖到文件系统上,以确保文件始终为

鉴于似乎已经达成共识,即Linux应该已经为您缓存了常用文件,我想知道您是否真的可以使用此处的建议进行任何改进。在我看来,尝试手动控制缓存可能有助于预热缓存,但是使用您描述的使用模式(“全天提供相同的文件”),对已经热身的服务器没有帮助很多,如果有的话。

您说的并不是要查找黑客,但是Linux默认已经完成了您想做的事情。下面的等式:“整天提供相同的文件” +“告诉文件系统始终将某些文件提供到RAM之外”,从定义上讲等于“ Hack”。您实际上注意到任何性能改进吗?根据我的经验,Linux缓存是文件系统读取的对象。

为了澄清起见,Linux会缓存文件,但是会针对每个请求针对每个文件验证元数据。在生锈的情况下,在繁忙的Web服务器上有很多小文件,这仍可能导致IO争用并过早损坏驱动器。静态内容和脚本可以rsync到/ dev / shm或在应用程序启动时自定义tmpfs挂载。我已经这样做了几十年,而且我的驱动器不会过早磨损。同样,我的站点可以更好地承受突发负载。从最昂贵的企业硬件到商品硬件,这都有帮助。

#1 楼

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存储库可用。

评论


对于将来的查看者,请尝试使用vmtouch git存储库,而不要遵循链接页面上的说明。这样,您将获得一个makefile并可以提取更新。

–随机
15年8月4日在5:19

似乎文件大小(4GB)有限制。还有其他选择吗?

– Alix Axel
2015年10月16日16:12

好的,这是我的实际用例:带有旧SD卡的RPi1,在那里做东西的地方。在我去那里旅行并更换卡(可能还有电源)之前,我希望OS谨慎接触卡,最好永远不要接触卡。 FS缓存不错,但超出了我的控制范围; / bin和/ sbin已经在tmpfs上,获取/ home / user同样具有其他缺点。 vmtouch非常适合这种利基市场。

– Piskvor离开了建筑物
19年1月10日在16:28

vmtouch与tmpfs有何不同?

–爱德华·托瓦尔兹
19年1月25日在10:26



#2 楼

使用vmtouch虚拟内存触摸程序实用程序也可以做到这一点。

该工具允许您控制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


评论


这是一个很棒的实用程序,它确实可以执行OP的要求。如果可以的话,他会接受。

–laebshade
13年1月30日在18:23

您知道这是否适用于ZFS吗?

– CMCDragonkai
15年8月16日在5:36

@CMCDragonkai我认为ZFS并不需要它...想:ARC和L2ARC。

–ewwhite
15年8月16日在5:38

#3 楼

一个可怜的人把东西放到文件系统缓存中的窍门是简单地照顾它并将其重定向到/ dev / null。

评论


同意。而且,如果您要确保缓存某些文件,请执行cron作业,该文件将文件定期定为/ dev / null

–乔什
09年7月21日在12:31

Cronjob给您带来一定的不便,但是如果使用cat文件(例如vmtouch -vt文件)将文件加载到光盘缓冲区有任何不利之处,您可以发表评论吗?

–user1079505
20 Sep 9'1:20



@ user1079505缺点是,如果RAM中缺少文件的某些部分,则会再次从磁盘读取它们。如果使用vmtouch -t,它们将被锁定在RAM中,因此无需再次读取它们。也许你问自己为什么他们迷路了。发生这种情况是因为从光盘读取了其他文件并对其进行了缓存。如果经常读取高速缓存的文件,它们将保留在RAM中,但是如果您读取比RAM大的大文件,它将覆盖整个高速缓存(如果您是通过vmtouch锁定的文件,则不会)。更多信息:unix.stackexchange.com/a/539180/101920

– mgutt
20-10-10在8:14

@cagenut“此答案的答案”:unix.stackexchange.com/a/156220/101920

– mgutt
20-10-10在8:24

#4 楼

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

但是,如果您坚持将数据存储在内存中,则可以使用tmpfs或ramfs创建一个ram驱动器。区别在于ramfs将分配您要求的所有内存,就像tmpfs仅使用您的块设备正在使用的内存一样。我的记忆有些生锈,但是您应该可以做到:

 # mount -t ramfs ram /mnt/ram 




 # mount -t tmpfs tmp /mnt/tmp


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

评论


感谢您的回答,但这显然是我要避免的事情。否则,我只是编写脚本,以便计算机创建ramdrive,复制文件并象征性地链接到ramdrive。但是那时我的数据不一致。我希望有一个文件系统,在其中可以“标记”某些文件以缓存在内存中。但也许我有点太乐观了。

– Andrioid
09年7月21日在7:21

您可以通过访问来“标记”要缓存的文件。

–womble♦
09年7月21日在7:35

如果只有某种方法可以自动标记最常用的文件。

–大卫·帕什利(David Pashley)
09年7月21日在7:53

Blimey,讽刺做得不好:)

–大卫·帕什利(David Pashley)
09年7月21日在13:37

是的,谢谢。我了解IO缓存的概念。我什至在我的回答中做了解释。似乎您没有读到那是讽刺的微妙评论。

–大卫·帕什利(David Pashley)
09年7月21日在18:55

#5 楼

在对2.6内核交换和页面缓存功能进行了广泛的阅读之后,我发现了'fcoretools'。其中包含两个工具;


fincore:将显示应用程序已存储在核心内存中的页面数
fadvise:允许您操纵核心内存(页面缓存) 。

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

评论


我认为有一个程序可以在某个地方做到这一点。 +1

–布拉德·吉尔伯特(Brad Gilbert)
09年7月22日在3:29

#6 楼

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

告诉linux内核它应该如何积极地使用swap。引用Wikipedia文章:Swappiness是Linux内核的属性,它改变了换出运行时内存之间的平衡,而不是从系统页面缓存中删除页面。透明度可以设置为介于0和100之间的值。较低的值表示内核将尝试尽可能避免交换,而较高的值将使内核积极尝试使用交换空间。默认值为60,对于大多数台式机系统,将其设置为100可能会影响整体性能,而将其设置为较低(甚至为0)可能会改善交互性(减少响应延迟)。


vfs_cache_pressure

从vm.txt引用:


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

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



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

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

#7 楼

您也许可以拥有一个仅在您的文件后就可以继续运行的程序。

评论


据我所知,这几乎就是“ fadvise”(fcoretools)的功能。

– Andrioid
09年7月21日在18:09

#8 楼

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

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

评论


是的,我只是想控制要缓存的内容。

– Android
09年7月21日在7:12

#9 楼

如果您有足够的内存,则可以简单地读取要使用cat或类似文件缓存的文件。 Linux将会很好地保持它。

#10 楼

您可以使用多种ramfs系统(例如ramfs,tmpfs),但是通常,如果实际上经常读取文件,它们就位于文件系统缓存中。如果您的工作文件集大于可用内存,则文件将被清除-但是,如果您的工作集大于可用内存,则也无法将其全部放入ramdisk中。

检查shell中“ free”命令的输出-最后一列中“ Cached”下的值是您的可用ram中有多少用于文件系统缓存。

#11 楼

至于后一个问题,请确保您的RAM位于不同的内存通道上,以便处理器可以并行获取数据。

#12 楼

我认为这可能在应用程序级别上可以更好地解决。例如,可能有专门的Web服务器,或者您可以考虑使用Apache的mod_cache。如果您有一个特定的目标,例如更快地提供Web内容,那么我认为可以通过这种方式获得改进。

但是您的问题本质上是通用的,Linux内存子系统旨在提供对RAM的最佳通用使用。如果要针对某些类型的性能,请考虑在/ proc / sys / vm中查找所有内容。

fcoretools软件包很有趣,我会对有关其应用程序的任何文章都感兴趣...该链接讨论了应用程序中使用的实际系统调用。

评论


查找/ var / lib / mysql | xargs fadvise -willneed(肮脏,但是它应该提供对数据库文件的更快访问;作为示例)

– Andrioid
09年7月21日在18:03

很好的技巧,但是这样的技巧并没有禁用很多来自mysql的等待fsyncs :(需要fsyncs来确保ACID(原子性,一致性,隔离性,耐久性)。

–osgx
2010-2-7在1:48



#13 楼

台式计算机(例如ubuntu)在启动时已使用预加载文件(至少是流行的共享库)到内存中。它用于加快FF,OO,KDE和GNOME(带有Evolution bloat-mailer)之类的各种bloarware的启动和启动时间。该工具名为readahead http://packages.ubuntu。 com / dapper / admin / readahead

也有相应的syscall:readahead(2)http://linux.die.net/man/2/readahead

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

#14 楼

http://www.coker.com.au/memlockd/做到了这一点

尽管您确实不需要它,但是linux会很好地自行缓存正在使用的文件。

#15 楼

我只是尝试了dd if = / dev / yourrootpartition = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

它没有给我您想要的控制权,但它至少尝试使用浪费的内存

#16 楼

我使用find / -name随机字符字符串
很有帮助

#17 楼

要求的不完全相同,但我使用


查找BASE_DIRECTORY -type f -exec cat {}> / dev / null \;


触发从快照创建的AWS卷中文件的初始化。如果您只想读取一些文件,它比使用dd的官方建议更加集中。

#18 楼

有时我可能想将文件缓存在某个文件夹及其子文件夹中。我只是转到该文件夹​​并执行以下命令:

find。 -exec cp {} / dev / null \;

那些文件被缓存