作为进行一些冷缓存计时的一部分,我正在尝试释放操作系统缓存。该内核文档(检索2019日)说:
drop_caches
Writing to this will cause the kernel to drop clean caches, as well as
reclaimable slab objects like dentries and inodes. Once dropped, their
memory becomes free.
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches
This is a non-destructive operation and will not free any dirty objects.
To increase the number of objects freed …Run Code Online (Sandbox Code Playgroud) 我想从一个本地驱动器到另一个本地驱动器制作大量文件的全新副本。
我读过 rsync 在通过网络将文件发送到远程机器时对文件进行校验和比较。
在两个本地驱动器之间复制文件时,rsync 会进行比较吗?
如果它确实进行了验证 - 这是一个安全的赌注吗?还是逐字节比较更好?
我有一台带有8 GB RAM 和 16 GB 交换的 Debian (Buster) 笔记本电脑。我正在运行一个很长的运行任务。这意味着我的笔记本电脑在过去六天里一直处于运转状态。
这样做时,我需要定期将笔记本电脑用作笔记本电脑。这应该不是问题;长时间运行的任务受 I/O 限制,处理 USB 硬盘上的内容,并且不占用太多 RAM (<200 MB) 或 CPU (<4%)。
问题是当我在几个小时后回到我的笔记本电脑时,它会非常缓慢,可能需要 30 分钟才能恢复正常。这太糟糕了,以至于崩溃监视器将它们各自的应用程序标记为已冻结(尤其是浏览器窗口),并且事情开始错误地崩溃。
查看系统监视器,大约一半使用的 2.5 GB 被转移到交换中。我已经通过删除交换空间 ( swapoff /dev/sda8) 来确认这是问题所在。如果我在没有交换空间的情况下离开它,即使在 24 小时后它也几乎立即恢复生机。使用交换,前五分钟实际上是一块砖,只剩下六个小时。我已经确认即使我不在时内存使用量也不会超过3 GB。
我尝试将swappiness(另见:维基百科)减少到10和的值0,但问题仍然存在。似乎在一天不活动后,内核认为不再需要整个 GUI 并将其从 RAM 中擦除(将其交换到磁盘)。长时间运行的任务是读取庞大的文件树并读取每个文件。因此,内核可能会误以为缓存会有所帮助。但是在一次扫描具有约 10 亿个文件名的 2 TB USB 硬盘时,额外的 GB RAM 不会对性能有太大帮助。这是一款价格低廉的笔记本电脑,硬盘速度很慢。它根本无法足够快地将数据加载回 RAM。
如何告诉 Linux 仅在紧急情况下使用交换空间?我不想在没有交换的情况下运行。如果发生意外情况,并且操作系统突然需要额外的几 GB,那么我不希望任务被杀死,而是希望开始使用交换。但目前,如果我启用交换,我的笔记本电脑就无法在需要时使用。
“紧急情况”的确切定义可能是一个有争议的问题。但要澄清我的意思:紧急情况是系统除了交换或终止进程之外别无选择。
什么是紧急情况?-你真的要问吗?...我希望你永远不会发现自己在燃烧的建筑物中!
我不可能在这个问题中定义可能构成紧急情况的所有内容。但是,例如,紧急情况可能是当内核被如此推入内存以至于它开始使用OOM Killer杀死进程时。当内核认为它可以通过使用交换来提高性能时,不是紧急情况。
最终编辑: 我已经接受了一个答案,该答案正是我在操作系统级别所要求的。未来的读者还应该注意提供应用程序级解决方案的答案。
经典情况:我跑得不好rm,之后立即意识到我删除了错误的文件。(没什么重要的,我最近的备份还算可以,但还是很烦人。)
知道如果我想使用extundelete或此类工具恢复文件,进一步的磁盘活动是我的敌人,我立即关闭了机器的物理电源(即,使用电源按钮,而不是使用halt或任何此类命令)。这是一台没有运行重要任务或任何打开的笔记本电脑,所以这是一个可以接受的操作。(顺便说一下,从那时起我了解到在这种情况下要做的第一件事是首先估计丢失的文件是否仍然可以被进程打开https://unix.stackexchange.com/a/101247 --如果是,您应该通过这种方式恢复它们,而不是关闭机器。)
尽管如此,一旦机器断电,我想了一会儿,并认为这些文件不值得花时间启动实时系统进行适当的取证。所以我重新启动了机器。然后我发现我的文件仍然位于磁盘上:rm在我关闭电源之前还没有传播到磁盘。我跳了一小段舞,感谢系统管理员之神出人意料的宽恕。
我现在的问题是要了解这是如何可能的,以及rm实际传播到磁盘之前的典型延迟是多少。我知道磁盘 IO 不会立即刷新,而是在内存中停留了一段时间,但我认为磁盘日志会很快确保挂起的操作不会完全丢失。https://unix.stackexchange.com/a/78766似乎暗示了一种单独的机制来刷新脏页和刷新日志操作,但没有提供足够的细节来说明日志将如何参与 arm以及之前的预期延迟操作被刷新。
更多细节:数据位于 LUKS 卷内的 ext4 分区中,在启动机器备份时,我看到以下内容syslog:
Sep 24 10:24:58 gamma kernel: [ 11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [ 11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [ 11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
Run Code Online (Sandbox Code Playgroud)
但我不相信它与rm.
另一个问题是是否有办法告诉内核不要执行任何挂起的磁盘操作(而是将它们转储到某处),而不是关闭机器电源。(当然,不执行挂起的操作听起来很危险,但这就是在关闭机器电源时会发生的情况,并且在某些情况下它可以拯救您。)当然,这将是“更干净”,也很有趣例如,对于物理断电不是一个简单选择的远程服务器。
因此,我正在尝试对交换使用率高的系统中交换使用的来源进行一些调查:
# free
total used free shared buffers cached
Mem: 515324 508800 6524 0 4852 27576
-/+ buffers/cache: 476372 38952
Swap: 983032 503328 479704
Run Code Online (Sandbox Code Playgroud)
添加每个进程使用的交换:
# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0 /bin/gawk
0 /bin/sort
0 /usr/bin/readlink
28 /sbin/xxxxxxxx
52 /sbin/mingetty
52 /sbin/mingetty
52 /sbin/mingetty
52 /sbin/mingetty
56 /sbin/mingetty
56 /sbin/mingetty
60 /xxxxxxxxxxx
60 /usr/sbin/xxx
84 /usr/sbin/xxx
108 /usr/bin/xxx
168 /bin/bash
220 …Run Code Online (Sandbox Code Playgroud) 
是否有任何命令可以通过使用我可以清除 RHEL 中的缓存?
我使用了这个命令:
sync; echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
但它没有用。
对于像 1GBwc -l这样的非常大的文件来说,速度很慢。我们是否有更快的方法来计算特定文件的换行数?
每当我重新启动我的笔记本电脑时,一切都运行得惊人,而且我的内存使用率最高为 40%(超过 8GB)。然而,随着时间的推移(使用约 1 天),内存使用率上升到 90% 以上,并且系统开始交换。
现在,free -mh返回这个:
total used free shared buff/cache available
Mem: 7,7G 1,3G 141M 223M 6,3G 246M
Swap: 7,5G 530M 6,9G
Run Code Online (Sandbox Code Playgroud)
我假设如果进程需要,可以自由地重新分配 buff/缓存内存,但它似乎大多不可用。
cat /proc/meminfo:
MemTotal: 8055268 kB
MemFree: 145184 kB
MemAvailable: 247984 kB
Buffers: 49092 kB
Cached: 423724 kB
SwapCached: 38652 kB
Active: 881184 kB
Inactive: 791552 kB
Active(anon): 708420 kB
Inactive(anon): 725564 kB
Active(file): 172764 kB
Inactive(file): 65988 kB
Unevictable: 252 kB
Mlocked: 252 kB
SwapTotal: 7812092 kB
SwapFree: 7267624 …Run Code Online (Sandbox Code Playgroud) 在 Mac 中,我purge用来释放一些内存。在 Linux(Ubuntu 服务器)中相当于什么?apt-get install purge什么也没给我。如果您不熟悉 Mac,请purge访问它的man页面:
purge(8) BSD System Manager's Manual purge(8)
NAME
purge -- force disk cache to be purged (flushed and emptied)
SYNOPSIS
purge
DESCRIPTION
Purge can be used to approximate initial boot conditions with a cold disk
buffer cache for performance analysis. It does not affect anonymous mem-
ory that has been allocated through malloc, vm_allocate, etc.
SEE ALSO
sync(8), malloc(3)
September 20, 2005
Run Code Online (Sandbox Code Playgroud) linux ×5
memory ×5
linux-kernel ×2
swap ×2
ubuntu ×2
cache ×1
command-line ×1
journaling ×1
rhel ×1
rm ×1
rsync ×1
top ×1
verification ×1
wc ×1