Улучшите начальное использование времени производительности 'находки'

Я работаю над проектом найти весь .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 SSD, оцененном на уровне 3 000 Мбайт/с, тогда как жесткие диски оцениваются в 140 Мбайт/с, и хорошие SSD оцениваются на уровне 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, показывающий, сколько использует кэширование псевдодиска

find на команду натыкаются / использует приблизительно 500 МБ кэш-буферов как .gif ниже шоу, когда они отбрасываются:

drop_caches.gif

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

2
задан 22 April 2018 в 23:46

1 ответ

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

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

#!/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 ...)

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

Что продолжается? По любой причине, когда find выполняется только однажды в задании удара запуска или a cron задание удара перезагрузки, Ядро Linux думает: "Они, вероятно, не хотят сохранять кэш страницы, таким образом, я буду освобождать его для сохранения RAM". Однако, когда find команда выполняется 10 раз как в этом сценарии, Ядро Linux думает: "Whoaa, им действительно нравится этот материал в кэше страницы, я лучше не, убирают его".

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


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

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

Используйте приложения запуска

Коснитесь и выпустите Windows / Супер ключ (он имеет значок:Winkey1 илиWinkey2 илиWinkey3) для перевода в рабочее состояние dash.

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

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

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

Кредиты: Windows Key icons скопирован с сообщения Суперпользователя.


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

Можно использовать 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 называет команду находки, ищущую все файлы (/*). Любые сообщения об ошибках скрыты 2>/dev/null. Количество файлов считается с помощью | wc -l. В моей системе это - приблизительно 2 миллиона из-за одной установки Ubuntu и двух установок Windows 10.
  • После добавления строки используют Ctrl+O, сопровождаемый, Входят, чтобы сохранить файл.
  • После сохранения файла используют 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
2
ответ дан 2 December 2019 в 03:33

Другие вопросы по тегам:

Похожие вопросы: