我目前正在通过网络复制大量文件。为了监控进度,我尝试运行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
答案4
(语境)我正在使用 Docker / SilverStripe 环境,在尝试调用时经常遇到此异常http://example.com/dev/build/?flush=all(重建数据库并清除缓存)。
rm: cannot remove '.nfs00000001004173880000002c': Device or resource busy
我了解到我可以在终端(Docker 外部)导航到该目录并手动删除该文件。但反复这样做会导致我遇到同样的缓存问题,ls -hal
即使文件存在(并且无法删除),也会显示一个空目录。
长话短说:就我而言,我可以用来cd .
更新终端...或删除其缓存或其他内容。