标签: cache

如何判断数据是写入磁盘还是缓存?

我正在学习Linux下的文件操作调用。和许多其他功能使用缓存来提高性能,我知道可以read()将数据从缓存传输到磁盘设备。write()fsync()

但是,是否有任何命令或系统调用可以确定数据是否被缓存或写入磁盘?

io cache disk write

5
推荐指数
1
解决办法
1092
查看次数

如何解释 perf -e cache-misses:pp?

我发现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) 修饰符,我会得到更多的命中,但是来自显然不会导致内存加载/写入的操作码。

我应该如何解释这种行为?究竟什么算作“缓存未命中”?

kernel cache intel perf

5
推荐指数
0
解决办法
863
查看次数

将 ~/.cache 放在 tmpfs 中是个好主意吗?

我担心该~/.cache目录有两个原因:它会导致我的 SSD 不必要地进行大量写入,并且它包含有关加密容器和外部驱动器中文件的信息(如图像缩略图)。

我把它放在一个 tmpfs 中,里面有一行fstab。它运行没有问题,直到它变满:这会导致某些程序出现错误消息。

我认为 中的文件.cache不应该是持久的(类似于/tmp),这就是我使用 tmpfs 的原因。所以我写了一个脚本,由 运行cron.cache如果 tmpfs 已满,它每小时清理一次。

但这会导致tracker无法找到其数据库的错误消息。

这让我怀疑这个目录真的不应该是持久的。把它放在 a 中是个好主意tmpfs吗?

cache tmpfs

5
推荐指数
1
解决办法
4010
查看次数

SSD 作为文件系统的缓存(例如在 HDD 或任何其他上)

我可以使用 SSD(例如 512GiB)作为我的文件系统(例如 16TiB)的缓存吗?

我想避免 NAS 上的磁盘每天都旋转,因为当我的计算机 rsync 到它时,只有文件大小、时间戳是检查,而且实际上更新的数据很少(因此 512GiB 可以允许,唤醒硬盘驱动器要少得多通常,仅适用于“SSD->HDD”“刷新”)。

任何想法如何设置它?

请给我一些有关潜在歧义的提示。

(当然,以“HDD 支持”文件系统为例,它可以是任何其他的 NFS)

目前我可能想要“使用 ssd 缓存”以避免磁盘旋转的两个文件系统是:LVM 上的 EXT4 和 Btrfs。

用例:我在房间里有一台电脑,用作 Linux NAS。白天,其他计算机会定期与它同步,因此它的磁盘在旋转,晚上进入睡眠/安静状态。大多数情况下,计算机 rsync 只同步少数更改的文件并检查其他文件的大小和时间戳,因为通常很少有新数据(

filesystems cache hard-disk

5
推荐指数
1
解决办法
1060
查看次数

lvmcache 和 dm-cache 有什么区别?

最近我发现一篇文章提到最近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)

cache lvm device-mapper

5
推荐指数
1
解决办法
1万
查看次数

为什么 ddrescue 不利用全带宽?

我正在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)

cache dd bandwidth ddrescue

5
推荐指数
0
解决办法
330
查看次数

Linux 中是否可以禁用特定文件的文件系统缓存?

我有一些大文件,我同意以磁盘 I/O 容量读取它们。我希望为其他文件提供免费的文件系统缓存。是否可以在 Linux 上关闭特定文件的文件系统缓存?我希望通过本机 lib + java 以编程方式执行此操作。

filesystems cache

5
推荐指数
1
解决办法
6322
查看次数

块设备缓存与文件系统

块设备提供缓冲。这意味着write()在内核将数据写入设备之前,块设备上可以返回成功。程序可以通过调用 来等待所有缓冲的写入fsync()

我已使用dd(或cat) 将文件系统映像写入设备。默认情况下不调用这些命令fsync()

接下来,假设我想将mount写入的块设备作为文件系统。

我认为最安全的做法是在安装之前使用该sync命令。但是如果我不同步块设备怎么办?文件系统是否可能尝试读取一些尚未写入设备的块?那么它是否可以读取设备的旧内容,而不是文件系统映像中的正确数据?

我的主要兴趣是 Linux 行为。(StackExchange 鼓励我提出一个具体问题。不过,我也可以对任何替代或历史行为投赞成票:-)。

linux cache buffer block-device

5
推荐指数
1
解决办法
2034
查看次数

Linux 如何确保在其他任何事情之前(例如在完全交换之前)从缓存 ext4 日志写入中回收无用的“缓冲区”

我的笔记本电脑往往有大约256MB算作“缓冲区”运行-中/proc/meminfofree -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)。

Linux页面缓存的相关细节

与“缓冲区”的行为相比,我更熟悉页面缓存的概念 -Cached/proc/meminfofree -w -h- 中。

我最近重新阅读了这个线程:Linux 内核中使用哪些页面替换算法用于 OS 文件缓存?

对未缓存文件页面的访问,例如复制未缓存文件时的读取和写入,缓存在“非活动”LRU 列表中。当从页面缓存中回收内存时,内核更喜欢从最近最少使用的“非活动”页面开始。它比“活动”页面更喜欢这些页面,“活动”页面是被多次访问的页面,即使它们可能更旧。

特别要注意,这允许您运行任意大的文件副本,而无需换出所有正在运行的程序。您正在运行的程序的所有重要内存页面都在“活动”列表中,因为重要页面将被多次访问。

这是 Linux 内存管理复杂性的第一个近似值。我在这里使用了一些模糊的词,比如“偏好”,因为我不是这些复杂性的专家。

理想情况下,我希望在回收任何页面缓存之前首先回收任何不必要的“缓冲区”。(如果您将“缓冲区”计为页面缓存的一部分,您应该理解我希望在任何缓存的常规文件之前回收任何不必要的“缓冲区”)。

所以我很好奇。在任何“非活动”页面缓存之前,是否会回收不必要的“缓冲区”?或者我只能说它们倾向于在“活动”页面缓存之前被回收?或者在我们与页面缓存进行任何比较之前,是否有更多细节必须解释?

linux memory cache ext4

5
推荐指数
1
解决办法
732
查看次数

进行大量磁盘 I/O 时,Linux GUI 变得非常无响应 - 要调整什么?

我有一个/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?如果是这样,如何?

版本信息:

  • 这是一个 Fedora 29 (4.19.15-300.fc29.x86_64) 系统,但我知道我在早期的 Fedora 系统中也有这个问题。
  • KDE 版本基于“KDE Frameworks: 5.53.0”。

更新

感谢大家到目前为止的答案!

一旦知道要搜索什么,就会发现一些东西。

我拖进来的东西:

linux performance cache

5
推荐指数
1
解决办法
981
查看次数