Я работаю над проектом найти весь .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 миллионов файлов. find
может быть медленнее, поскольку у меня есть Ubuntu 16.04 и одна из установок Windows 10 на Samsung Pro 960 NVMe SSD, оцененном на уровне 3 000 Мбайт/с, тогда как жесткие диски оцениваются в 140 Мбайт/с, и хорошие SSD оцениваются на уровне 400 Мбайт/с..tar
файлы в Вашей системе, замене tar
с bashrc
в разделе: -name "*.tar" -o -name "*.tar.*"
.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
find
на команду натыкаются /
использует приблизительно 500 МБ кэш-буферов как .gif
ниже шоу, когда они отбрасываются:
^^^---Уведомление строка памяти сразу ниже окна терминала показывает отбрасывание от 4,74 гибибайт до 4,24 гибибайт. Это на самом деле спадает до 4,11 гибибайт после peek
устройство записи экрана сохранило файл и завершения. В моей системе find
кэширование диска использует приблизительно 5% RAM.
В следующих разделах вещи, которые должны работать, но не работают. В конце единственный "безошибочный" способ сделать эту работу был с этим сценарием удара:
#!/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 / Супер ключ (он имеет значок: или или) для перевода в рабочее состояние dash
.
В типе поля поиска startup
и Вы будете видеть, что значок Startup Applications появляется. Нажмите значок. Когда окно открывает щелчок Add
справа. Заполните новые поля Startup Program следующим образом:
Cache Find to RAM
.sleep 30 && find /* 2>/dev/null | wc
.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.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