具有挑战性的项目

具有挑战性的项目

我正在开展一个项目,使用以下命令查找.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如果您想复制测试但系统上没有文件,请tarbashrc以下部分中替换:-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显示环境变量。

每次登录时,我通常都会启动conkyfirefox。您可能还会做其他事情。要微调系统设置,请检查日志文件:

$ 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键(其图标为:Winkey1温基2温基3)以调出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 30find命令在运行前等待 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

相关内容