Улучшение начального использования времени поиска `find`

Я работаю над проектом, чтобы найти все .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 на общую сумму 2 миллиона файлов.
  • OTOH ваш начальный find может быть медленнее, поскольку у меня Ubuntu 16.04 и одна из установок Windows 10 на твердотельном накопителе Samsung Pro 960 NVMe, рассчитанном на 3000 Мбит / с, тогда как жесткие диски рассчитаны на 140 Мбит / с, а хорошие твердотельные накопители - на 400 Мбит / с.
  • Если вы хотите повторить тесты, но не имеете .tar файлы в вашей системе, заменить tar с bashrc в разделе: -name "*.tar" -o -name "*.tar.*",

TL;DR

Удалите RAM кеши, которые ускоряются find доступ к диску

Вы можете повторить первый / второй тесты производительности, вызвав этот маленький скрипт перед первым 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 МБ кэш-буферов в качестве .gif ниже показано, когда они выпадают:

^^^--- Обратите внимание, что строка памяти, расположенная непосредственно под окном терминала, показывает падение с 4,74 ГБ до 4,24 ГБ. Это на самом деле падает до 4,11 ГБ после peek Экран записывает файл и закрывает. В моей системе find Кэширование диска использует около 5% оперативной памяти.

1 ответ

Сложный проект

В следующих разделах описаны вещи, которые должны работать, но не работать. В конце концов, единственный надежный способ сделать эту работу был с помощью скрипта bash:

#!/bin/bash
# NAME: find-cache
# DESC: cache find command search files to RAM
# NOTE: Written for: https://Ask-ubuntu.ru/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, Поместите имя скрипта в Startup Applications. Используйте инструкции в следующем разделе, но подставьте имя команды /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 ...)

Примечание: между 1-й и 2-й итерацией объем свободной оперативной памяти падает на 3 ГБ, но firefox восстанавливает 12 вкладок одновременно.

В чем дело? По какой-то причине, когда find запускается только один раз в задании запуска bash, или cron перезагрузив задание bash, ядро ​​Linux думает: "Они, вероятно, не хотят сохранять кеш страниц, поэтому я опустошу его, чтобы сэкономить оперативную память". Однако когда find Команда запускается 10 раз, так как в этом сценарии ядро ​​Linux думает: "Оу, им действительно нравится этот материал в кеше страницы, я лучше не очищаю его".

По крайней мере, это мое лучшее предположение. Независимо от причины, этот подход работает, как проверено много раз.


Что должно работать, но не работает

Ниже приведены две попытки заставить этот проект работать. Я оставил их здесь, чтобы другие не тратили время на их повторение. Если вы думаете, что можете исправить их любыми способами, доработайте их, опубликуйте ответ, и я с радостью проголосую.

Используйте Startup Applications

Нажмите и отпустите клавишу Windows / Super (она имеет значок: Winkey1 или же Winkey2 или же Winkey3) воспитывать dash,

В поле поиска введите startup и вы увидите значок запуска приложений. Нажмите на значок. Когда откроется окно, нажмите Add справа. Заполните новые поля программы запуска следующим образом:

  • Заполните имя как Cache Find to RAM,
  • Заполните команду как sleep 30 && find /* 2>/dev/null | wc,
  • Добавьте комментарий, такой как "Первоначальный запуск команды Find для кэширования диска в оперативную память".
  • Нажмите на Add кнопка внизу.

Теперь перезагрузите компьютер и проверьте работоспособность find команда.

Кредиты: Значки Windows Key скопированы из сообщения Super User.


Крон при перезагрузке

Ты можешь использовать cron позвонить find Команда во время загрузки, чтобы кэшировать медленный диск в быстром ОЗУ. Запустите команду 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, В моей системе это около 2 миллионов из-за одной установки Ubuntu и двух установок Windows 10.
  • После добавления строки используйте Ctrl + O, а затем Enter, чтобы сохранить файл.
  • После сохранения файла используйте Ctrl + X для выхода nano редактор используется cron, Если вы выбрали другой редактор, чем nano используйте соответствующие команды для сохранения и выхода.

Как всегда, применяется аббревиатура YMMV (ваш пробег может меняться).

После перезагрузки я сделал эти тесты, чтобы доказать, что это не работает:

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
Другие вопросы по тегам