如何防止 find、du、ls -R 缓存?

如何防止 find、du、ls -R 缓存?

我目前正在通过网络复制大量文件。为了监控进度,我尝试运行watch du。但是,输出从未改变(或者没有太大变化,不确定)。 find . -type f | wc -l总是给我与 相同的文件数量ls -R

看起来这些程序使用了缓存,这通常是一件好事。但是有人知道如何控制缓存的使用吗?

我在 Archlinux 系统上,并且在加密硬盘上处理 ext4 fs。

谢谢

答案1

ls 和同类命令不缓存其结果。相反,我怀疑 的输出du只是变化缓慢。(由于您的传输软件处理打开文件句柄的方式)。您也可以尝试完全删除文件系统缓存,尽管我认为这里没有多大意义:echo 1 | sudo tee /proc/sys/vm/drop_caches

为了更好地跟踪进度,您应该使用 rsync 进行传输并为其指定 -P 标志,这使得它在标准输出中打印进度。

答案2

你所指的缓存不是在用户空间;而是在 Linux核心inode 和 dentry 缓存。您可以通过调整 sysctl 参数来控制内核回收此缓存中使用的内存的速率vm.vfs_cache_pressure本文建议值为 10000。至于 Linux 缓存 [一致性] 本身,我无法给你一个明确的答案,但它可能不是问题所在。

此外,unbuffer用于缓冲(无缓冲、块缓冲或行缓冲)标准流。除非您通过网络传递 tarball 并在本地解压,或者将网络连接进程的输出重定向到文件系统,否则它可能(但不一定)与此无关。即便如此,除非这些程序使用具有巨大大小的块缓冲或二进制数据的行缓冲,并且您不幸在数据中没有单个 0x0d 或 0x0a,否则这应该无关紧要,因为您的数据量很大。此外,此缓存是库功能,而不是内核或程序功能。后者可能会设置参数。

Netstat 也只会列出未完成的网络连接,而不是其中正在发生的任何事。

您可以尝试strace -e trace=file运行该过程来查看它在做什么。

答案3

您可以尝试unbuffer附带的脚本expect

以下是 CVS 的解除缓冲脚本本身。看似简单。

监控数据传输的另一种选择是pv

答案4

(语境)我正在使用 Docker / SilverStripe 环境,在尝试调用时经常遇到此异常http://example.com/dev/build/?flush=all(重建数据库并清除缓存)。

rm: cannot remove '.nfs00000001004173880000002c': Device or resource busy

我了解到我可以在终端(Docker 外部)导航到该目录并手动删除该文件。但反复这样做会导致我遇到同样的缓存问题,ls -hal即使文件存在(并且无法删除),也会显示一个空目录。

长话短说:就我而言,我可以用来cd .更新终端...或删除其缓存或其他内容。

相关内容