我的工作负载在短时间内具有极高的写入突发率。目标磁盘相当慢,但我有足够的 RAM 并且非常能容忍瞬时数据丢失。
我尝试调整 vm.dirty_ratio 以最大限度地利用用于脏页的可用 RAM 空间。
# free -g
total used free shared buff/cache available
Mem: 251 7 213 3 30 239
Swap: 0 0 0
# sysctl -a | grep -i dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 90000
vm.dirty_ratio = 90
Run Code Online (Sandbox Code Playgroud)
但是,我似乎仍然遇到一些基于底层磁盘速度的写回限制。我怎样才能禁用这个功能?
# dd if=/dev/zero of=/home/me/foo.txt bs=4K count=100000 oflag=nonblock
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 10.2175 s, 40.1 MB/s
Run Code Online (Sandbox Code Playgroud)
只要有空闲内存并且脏率尚未超过 - 我想全速写入页面缓存。
为了清除缓存,我通常调用
# echo 3 | tee /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
这需要 root 权限。为什么我需要偶尔这样做?因为它会对我的一些程序的运行时产生巨大的影响。我的问题是:如果没有超级用户权限,我该如何做到这一点,特别是这两种情况:
1)我/用户没有root权限。系统管理员可以做些什么来允许普通用户运行上面的命令吗?
2) 对删除缓存的调用来自 shell 脚本内,并且不能以超级用户权限运行整个脚本。例如,因为此脚本中有多个调用“mpirun”的实例,所以实际上不应该以 root 身份运行。尽管只有几行实际上需要它,但以 root 身份运行脚本中的所有内容对我来说似乎不是一个好的做法。
编辑:忘记提及:以上命令仅在以 root 身份登录时有效。否则命令将是echo 3 | sudo tee /proc/sys/vm/drop_caches
我知道 acachepool和之间的区别cachevol。
Cachepool将缓存数据和元数据分成两个单独的卷,而 aCachevol对两者使用单个卷。
cachepool我的问题是,使用 a而不是仅使用 a有什么好处cachevol?我能想到的唯一最有意义的情况是,如果您想将单个设备(或一组设备)专用于缓存的元数据,并将一个单独的设备(或一组设备)用于实际缓存数据。但这似乎是一个非常具体的场景,而且它也没有解决以下问题:Why?
为什么大多数人默认使用 acachepool而不是 a cachevol,尤其是。当一台设备用于缓存时?
cachepool使用vs的动机/利弊是什么cachevol?
编辑就上下文而言,这个问题背后的动机来自cachepool于保守设置(如家庭服务器和台式机)中使用的假设,仅仅是因为人们遵循的指南和教程是从企业用例中滴下来的。
cachepool除了工具支持之外,并且仅基于vs的优点cachevol,是否有任何具体原因(性能、实施等...)来激励人们提倡呢cachepool?或者它只是企业涓滴现象的受害者?
如果后者是正确的,那么考虑更保守的设置可能是合理cachevol的,而不是cachepool考虑是否不需要cachepool设置的灵活性和复杂性。
我正在运行 openSUSE TW、32 GiB RAM、64 GiB 交换 (SSD)。
在 RAM 完全被缓存填满之前,交换空间的使用量为零。
我正在使用 htop 来监控它。黄色/橙色 = 缓存
我的系统将使用 2 GiB 的 RAM,但其余的(30 GiB)都是缓存,然后,不是在需要时丢弃一些缓存来为其他数据腾出空间 - 它开始使用交换,只有几个 MiB,但我我发誓我会注意到轻微的冻结,并且系统有时会明显变慢。
这是为什么?我能做什么?
我愿意提供任何要求的信息。
vm.swappiness = 1
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
Run Code Online (Sandbox Code Playgroud) 在某些程序中,复制大文件的百分比非常快地达到 100%,然后在进行下一步之前我要等待更多。
它是由缓冲区引起的。如何查看将要写入的数据量?
在Ubuntu系统下,有没有查找命令:
我有一台 8 GB RAM 的服务器
内存:
总计 8031464
使用的 5146344
免费 2885120
如果我执行
# df
Run Code Online (Sandbox Code Playgroud)
它总是返回这个
tmpfs 4015732 0 4015732 0% /dev/shm
Run Code Online (Sandbox Code Playgroud)
我有 4GB 未使用 RAM(全天使用 0%),这意味着什么?
还有一些与 /dev/shm 有关的其他疑问,请;
如果我看到全天使用率为 0%,我是否应该减少 /dev/shm 大小,例如从 4GB 减少到 1GB?
如果是,如何减少 /dev/shm 的大小?
我可以使用这个内存位置 /dev/shm 来符号链接一些具有大量 IOwait (磁盘使用)的文件夹吗?
谢谢
我最近检查了一个几乎完全挂起的 RHEL7.2,因为它写入了 CIFS 文件系统。dirty_ratio = 30和 cifs的默认设置被缓存(用于读取和写入),这些脏页大多是 cifs 的。
在内存压力下,当系统回收大部分读缓存时,系统顽固地尝试刷新和回收脏(写)缓存。所以情况是一个巨大的 CPU iowait 伴随着极好的本地磁盘 I/O 完成时间,D 中的许多进程不间断等待和一个完全无响应的系统。OOM杀手从来没有从事过,因为是免费的内存系统没有给出来。(我认为 CIFS 也有一个错误,它使刷新速度慢得令人难以置信。但别介意这里。)
我惊讶地发现内核处理刷新页面到一些慢速远程 CIFS 盒的方式与处理超快速本地 SSD 驱动器完全相同。拥有一个dirty_ratio包是不明智的,它很快就会导致 30% 的 RAM 包含来自最慢设备的脏数据的情况。真是浪费钱。
这种情况是可重现的;设置dirty_ratio = 1彻底解决问题。但是为什么我需要因为使用cifs挂载而牺牲本地磁盘的缓存?
除了完全禁用某些设备的缓存或设置vm.dirty_ratio为非常低的值之外,还有什么方法可以将快速设备“列入白名单”以获得更多写入缓存?或者让慢速设备(或像 //cifs/paths 这样的远程“设备”)使用更少的写缓存?
RHEL 7.2 的内核版本称为 3.10.0-327。(它基于 3.10.0,但包括数年的向后移植)。