标签: cache

如何禁用处理器的 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
查看次数

为什么缓存交换有意义?

缓存被换出的页面对我来说听起来很适得其反。如果交换页面,首先将它们缓存在内存中,然后再将它们移动到正确的位置有什么好处?即使页面被主动换入,“只是”换入不是更有意义吗?实际上缓存交换不只是浪费资源吗?

kernel cache swap algorithms

9
推荐指数
1
解决办法
1410
查看次数

如何准确计时grep命令?

我想比较这两个命令的速度:

grep pattern1 files* 
grep pattern2 files* 
Run Code Online (Sandbox Code Playgroud)

不幸的是,第一个 grep 将大量文件*读入内存缓冲区,因此第二个 grep 运行得非常快,但原因错误。

我如何告诉 Linux (Fedora 11):“请停止缓存磁盘读取,因为我正在测试一些东西。”

cache hard-disk measure

9
推荐指数
1
解决办法
2278
查看次数

Cleancache vs zram?

我这里有一台只有 512 MB 内存的旧笔记本电脑。由于一些内核版本,我使用zram将其中的 256 MB 转换为压缩的 ramdisk,然后用作交换。这已被证明是非常成功的,并且系统响应更快,(硬盘支持的)交换使用率大幅下降,这使系统之前变慢了。

从 linux 3.0 开始,内核还包含cleancache,它使用 zram 之类的东西作为后端应该透明地压缩页面缓存中的页面。据我所知,这与zram不同。

我应该在我的笔记本电脑上启用这两个功能吗?还是cleancache实际上取代了zram解决方案?

编辑:我找到了这个gentoo 论坛链接,在那里我似乎还必须启用CONFIG_ZCACHE它,然后让cleancache使用zram来获得类似于我以前的东西。所以似乎我启用了所有这些并且之后没有明确使用zram。有人可以证实这一点吗?

linux kernel cache swap zram

9
推荐指数
2
解决办法
7398
查看次数

为什么在 2013 年会报告“U 盘停顿”问题?为什么现有的“No-I/O 脏节流”代码没有解决这个问题?

有害的 USB 记忆棒停顿问题- LWN.net,2013 年 11 月。

Artem S. Tashkinov 最近遇到了一个问题,至少一些 LWN 读者会熟悉这个问题。将慢速存储设备(例如 U 盘或媒体播放器)插入 Linux 机器并向其写入大量数据。整个系统继续挂起,可能持续几分钟。

不过这一次,Artem 做了一个有趣的观察:系统在使用 64 位内核运行时会停顿,但在相同硬件上使用 32 位内核时没有遇到这样的问题。

文章解释说,对于 64 位内核,默认情况下允许脏页缓存(回写缓存)增长到内存的 20%。使用 32 位内核时,它实际上被限制在大约 180MB。

Linus 建议在 64 位上也将其限制为 ~180MB,但是当前的 Linux (v4.18) 没有这样做。将Linus 建议的补丁, 与Linux 4.18 中的当前功能进行比较。反对这种变化的最大论据来自 Dave Chinner。他指出,过多地减少缓冲会导致文件系统受到碎片化的影响。他还解释说,“对于流式 IO,我们通常需要至少 5 秒的缓存数据来平衡延迟。”

我很迷惑。优盘卡顿为什么会导致整个系统挂掉?

我很困惑,因为我读了一篇描述2011 年合并代码的早期文章(Linux 3.2)。它显示内核应该已经在每个设备的基础上控制脏页缓存:

无 I/O 脏节流- LWN.net, 2011

这就是Fengguang 的补丁集的用武之地。他试图创建一个控制循环,该循环能够确定在任何给定时间每个进程应该允许脏多少页。超出其限制的进程会被简单地休眠一段时间以允许写回系统赶上它们。

[...]

系统的目标是将脏页数保持在设定值;如果事情变得不合时宜,就会施加越来越大的力量,将事情带回应有的位置。

[...]

但是,如果不考虑支持设备 (BDI),则无法真正计算出该比率。一个进程可能正在弄脏存储在给定 BDI …

linux cache

9
推荐指数
1
解决办法
1164
查看次数

使用“dd”写入块设备时,是否证明需要“同步”?

每次我将文件写入空的原始块设备时,例如

# dd if=image.iso of=/dev/sdb status=progress
Run Code Online (Sandbox Code Playgroud)

我从未使用过任何类型的sync(即sync; conv=fsync; conv=fdatasync; oflag=sync; oflag=dsync)。

我注意到,dd没有永远退出,直到所有的写作完成。

我总是使用 Conky 的 I/O 工具和grep Dirty /proc/meminfo. 此外,设备的校验和始终与写入它的文件的校验和相匹配。所以我总是 100% 确定整个文件已写入设备。

我已将文件写入 ext4 卷进行比较。例如使用:

$ dd if=/dev/urandom of=~/file bs=1M count=50 iflag=fullblock
Run Code Online (Sandbox Code Playgroud)

写入 ext4 卷时,dd退出后在数据实际写入磁盘之前总是有大约 20 秒的延迟。

许多人提倡在sync命令后使用dd命令,或者在写入块设备时syncdd命令中包含几个选项之一。例如这里这里。但是,我不知道有人真正证明这是必要的。

此页面上的评论之一是:

sync在这里毫无意义[即直接写入/dev/sdX]。它只影响文件系统操作。

有五个人对这条评论投了赞成票,这与我的经验一致。

那么在写入块设备时,有没有dd在所有写入完成之前退出的情况?这真的发生在任何人身上吗?

其他书写选项如何,例如cpcat …

linux cache dd synchronization block-device

9
推荐指数
1
解决办法
1248
查看次数

为什么在覆盖文件时关闭文件等待同步,而不是在创建时?

运行此脚本时:

#!/usr/bin/env python3
f = open("foo", "w")
f.write("1"*10000000000)
f.close()
print("closed")
Run Code Online (Sandbox Code Playgroud)

我可以在我的 Ubuntu 机器上观察到以下过程:

内存充满 10GB。页面缓存填充了 10GB 的脏页面。(/proc/meminfo) 打印“关闭”并且脚本终止。一段时间后,脏页减少。

但是,如果文件“foo”已经存在,close() 会阻塞,直到所有脏页都被写回。

这种行为的原因是什么?

如果文件不存在,这是 strace:

openat(AT_FDCWD, "foo", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
ioctl(3, TCGETS, 0x7ffd50dc76f0)        = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR)                   = 0
ioctl(3, TCGETS, 0x7ffd50dc76c0)        = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_CUR)                   = 0
mmap(NULL, 10000003072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcd9892e000
mmap(NULL, 10000003072, …
Run Code Online (Sandbox Code Playgroud)

cache ext4 files

9
推荐指数
1
解决办法
198
查看次数

Linux 缓存驱逐

查看我的 Linux 机器上 VFS 缓存的行为,我可以看到,即使在有效空闲时(crond 和大多数其他守护程序停止,接口关闭),可用内存量也会逐渐增加,这意味着项目正在从缓存中逐出。

我做了很多谷歌搜索,但找不到任何关于如何控制的参考(除非它是 vm_swappiness 的副作用)。任何人都可以让我走上正确的道路来理解为什么在不需要新内存分配的情况下会从缓存中逐出项目?

linux cache vfs

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

使 debian “apt”(新的 apt-get / aptitude 前端)缓存 .deb 文件在 '/var/cache/apt/archives/'

在当前(2018-06)Debian的SID,通过安装.deb软件包apt-getaptitudesynaptic在缓存下载的软件包/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以保留下载的文件?

aptitude cache debian apt

8
推荐指数
1
解决办法
1666
查看次数

使用 LVMCache 或 BCache 进行热-温-冷缓存

我最近用三种不同的驱动器重新配置了我当前的 Debian 机器:SLC SSD、QLC SSD 和 4TB HDD。我一直在尝试lvmcache其他实用程序,我想知道是否可以创建一个多层缓存解决方案,利用两个 SSD 进行不同级别的缓存。

我的乌托邦结构是这样的:

  • SLC SSD(最快、可靠性高):用于经常写入和读取的文件的热缓存
  • QLC SSD(快速、可靠性良好):用于写入和读取频率较低的(可能较大)文件的热缓存
  • HDD(慢速、高可靠性):冷存储,用于不经常写入或读取的文件

lvmcache不幸的是,我还没有发现太多允许在或bcache(或者实际上是其他任何地方)中进行此类配置的多层缓存功能。

是否可以lvmcache这样bcache配置?如果没有,是否还有其他解决方案可以实现这种配置?

cache lvm bcache ssd-hdd-hybrid

8
推荐指数
1
解决办法
693
查看次数