这个问题的结构如下:
我首先给出一些关于我为什么对这个主题感兴趣以及它如何解决我正在处理的问题的背景。然后,我询问有关文件系统缓存的实际独立问题,因此如果您对动机(某些 C++ 项目构建设置)不感兴趣,请跳过第一部分。
我正在寻找一种方法来加快我们项目的构建时间。设置如下: 一个目录(我们称之为workarea)位于 NFS 共享中。它最初只包含源代码和生成文件。然后,构建过程首先在 中创建静态库workarea/lib,然后在 中创建共享库workarea/dll,使用 中的静态库workarea/lib。在共享库的创建过程中,这些不仅被写入,而且还使用例如再次读取nm在链接时验证没有符号丢失。并行使用许多作业(例如 make -j 20 或 make -j 40),构建时间很快就会被链接时间所支配。在这种情况下,链接性能受文件系统性能的限制。例如,并行连接 20 个作业在 NFS 共享中大约需要 35 秒,但在 RAM 驱动器中仅需要 5 秒。请注意,使用 rsync 复制dll回 NFS 共享还需要 6 秒,因此在 RAM 驱动器中工作并随后同步到 NFS 比直接在 NFS 共享中工作要快得多。我正在寻找一种无需在 NFS 共享和 RAM 驱动器之间显式复制/链接文件即可实现快速性能的方法。
注意我们的 NFS 共享已经使用了一个缓存,但是这个缓存只能缓存读访问。
AFAIK,NFS 要求任何 NFS 客户端在 NFS 服务器确认写入完成之前不能确认写入,因此客户端不能使用本地写入缓冲区,并且写入吞吐量(即使在峰值)受网络速度限制。在我们的设置中,这有效地将组合写入吞吐量限制在大约 80MB/s。
然而,读取性能要好得多,因为使用了读取缓存。如果我在 NFS 中链接(创建 的内容dll)workarea/lib并workarea/dll作为到 RAM 驱动器的符号链接,性能仍然不错 …
在当前(2018-06)Debian的SID,通过安装.deb软件包apt-get或aptitude或synaptic在缓存下载的软件包/var/cache/apt/archives:
# rm -f /var/cache/apt/archives/nano_*
# aptitude install nano
[...]
# aptitude purge nano
[...]
# ls /var/cache/apt/archives/nano_*
/var/cache/apt/archives/nano_2.9.7-1_amd64.deb
Run Code Online (Sandbox Code Playgroud)
使用前端apt不再缓存下载的文件:
# rm -f /var/cache/apt/archives/nano_*
# apt install nano
[...]
# ls /var/cache/apt/archives/nano_*
ls: cannot access '/var/cache/apt/archives/nano_*':
No such file or directory
Run Code Online (Sandbox Code Playgroud)
因此,在两组互斥的软件包之间切换会重新下载所有内容。如何更改设置apt以保留下载的文件?
我最近用三种不同的驱动器重新配置了我当前的 Debian 机器:SLC SSD、QLC SSD 和 4TB HDD。我一直在尝试lvmcache其他实用程序,我想知道是否可以创建一个多层缓存解决方案,利用两个 SSD 进行不同级别的缓存。
我的乌托邦结构是这样的:
lvmcache不幸的是,我还没有发现太多允许在或bcache(或者实际上是其他任何地方)中进行此类配置的多层缓存功能。
是否可以lvmcache这样bcache配置?如果没有,是否还有其他解决方案可以实现这种配置?
我正在使用 amazon ec2 命令行工具,该ec2-describe-instances工具有点痛苦,因为它需要 2-5 秒才能发出请求并显示输出。
我正在研究使用此问题中描述的fec2din工具来格式化输出的格式,并且想知道缓存调用输出的最佳方法是什么。ec2-describe-instances
fec2din用于mktemp创建临时文件,然后用于awk格式化输出。
是否有一些工具可以与 TTL 参数一起使用,该工具仅ec2-describe-instances在缓存文件上的时间戳早于某个时间时才运行?
如果有一些实用程序可以做到这一点(就像sponge帮助stdout)一样,那就太好了。
假设我有一些分区;一个在 SATA 驱动器上,一个在 SSD 上。我想创建一个“虚拟”混合磁盘。这可能吗?
我读过很多文档说,sync在做之前先做一个是个好主意echo [1,2,3] > /proc/sys/vm/drop_caches。我无法理解为什么需要它,因为 drop_cache 是一种非破坏性操作,并且 drop_cache 不会删除脏数据。我还看到了一种行为,即echo 1 > /proc/sys/vm/drop_caches首先将脏数据提交回磁盘,然后释放缓存。这可以通过/proc/meminfo“Dirty”和“Writeback”看出。
在没有打开程序的情况下,我的电脑使用了大约 512M 的内存。昨天,我没有打开任何东西,但使用了 2 GB 内存(已使用 - 缓存 = 2153):
total used free shared buffers cached
Mem: 3261 2875 386 30 199 523
-/+ buffers/cache: 2153 1108
Swap: 8187 0 8187
Run Code Online (Sandbox Code Playgroud)
Top 显示没有处理此问题的进程:
top - 23:10:38 up 1 day, 14:35, 3 users, load average: 0,31, 0,94, 1,29
Tasks: 172 total, 3 running, 169 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6,5 us, 4,2 sy, 0,0 ni, 89,1 id, 0,1 wa, 0,0 hi, 0,1 si, 0,0 st
KiB Mem: 3340164 total, 2937728 …Run Code Online (Sandbox Code Playgroud) 我想运行一个对它们将间接触发的内核对象有限制的任务。请注意,这与应用程序使用的内存、线程等无关,而是与内核使用的内存有关。具体来说,我想限制任务可以使用的inode 缓存量。
我的激励示例是updatedb. 它可以使用大量的 inode 缓存,用于之后大部分不需要的东西。具体来说,我要限制由指定的值ext4_inode_cache一致/proc/slabinfo。(请注意,这不包括在 显示的“缓冲区”或“缓存”行中free:这只是文件内容缓存,slab 内容是内核内存并记录在“已使用”列中。)
echo 2 >/proc/sys/vm/drop_caches 之后释放缓存,但这对我没有任何好处:无用的东西已经取代了我想保留在内存中的东西,例如运行的应用程序及其常用文件。
该系统是具有最新 (? 3.8) 内核的 Linux。我可以使用 root 访问权限进行设置。
如何在有限的环境(容器?)中运行命令,以便该环境对(ext4)inode 缓存的贡献仅限于我设置的值?
考虑以下场景。您有一个安装了 Linux的慢速只读媒体(例如写保护的拇指驱动器、CD/DVD 等)(不是 Live CD 本身,而是正常版本),并且在没有字面意义的计算机上使用它其他形式的存储。它很慢,因为它是 USB 2。根文件系统作为overlayfs 挂载,因此它对于日志和您所做的许多其他临时工作是“可写的”,但所有写入都转到 RAM (tmpfs upperdir)。为Live发行情况非常典型的场景。
由于没有其他形式的存储,swap 挂载在 zram 上。因此,当 Linux 决定交换时,它会压缩这些页面并将它们仍然存储在 RAM 中,但至少它们是被压缩的。这实际上很不错,因为大多数应用程序的 RAM 很容易压缩(RAM 通常在数据中非常冗余,因为它意味着“快速”)。这适用于应用程序内存,但不适用于 tmpfs。
事情是这样的:zram很快,令人难以置信。另一方面,拇指驱动器很慢。假设它是 20 MiB/s,相比之下这真的很慢。您可以在这里看到问题以及为什么内核不会做正确的事情。
请注意,此问题不是重复如何使 TMPFS 内的文件更可能交换。问题几乎相同,但我对那个问题的答案并不满意,抱歉。内核绝对不会不自行做“正确的事”,不管如何聪明的人设计它是。我不喜欢人们不了解情况并认为他们更了解情况。他们迎合一般情况。这就是 Linux 具有如此可调整性的原因,因为无论它多么智能,它都无法预测它的用途。
例如,我可以(并且确实)将vm.swappiness (/proc/sys/vm/swappiness) 设置为 100,这告诉它积极交换应用程序内存并保留文件缓存。这个选项很好,但不幸的是,它不是全部。
我希望它在处理交换时将文件缓存优先于任何其他 RAM 使用。这是因为丢弃文件缓存导致它不得不从慢20 MIB /秒的驱动器,这是多读回多比交换zram慢。对于应用程序,vm.swappiness 有效,但不适用于 tmpfs。
tmpfs 挂载为页缓存,因此它与文件缓存具有相同的优先级。如果您从 tmpfs 读取文件,它将优先于较旧的文件缓存条目(最近使用)。但是,这是不好的,内核显然没有做正确的事情在这里。应该考虑将 tmpfs 交换为 zram 比文件缓存“最近使用”要好得多,因为从驱动器读取非常慢。
所以我需要明确地告诉它与文件缓存相比更频繁地从 tmpfs 交换:它应该比 tmpfs 保留更多的文件缓存。/proc/sys/vm 中有很多选项,但我找不到。真让人失望。
如果做不到这一点,有没有办法告诉内核某些设备/驱动器比其他设备/驱动器慢得多,并且它应该比其他人更愿意为它们保留缓存?tmpfs 和 zram 很快。拇指驱动器不是。我可以告诉内核这个信息吗? …
我的 SLAB 不可回收内存 (SUnreclaim) 无限增长,这似乎是我的系统最终耗尽 RAM 并开始尝试交换直到死机的原因。这是我几天的 SUreclaim 的图表。我的典型 RAM 使用量在 16GB 服务器上约为 5GB。当 SUreclaim 达到大约 10.xGB 时,无休止的交换开始。
这些图表显示它无休止地增长,在这两种情况下,我重新启动它以释放 RAM,然后它会导致我的系统自行交换死亡。
这是第二次重新启动之前的部分平板电脑。
---------------------------------- 20180730164416 ----------------------------------
Active / Total Objects (% used) : 34014938 / 35150125 (96.8%)
Active / Total Slabs (% used) : 1098114 / 1098114 (100.0%)
Active / Total Caches (% used) : 120 / 147 (81.6%)
Active / Total Size (% used) : 7332279.93K / 7831039.90K (93.6%)
Minimum / Average / Maximum Object : 0.01K / 0.22K / 22.88K …Run Code Online (Sandbox Code Playgroud)