有时,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来完成: …
我正在尝试使用 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) 我的服务器日志以红色显示以下错误消息:
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。我已经阅读了这个问题的答案,其中提到:
在您的情况下,设备没有缓存模式页面,因此内核假设没有缓存读取或缓存写入,因此写入设备将是“直写”,即将直接进入媒体.
此错误是否是需要纠正的硬件问题?
在 GNU OS 中,如果另一个进程同时读取相同的数据(从同一管道),则进程只能将数据写入管道。
是否有类似管道的东西可以让第一个进程写入并缓冲数据,直到第二个进程读取它?
运行时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。
这种观点正确吗?
我读了一篇论文,它使用了“冷缓存”和“热缓存”这两个术语。冷缓存和热缓存概念是什么意思?我访问了这个,但我需要更多的东西。
我已经成功使用 dm-cache 很长一段时间了。现在我想知道缓存中当前有哪些文件。我知道 dm-cache 使用块,而不是文件,但是由于上面有一个文件系统,理论上应该可以将其转换为被缓存的(部分)文件。
当然,我关心一个实用的解决方案:如何列出 dm-cache 中当前的内容?
是否可以在 Ubuntu 14.04(最好使用 Python 等高级语言)上禁用 L1 和/或 L2 缓存?如果是这样,如何?
另外,在不同的架构之间禁用缓存会不会有很大的不同?如果是这样,我对 ARM Cortex-A15 更感兴趣。
编辑
在研究如何禁用缓存时,我确实从kernel.org 文档中找到了 /proc/sys/vm/ 中的“drop_caches”文件
“写入此内容将导致内核丢弃干净的缓存,以及可回收的平板对象,如 dentries 和 inode。一旦丢弃,它们的内存就会变得空闲。”
...
“这个文件不是控制各种内核缓存(inode、dentries、pagecache 等)增长的手段。当系统其他地方需要内存时,内核会自动回收这些对象。”
这似乎不是我正在寻找的,因为这不仅看起来不会禁用缓存,而且我认为虚拟内存驻留在操作系统中而不是硬件上。我的目标是禁用缓存,因此必须在其他地方寻找所需的内存,例如在 RAM 中。
编辑
澄清一下,我了解禁用缓存会对系统产生什么影响。但是,它是空间应用中常用的一种技术,可以提高安全关键应用的可靠性。以下是一些记录这种现象的资源:
甚至还有关于这个主题的书:
问题:当通过 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) cache ×10
linux ×6
arch-linux ×1
arm ×1
buffer ×1
command-line ×1
dns ×1
fifo ×1
filesystems ×1
freebsd ×1
gnu ×1
hard-disk ×1
linux-kernel ×1
meminfo ×1
memory ×1
nfs ×1
python ×1
ssd ×1
swap ×1
ubuntu ×1
unionfs ×1
unmounting ×1
usb ×1
zram ×1