标签: cache

是否有必要显式刷新 HDD 磁盘写入缓存?

抽象的

有时,Linux 内核不知道外部 USB 存储设备的驱动器写入缓存。在这种情况下是否有必要在分离这些设备之前显式刷新这些缓存?

例子

我使用 WD Elements 外置 USB 硬盘,上面hdparm -I写着

...
Commands/features:
    Enabled Supported:
       ...
       *    Write cache
...
Run Code Online (Sandbox Code Playgroud)

hdparm -W

...
 write-caching =  1 (on)
Run Code Online (Sandbox Code Playgroud)

另一方面,当我插入驱动器时,我收到以下内核消息:

... No Caching mode page found
... Assuming drive cache: write through
Run Code Online (Sandbox Code Playgroud)

根据Kyle Jones 的这个回答,这些内核消息表明内核假设它的写操作将直接进入盘片。

Linux 内核文档中的文件Documentation/block/queue-sysfs.txt 的“write_cache (RW)”部分描述了内核假设通过缓存写入模式的含义(感谢Wayne Conrad):

...“直写”,...还将消除内核发出的缓存刷新。

问题

到目前为止,我从 Linux 系统分离外部 USB 存储设备的标准方法是卸载它上所有已安装的分区,等到驱动器的 LED 停止闪烁,物理拔下 USB 连接器,如果这不会关闭电源设备(有些具有单独的电源),以明确关闭电源。

这种方法是否安全,或者它是否意味着在驱动器写入缓存中丢失未刷新数据的风险,特别是如果内核不知道该缓存?

在后一种情况下,似乎建议在卸载后通过发送 SCSI 同步命令显式刷新驱动器上的写入缓存。例如sg_sync,可以使用 sg3-utils 附带的 which来完成: …

linux command-line cache usb unmounting

12
推荐指数
1
解决办法
2334
查看次数

DNS 查询不使用 nscd 进行缓存

我正在尝试使用 nscd(Nameservices Cache Daemon)在本地缓存 DNS,这样我就可以停止使用 Bind 来做到这一点。我已经开始使用它并且 ntpd 似乎尝试使用它。但是主机的其他一切似乎都忽略了它。例如,如果我挖 apache.org 3 次,它们都不会命中缓存。我正在查看缓存统计信息nscd -g以确定它是否已被使用。我还提高了调试日志级别,看看我是否可以看到它命中并且查询甚至没有命中 nscd。

配置文件

# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files

publickey: files

hosts: cache files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

netgroup: files
# End /etc/nsswitch.confenter code here
Run Code Online (Sandbox Code Playgroud)

配置文件

#
# /etc/nscd.conf
#
# An example Name Service Cache config file.  This file is needed by nscd.
#
# Legal entries are:
#
#       logfile                 <file>
#       debug-level             <level> …
Run Code Online (Sandbox Code Playgroud)

linux arch-linux cache dns

11
推荐指数
2
解决办法
4万
查看次数

没有缓存模式页面是一个严重的错误吗?

我的服务器日志以红色显示以下错误消息:

kernel:  sda: sda1 sda2
kernel: sd 0:1:0:0: [sda] No Caching mode page found
kernel: sd 0:1:0:0: [sda] Assuming drive cache: write through
kernel: sd 0:1:0:0: [sda] Attached SCSI disk
Run Code Online (Sandbox Code Playgroud)

我正在使用具有 RAID 1 配置的希捷硬盘 ST3300657SS。我已经阅读了这个问题的答案,其中提到:

在您的情况下,设备没有缓存模式页面,因此内核假设没有缓存读取或缓存写入,因此写入设备将是“直写”,即将直接进入媒体.

此错误是否是需要纠正的硬件问题?

cache hard-disk

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

GNU OS 中的缓冲(命名)管道

在 GNU OS 中,如果另一个进程同时读取相同的数据(从同一管道),则进程只能将数据写入管道。

是否有类似管道的东西可以让第一个进程写入并缓冲数据,直到第二个进程读取它?

linux cache gnu buffer fifo

11
推荐指数
2
解决办法
5917
查看次数

“缓存”内存实际上是免费的吗?

运行时cat /proc/meminfo,您会在顶部获得这 3 个值:

MemTotal:        6291456 kB
MemFree:         4038976 kB
Cached:          1477948 kB
Run Code Online (Sandbox Code Playgroud)

据我所知,“Cached”值是 Linux 系统制作的磁盘缓存,如果任何应用程序需要更多 RAM,它将立即释放,因此 Linux 永远不会耗尽内存,直到 MemFree 和 Cached 都为零。

不幸的是,/proc/meminfo 没有报告“MemAvailable”,可能是因为它在虚拟服务器中运行。(内核版本为 4.4)

因此,出于所有实际目的,可用于应用程序的 RAM 是 MemFree + Cached。

这种观点正确吗?

linux memory cache meminfo

11
推荐指数
1
解决办法
1879
查看次数

冷缓存和热缓存概念是什么意思?

我读了一篇论文,它使用了“冷缓存”和“热缓存”这两个术语。冷缓存和热缓存概念是什么意思?我访问了这个,但我需要更多的东西。

filesystems cache

10
推荐指数
2
解决办法
8132
查看次数

如何知道 dm-cache 缓存了什么?

我已经成功使用 dm-cache 很长一段时间了。现在我想知道缓存中当前有哪些文件。我知道 dm-cache 使用块,而不是文件,但是由于上面有一个文件系统,理论上应该可以将其转换为被缓存的(部分)文件。

当然,我关心一个实用的解决方案:如何列出 dm-cache 中当前的内容?

linux cache ssd

10
推荐指数
1
解决办法
439
查看次数

如何禁用处理器的 L1 和 L2 缓存?

是否可以在 Ubuntu 14.04(最好使用 Python 等高级语言)上禁用 L1 和/或 L2 缓存?如果是这样,如何?

另外,在不同的架构之间禁用缓存会不会有很大的不同?如果是这样,我对 ARM Cortex-A15 更感兴趣。

编辑

在研究如何禁用缓存时,我确实从kernel.org 文档中找到了 /proc/sys/vm/ 中的“drop_caches”文件

“写入此内容将导致内核丢弃干净的缓存,以及可回收的平板对象,如 dentries 和 inode。一旦丢弃,它们的内存就会变得空闲。”

...

“这个文件不是控制各种内核缓存(inode、dentries、pagecache 等)增长的手段。当系统其他地方需要内存时,内核会自动回收这些对象。”

这似乎不是我正在寻找的,因为这不仅看起来不会禁用缓存,而且我认为虚拟内存驻留在操作系统中而不是硬件上。我的目标是禁用缓存,因此必须在其他地方寻找所需的内存,例如在 RAM 中。

编辑

澄清一下,我了解禁用缓存会对系统产生什么影响。但是,它是空间应用中常用的一种技术,可以提高安全关键应用的可靠性。以下是一些记录这种现象的资源:

通过高速缓存减少嵌入式软件辐射引起的故障

空间辐射环境中微处理器的地面辐射测试指南

甚至还有关于这个主题的书:

电子产品中的电离辐射效应:从存储器到成像器

linux ubuntu cache arm python

10
推荐指数
1
解决办法
7352
查看次数

zcache 的替代方案是什么?

我想使用高速交换设备或zram作为“页面缓存”,以便在系统内存不足时自动删除页面数据。

显然,zcache已经停产了。有没有可用的替代方案?如果是,是哪一个?

bcache 当没有可用内存时,似乎不会丢弃数据。

cache swap zram linux-kernel

10
推荐指数
1
解决办法
3789
查看次数

有没有人听说过(制作技巧)基于本地硬盘驱动器的 NFS 缓存?(主要在 FreeBSD 中)

问题:当通过 NFS 启动二进制文件(例如 /usr/bin)时,例如在网络引导系统中,NFS 可能会很慢。RAM 缓冲区缓存可能不足以避免缓慢。

想法:似乎我们应该能够拥有一个本地磁盘缓存,它可以在从 NFS 中提取文件时将文件保存在本地。

问题:有没有人在任何 UNIX 系统上看到过类似的东西?

背景:

在 FreeBSD 中,有很多使用 unionfs 来构建惊人的堆叠文件系统的好方法。我目前在 AWS 上有一个系统,它只使用 1 GB 的磁盘,因为它通过 NFS 挂载了大部分 /usr 文件系统树。在过去,您可以轻松做到这一点,因为 /usr 不是基本引导所必需的。现在它更难了(尤其是在 AWS 上,在启动失败时你无法跳出控制台)但我通过从本地驱动器上的 /usr 树中获取最少必要的东西来进行管理,然后,当网络启动时,我在 /usr 树上挂载 NFS。

我什至有一个后门,我仍然可以在其中写入底层最小本地硬盘驱动器 /usr 树,以防我需要更新正在运行的系统上的某些内容。

真漂亮。

除了 NFS (Amazon EFS) 非常慢。并且缓冲区缓存工作得不够好。例如,用于管理 AWS 资源的 aws 命令行界面使用 Python,每次调用 aws 命令时都会吸入大量包含。运行一个简单的 aws CLI 命令需要 20 秒。即使重复运行它,您也会认为缓存、NFS 属性缓存等可能会有所帮助,但事实并非如此。

可能的解决方案(在 FreeBSD 上):

所以我想做的是在 NFS 层之上放置另一个 unionfs 层,它是一个基于本地磁盘的 UFS 文件系统。但它会在启动时开始为空,然后,每次我们从 NFS 加载任何内容时(假设现在它是稳定的二进制文件,而不是动态更新的数据),它会在磁盘上留下一个副本。

此解决方案的实施:

所以这就是我认为应该做的。在/usr/src/sys/fs/unionfs/union_vnops.c我们有这个非常简单的代码:

static int
unionfs_open(struct …
Run Code Online (Sandbox Code Playgroud)

freebsd cache nfs unionfs

10
推荐指数
1
解决办法
205
查看次数