我正在开展一个项目,使用以下命令查找.tar
系统上的所有安装文件:
time find / -type f \( -name "*.tar" -o -name "*.tar.*" \) 2>/dev/null | wc
第一次运行时我得到:
real 1m10.767s
第二次运行时我得到:
real 0m9.847s
我希望总是能得到第二次表演< 10 秒并放弃最初的表现1 分 10 秒find
. 避免第一次使用时被罚一分钟的最佳方法是什么?
笔记
- 您的初始速度
find
可能会更快,因为我有一个 Ubuntu 16.04 安装加上两个 Windows 10 安装,总共有 200 万个文件。 - 另一方面,你的初始速度
find
可能会慢一些,因为我有 Ubuntu 16.04 和 Windows 10 安装在三星 Pro 960 NVMe SSD额定速度为 3,000 MBps,而硬盘的额定速度为 140 MBps,优质 SSD 的额定速度为 400 MBps。 .tar
如果您想复制测试但系统上没有文件,请tar
在bashrc
以下部分中替换:-name "*.tar" -o -name "*.tar.*"
。
总结
find
删除可加快磁盘访问速度的 RAM 缓存
您可以在第一次/第二次性能测试之前调用这个小脚本来重复执行第一次/第二次性能测试find
:
#!/bin/bash
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
GIF 显示 RAM 磁盘缓存消耗了多少
find
运行的命令将/
消耗大约 500 MB 的缓存缓冲区,如下.gif
所示:
^^^--- 请注意,终端窗口下方的内存行显示从 4.74 GiB 下降到 4.24 GiB。peek
屏幕录像机保存文件并关闭后,内存实际上下降到 4.11 GiB。在我的系统上,find
磁盘缓存使用了大约 5% 的 RAM。
答案1
具有挑战性的项目
以下部分是应该可以工作但实际上不起作用的内容。最后,唯一“万无一失”的方法是使用这个 bash 脚本:
#!/bin/bash
# NAME: find-cache
# DESC: cache find command search files to RAM
# NOTE: Written for: https://askubuntu.com/questions/1027186/improve-initial-use-of-find-performance-time?noredirect=1#comment1669639_1027186
for i in {1..10}; do
echo "========================" >> /tmp/find-cache.log
printf "find-cache.log # $i: " >> /tmp/find-cache.log
date >> /tmp/find-cache.log
echo "Free RAM at start:" >> /tmp/find-cache.log
free -h | head -n2 >> /tmp/find-cache.log
printf "Count of all files: " >> /tmp/find-cache.log
SECONDS=0 # Environment variable
time find /* 2>/dev/null|wc -l >> /tmp/find-cache.log
duration=$SECONDS # Set elapsed seconds
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds for find." \
>> /tmp/find-cache.log
echo "Free RAM after find:" >> /tmp/find-cache.log
free -h | head -n2 >> /tmp/find-cache.log
echo "Sleeping 15 seconds..." >> /tmp/find-cache.log
sleep 15
done
将以上文本复制到名为:的脚本文件中find-cache
。将脚本名称放入启动应用程序。使用下一节中的说明,但将命令名称替换/usr/bin/find...
为/<path-to-script>/find-cache
。
不要忘记使用以下命令将脚本标记为可执行文件:
chmod a+x /<path-to-script>/find-cache
<path-to-script>
应该位于您的 $PATH 环境中,例如/usr/local/bin
或 最好是/home/<your-user-name>/bin
。要仔细检查,请使用echo $PATH
显示环境变量。
每次登录时,我通常都会启动conky
并firefox
。您可能还会做其他事情。要微调系统设置,请检查日志文件:
$ cat /tmp/find-cache.log
========================
find-cache.log # 1: Sun Apr 22 09:48:40 MDT 2018
Free RAM at start:
total used free shared buff/cache available
Mem: 7.4G 431M 5.9G 628M 1.1G 6.1G
Count of all files: 1906881
0 minutes and 59 seconds for find.
Free RAM after find:
total used free shared buff/cache available
Mem: 7.4G 1.1G 3.0G 599M 3.3G 5.3G
Sleeping 15 seconds...
========================
find-cache.log # 2: Sun Apr 22 09:49:54 MDT 2018
Free RAM at start:
total used free shared buff/cache available
Mem: 7.4G 1.2G 2.9G 599M 3.3G 5.3G
Count of all files: 1903097
0 minutes and 9 seconds for find.
Free RAM after find:
total used free shared buff/cache available
Mem: 7.4G 1.1G 3.0G 599M 3.3G 5.3G
Sleeping 15 seconds...
(... SNIP ...)
笔记:在第一次和第二次迭代之间,可用 RAM 减少了 3 GB,但firefox
同时恢复了 12 个选项卡。
这是怎么回事?无论出于什么原因,当find
在启动 bash 作业或cron
重新启动 bash 作业中仅运行一次时,Linux 内核会认为:“他们可能不想保留页面缓存,所以我会清空它以节省 RAM”。但是,当该find
命令像此脚本中一样运行 10 次时,Linux 内核认为:“哇哦,他们真的很喜欢页面缓存中的这些东西,我最好不要清除它们”。
至少这是我最好的猜测。无论出于什么原因,这种方法经过多次测试,确实有效。
什么应该起作用但不起作用
以下是使该项目正常运行的两次尝试。我将它们留在这里,以便其他人不必浪费时间重复它们。如果您认为您可以修复它们,请发布答案,我会很高兴地投赞成票。
使用启动应用程序
点击并释放Windows/Super键(其图标为:或或)以调出dash
。
在搜索字段中输入startup
,你会看到启动应用程序图标出现。单击图标。窗口打开后单击Add
右侧。填写新的启动程序字段,如下所示:
- 填写名称为
Cache Find to RAM
。 - 将命令填写为
sleep 30 && find /* 2>/dev/null | wc
。 - 添加注释,例如“首次运行 Find 命令以将磁盘缓存到 RAM”。
- 点击
Add
底部的按钮。
现在重新启动并检查find
命令的性能。
致谢:从超级用户复制的 Windows 键图标邮政。
重启时 Cron
您可以使用在启动时cron
调用该find
命令将慢速磁盘缓存到快速 RAM。运行该命令crontab -e
并在底部添加以下行:
@reboot /usr/sleep 30 && /usr/bin/find /* 2>/dev/null | wc -l
@reboot
告诉cron
在每次启动/重启时运行此命令。/usr/sleep 30
让find
命令在运行前等待 30 秒,以便启动尽可能快地运行。根据您的启动速度、登录时间和要运行的启动应用程序,将其增加到 45 或 60。/usr/bin/find /* 2>/dev/null | wc-l
调用 find 命令搜索所有文件 (/*
)。任何错误消息都将被 隐藏2>/dev/null
。使用 来计算文件数量| wc -l
。在我的系统上,由于安装了 1 个 Ubuntu 和 2 个 Windows 10,文件数量约为 200 万。- 添加行后,使用Ctrl+O然后Enter保存文件。
- 保存文件后,使用Ctrl+X退出
nano
使用的编辑器cron
。如果您选择了其他编辑器,nano
请使用适当的命令保存并退出。
一如既往的缩写年龄变化率(您的里程可能会有所不同)适用。
重启后我做了这些测试来证明这一点才不是工作:
rick@alien:~$ time find / -type f \( -name "*.tar" -o -name "*.tar.*" \) 2>/dev/null | wc
26 26 1278
real 1m10.022s
user 0m7.246s
sys 0m12.840s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~$ time find / -type f \( -name "*.tar" -o -name "*.tar.*" \) 2>/dev/null | wc
26 26 1278
real 0m8.954s
user 0m2.476s
sys 0m3.709s