我很清楚旋转盘式硬盘有一个板载控制器和一个板载磁盘缓存。
现在,“磁盘”缓存是否也存在于(4 GB 或 8 GB)USB 记忆棒上?顺便问一下,固态硬盘怎么样?
(我的猜测是,因为固态硬盘比它所连接的计算机的 RAM 慢,所以在固态硬盘上安装板载磁盘缓存是有意义的。但是因为 USB 记忆棒的字节数要小得多,相对于固态硬盘的容量和物理尺寸,前者可能没有板载磁盘缓存。)
背景:我想找出:
如果/bin/sync操作系统报告写入操作完成后不久发生电源故障,Linux 上是否有必要绝对保证不会发生数据丢失?
是否/bin/mount -o sync ...会“有效”禁用这样的板载缓存(如果存在的话)?
最后,如果操作系统是 Windows 而不是 Linux,上述所有问题的答案会如何?
我最近买了一个 32GB 的SSD硬盘。众所周知,对于像 Windows 8 甚至 Windows 7 这样的现代 SO,32GB 根本不算什么,其中只有文件系统占据了整个空间的一半(大约 15GB)。
除了这个 SSD 驱动器之外,我还有另一个 320GB 7200rpm 的驱动器HD,我以前只用于 Windows 和程序文件。
我想知道是否有一种方法可以将这两种技术结合起来构建我自己的混合磁盘以增强我的电脑的性能。
我的意思是,我想使用 SSD 驱动器,就像另一个 HD 驱动器的缓存一样。
无论如何,这可能吗?
提前致谢。
想象一下我托管了一个网络服务器。为了加快速度,我使用了一个名为 Squid 的 http 缓存代理。鱿鱼实际上在哪里存储其缓存文件以及它会在那里保留多长时间?我在Linux系统上。
Virtualbox 文档说,将主机 io 缓存用于 sata 控制器可能存在系统性能风险。
同时,在我的情况下,我看到了使用主机 io 缓存的优势 - 当为 sata 控制器打开主机 io 缓存时,DisckCrystalMark 报告的性能提高了 10 倍。
我用谷歌搜索了很多,发现这个问题有点棘手,因为它取决于很多细微差别。如vdi类型、大小,可能是存储文件类型、大小、访问字符等。
可以说,我在来宾上有一个 CRM 应用程序,它使用基于文件的存储(270 个文件,3 GB 大小)。我是否应该向我的 VM 添加单独的 sata 控制器,然后为它打开主机 io 缓存,创建单独的 vdi(比如说 10 GB),将其连接到该“缓存控制器”,将 crm-app 文件存储移动到该磁盘?并留下具有主系统驱动器的未缓存控制器?
或者我可以在第一个 vm sata 控制器上打开整个系统的主机缓存?
每种情况的利弊是什么?
最后,使用或不使用主机 io 缓存的正确场景是什么?我什么时候应该使用主机 io 缓存而不会有麻烦?
PS:
主机:Ubuntu 14 服务器,68 GB RAM HDD Raid 1 Intel Xeon E5520 x 2(2 * 4 核)Virtualbox 4.3.30
来宾:Windows 2012R2 4 核、32 GB RAM、单个 SATA 控制器和单个 vdi 型标准磁盘。
关闭主机 io 缓存的结果是:
Sequential …Run Code Online (Sandbox Code Playgroud) 只要您有未使用的内存,Linux 和 OS X 就会从 RAM 中的磁盘缓存文件。有没有办法在 Windows 10 中做同样的事情?现在它正在尽最大努力通过压缩来将我的内存使用率始终保持在 33% 或 45%。
将临时文件放在 ramdisk 上是否会产生我想要的效果,尽管是静态大小?
我正在使用 rtorrent 下载安装在树莓派上的 SD 卡上的文件,速度约为 6MB/s(带宽上限)。用户进程本身不会刷新数据,刷新磁盘缓存的时间间隔取决于 sysctl 值。
使用 iostat 和 nload 我可以看到网络带宽和磁盘写入配置文件:
磁盘:
20M/s .....x.....x....xx...
.....x....xx....xx...
....xx....xx....xx...
0M/s ....xx....xx....xx...
Run Code Online (Sandbox Code Playgroud)
网络:
5M/s ..xxx....x.. x.....x.
.xxxx...xx..xxx...xxx
0M/s xxxxx...xxx.xxx...xxx
Run Code Online (Sandbox Code Playgroud)
显然,IO 写入器在刷新期间总是暂停。这是一个 4 核 CPU,其中 3 核永久空闲,并且在刷新期间 top 表示 100% iowait。
如果我while true; do sync; sleep 1; done在下载时这样做,磁盘刷新会以每秒 6MB 的速度平滑。并且下载器进程不会被阻塞,因此带宽是恒定的。
我可以通过以下方式获得相同的效果:
/proc/sys/vm/dirty_writeback_centisecs:
磁盘缓存刷新的频率 - 单位为 100 秒;默认值:500
以及/proc/sys/vm/dirty_expire_centisecs:
一个页面必须多大才能在 100 秒内刷新;默认值:3000
将它们分别设置为 100 和 200 可实现相同的均匀磁盘刷新配置文件和恒定的下载带宽。
有没有办法使这种调整自动进行,即尽可能频繁地刷新以避免阻塞写入进程?例如,如果下载速度为 1MB/s,那么每 5 秒刷新一次可能就足够了。
进程是否会在不同内核之间切换以提高性能?如果进程确实在内核之间跳转,那么内核之间共享哪些组件?L1-L3 缓存、寄存器还是内存?
我需要bash在 Cygwin 环境中对某些命令的速度进行基准测试,并确保我正在运行的测试不会命中 Windows 缓冲区或缓存。尽管我是在bash环境中进行基准测试,但我怀疑所有缓存都是由 Windows 本身完成的,而不是 Cygwin。
在基于Unix 的系统上,您可以执行以下操作来清除所有缓存和缓冲区:
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
这个命令在 Windows 上的等价物是什么?
根据Real World Technologies关于“英特尔的 Sandy Bridge 微架构”的文章:
“Sandy Bridge 的 uop 缓存被组织成 32 组和 8 路,每行 6 uop,总共 1.5K uop 容量。uop 缓存严格包含在 L1 指令缓存中。每行还保存元数据,包括行中有效 uop 的数量和对应于 uop 缓存行的 x86 指令的长度。映射到 uop 缓存的每个 32B 窗口可以跨越一组 8 路中的 3 条,最多 18 路 uop – 大约 1.8B/uop。如果一个 32B 的窗口有超过 18 个 uop,它就无法放入 uop 缓存中,必须使用传统的前端。微码指令不保存在 uop 缓存中,而是由指向微码 ROM 的指针和可选的前几个 uop 表示。”
'每个 32B 窗口(来自指令缓存)被映射到 uop 缓存中,可以跨越一组 8 路中的 3 路'
因此,假设我们有一个 32B 指令窗口,它将是 L1 指令缓存行的一半,在该行上,只有偏移位不同,但该行上所有字节的标记位和设置位都相同。
解码 32 字节窗口后,uop 将使用与用于从 L1 指令缓存中检索 …
现在,我们有一个简单的最近最少使用算法,一旦超过一定限制,它就会开始删除旧条目,而第二种算法在驱逐条目之前会考虑重用和年龄。
然而,当我在 Chrome 中测试具有重复请求的网站时,我注意到当缓存已满时,5 MB 的大文件会不断地从缓存中逐出,而较小的文件会保留缓存。
关于缓存驱逐的文档是否错误,或者该行为还有其他解释吗?
cache ×10
windows ×3
cpu-cache ×2
linux ×2
bash ×1
buffer ×1
cpu ×1
cygwin ×1
hard-drive ×1
http-proxy ×1
memory ×1
networking ×1
ramdisk ×1
rtorrent ×1
sata ×1
squid ×1
ssd ×1
sync ×1
usb ×1
virtualbox ×1
windows-10 ×1