Улучшение начального использования времени поиска `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 (она имеет значок: или же
или же
) воспитывать
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