我正在学习Linux下的文件操作调用。和许多其他功能使用缓存来提高性能,我知道可以read()将数据从缓存传输到磁盘设备。write()fsync()
但是,是否有任何命令或系统调用可以确定数据是否被缓存或写入磁盘?
我发现perf top -e cache-misses:pp -p <my_pid>相当混乱的行为。我拥有一个 Intel i5-3230M,运行内核 4.4.5 64 位。
如果我只运行该命令,我的应用程序中基本上没有样本(具有大型数据集的数值模拟,因此肯定必须显示缓存未命中),但几乎仅从一些内核函数中获取,例如intel_pmu_lbr_enable_all, native_write_msr_safe, native_read_msr_safe, __intel_pmu_lbr_disable。如果我使用 将点击次数限制在用户空间-K,我只会在我的应用程序中获得点击次数,但数量非常少。如果我删除一个“精确” ( p) 修饰符,我会得到更多的命中,但是来自显然不会导致内存加载/写入的操作码。
我应该如何解释这种行为?究竟什么算作“缓存未命中”?
我担心该~/.cache目录有两个原因:它会导致我的 SSD 不必要地进行大量写入,并且它包含有关加密容器和外部驱动器中文件的信息(如图像缩略图)。
我把它放在一个 tmpfs 中,里面有一行fstab。它运行没有问题,直到它变满:这会导致某些程序出现错误消息。
我认为 中的文件.cache不应该是持久的(类似于/tmp),这就是我使用 tmpfs 的原因。所以我写了一个脚本,由 运行cron,.cache如果 tmpfs 已满,它每小时清理一次。
但这会导致tracker无法找到其数据库的错误消息。
这让我怀疑这个目录真的不应该是持久的。把它放在 a 中是个好主意tmpfs吗?
我可以使用 SSD(例如 512GiB)作为我的文件系统(例如 16TiB)的缓存吗?
我想避免 NAS 上的磁盘每天都旋转,因为当我的计算机 rsync 到它时,只有文件大小、时间戳是检查,而且实际上更新的数据很少(因此 512GiB 可以允许,唤醒硬盘驱动器要少得多通常,仅适用于“SSD->HDD”“刷新”)。
任何想法如何设置它?
请给我一些有关潜在歧义的提示。
(当然,以“HDD 支持”文件系统为例,它可以是任何其他的 NFS)
目前我可能想要“使用 ssd 缓存”以避免磁盘旋转的两个文件系统是:LVM 上的 EXT4 和 Btrfs。
用例:我在房间里有一台电脑,用作 Linux NAS。白天,其他计算机会定期与它同步,因此它的磁盘在旋转,晚上进入睡眠/安静状态。大多数情况下,计算机 rsync 只同步少数更改的文件并检查其他文件的大小和时间戳,因为通常很少有新数据(
最近我发现一篇文章提到最近dm-cachelinux 有了显着的改进。我还发现在用户空间中您将其视为lvmcache. 这对我来说很困惑。我认为 LVM 缓存机制与dm-cache. 在我的服务器上,我dm-cache使用命令直接在设备映射器级别上进行设置dmsetup。不涉及 LVM 命令。
那么到底是什么?lvmcache仅使用 CLI就可以更轻松地dm-cache进行设置吗?使用它而不是原始dmsetup命令是更好的主意吗?
我当前的脚本如下所示:
#!/bin/bash
CACHEPARAMS="512 1 writethrough default 0"
CACHEDEVICES="o=/dev/mapper/storage c=/dev/mapper/suse-cache"
MAPPER="storagecached"
if [ "$1" == "-u" ] ; then
{
for i in $CACHEDEVICES ; do
if [ "`echo $i | grep \"^c=\"`" != "" ] ; then
__CACHEDEV=${i:2}
elif [ "`echo $i | grep \"^o=\"`" != "" ] ; then
__ORIGINALDEV=${i:2}
fi
done
dmsetup …Run Code Online (Sandbox Code Playgroud) 我正在ddrescue从磁盘 A运行到磁盘 B。
我原以为较慢的磁盘会一直全速运行,而另一个磁盘的运行速度足以跟上。
想象一下当vmstat 5(即下面的数字是 5 秒平均值)给出这个输出时我的惊讶:
procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 608260 234672 21308688 4346420 0 0 116890 31 1374 2884 1 4 85 10 0
0 1 608260 232820 21309700 4348712 0 0 134248 53 1546 3354 1 4 85 10 0
3 1 608260 247120 21267028 4374552 0 0 134272 0 2162 …Run Code Online (Sandbox Code Playgroud) 我有一些大文件,我同意以磁盘 I/O 容量读取它们。我希望为其他文件提供免费的文件系统缓存。是否可以在 Linux 上关闭特定文件的文件系统缓存?我希望通过本机 lib + java 以编程方式执行此操作。
块设备提供缓冲。这意味着write()在内核将数据写入设备之前,块设备上可以返回成功。程序可以通过调用 来等待所有缓冲的写入fsync()。
我已使用dd(或cat) 将文件系统映像写入设备。默认情况下不调用这些命令fsync()。
接下来,假设我想将mount写入的块设备作为文件系统。
我认为最安全的做法是在安装之前使用该sync命令。但是如果我不同步块设备怎么办?文件系统是否可能尝试读取一些尚未写入设备的块?那么它是否可以读取设备的旧内容,而不是文件系统映像中的正确数据?
我的主要兴趣是 Linux 行为。(StackExchange 鼓励我提出一个具体问题。不过,我也可以对任何替代或历史行为投赞成票:-)。
我的笔记本电脑往往有大约256MB算作“缓冲区”运行-中/proc/meminfo和free -w -h-出于对8GB的内存。
我对内存使用感兴趣。我有时会因为使用太多而遇到麻烦。我并不担心 ~256MB 的“缓冲区”使用量,但我很好奇。
我已经确定了哪个软件使用它,并且使用似乎是(几乎完全?)不必要的 8-)。我安装了两个 ext4 文件系统,每个文件系统的日志大小为 128MB。 大约 256MB 的“缓冲区”使用量基本上是来自 ext4 日志的所有缓存写入。
我认为不需要缓存每个文件系统的整个日志文件。(大多数情况下,只有少量期刊会在其中包含“实时数据”!我没有使用data=journalled)。我对这种特定的不必要的“缓冲区”用法感兴趣。我知道可能还有其他用途,其中一些可能更必要。例如,据我所知,这可能是有用的缓存该杂志的部分确实目前持有的实时数据。
当我进行调查时,我注意到“缓冲区”是较小系统上物理 RAM 的 30%!
我的问题是,当内存被请求用于任何其他目的(包括页面缓存)时,Linux 如何确保删除大量这些不必要的“缓冲区” ?请引用你的信念所依据的证据。
我对历史差异并不特别感兴趣,只对“当前”系统的行为感兴趣。如果您有兴趣,我的笔记本电脑目前正在运行 Fedora 28,内核版本 4.18.16-200.fc28.x86_64。(或者较小的系统正在运行 Debian 9,内核版本 4.9.0-8-marvell)。
与“缓冲区”的行为相比,我更熟悉页面缓存的概念 -Cached在/proc/meminfo和free -w -h- 中。
我最近重新阅读了这个线程:Linux 内核中使用哪些页面替换算法用于 OS 文件缓存?
对未缓存文件页面的访问,例如复制未缓存文件时的读取和写入,缓存在“非活动”LRU 列表中。当从页面缓存中回收内存时,内核更喜欢从最近最少使用的“非活动”页面开始。它比“活动”页面更喜欢这些页面,“活动”页面是被多次访问的页面,即使它们可能更旧。
特别要注意,这允许您运行任意大的文件副本,而无需换出所有正在运行的程序。您正在运行的程序的所有重要内存页面都在“活动”列表中,因为重要页面将被多次访问。
这是 Linux 内存管理复杂性的第一个近似值。我在这里使用了一些模糊的词,比如“偏好”,因为我不是这些复杂性的专家。
理想情况下,我希望在回收任何页面缓存之前首先回收任何不必要的“缓冲区”。(如果您将“缓冲区”计为页面缓存的一部分,您应该理解我希望在任何缓存的常规文件之前回收任何不必要的“缓冲区”)。
所以我很好奇。在任何“非活动”页面缓存之前,是否会回收不必要的“缓冲区”?或者我只能说它们倾向于在“活动”页面缓存之前被回收?或者在我们与页面缓存进行任何比较之前,是否有更多细节必须解释?
我有一个/dev/mydisk基于一系列功能的设备:LUKS 加密的软件 RAID-1。
有时,我/dev/mydisk会将内容备份到外部 USB 磁盘,该磁盘本身使用 LUKS 加密。需要传输几个 100 GiB。这个操作不是简单的dd而是递归的cp(我还是需要改用rsync)
备份开始一段时间后,整个系统的交互性急剧下降。KDE 接口显然在等待获得批准的内存请求而窒息而死。提示的等待时间为 2 分钟并不罕见。等待网络 I/O 同样需要很大的耐心。这与baloo启动并决定解压缩每个 zip 并为每个文件内容编制索引以用于未知目的时发生的行为类似:系统变成沼泽独木舟。
内核似乎将所有 RAM 提供给复制进程,并且不愿意将其交还给交互式进程一个机会。RAM 并不寒酸:23 GiB。还有 11 GiB 的交换空间,以防万一,但它随时都会被几个 MiB 占用。
是否可以确保交互式进程优先于复制进程获得它们的 RAM?如果是这样,如何?
版本信息:
感谢大家到目前为止的答案!
一旦知道要搜索什么,就会发现一些东西。
我拖进来的东西:
dd,补救方法是使用标志oflag=direct绕过页面缓存。