'grep'ing все файлы для строки занимает много времени

grep опции команды

Я хотел искать свой целый диск строку. После принятого ответа в Переполнении стека я использовал:

sudo time grep -rnw '/' -e 'Sony 50"'

и потребовалось 53 Часа для обработки 20 ГБ данных по одному из самого быстрого PCIe NVMe M.2 SSD вокруг; Samsung Pro 960.

grep выходной журнал

Когда grep процессы некоторые файлы это генерирует сообщения об ошибках. Они могут быть подавлены путем добавления 2>/dev/null к команде. Однако ошибки дают обратную связь на сделанных успехах. Часть демонстрационного вывода (это не будет все соответствовать) ниже:

Binary file /home/Me/.config/google-chrome/Default/Sync Data/SyncData.sqlite3 matches
grep: /sys/kernel/security/ima/policy: Permission denied
grep: /sys/kernel/slab/:dt-0000008/alloc_calls: Function not implemented
grep: /sys/kernel/slab/:dt-0000008/free_calls: Function not implemented
      (... SNIP ... 12 hours later PID 882 processed below...)
grep: /proc/882/task/922/attr/sockcreate: Invalid argument
grep: /proc/882/task/923/mem: Input/output error
      (... SNIP ... 24 hours later PID 2954 below...)
grep: /proc/2598/attr/sockcreate: Invalid argument
grep: /proc/2954/task/2954/mem: Input/output error
      (... SNIP ... 42 hours later PID 4396 below...)
grep: /proc/4389/attr/sockcreate: Invalid argument
grep: /proc/4396/task/4396/mem: Input/output error
      (... SNIP ... After 53 hours `grep` finally finishes...)
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
97355.34user 83223.12system 53:07:40elapsed 94%CPU (0avgtext+0avgdata 31116maxresident)k
593910020inputs+0outputs (1major+10731minor)pagefaults 0swaps

grep производит впечатление, оно замораживается

Иногда я думал grep был заморожен, потому что экран не обновил в течение часа, и свет жесткого диска не высветился очень. Однако Носатый говорит мне, что это все еще выполняет и берет 100% ЦП на одноядерном, как замечено в этом GIF.

Из 19,5 гибибайт из 43,8 гибибайт, используемых на Linux (Ubuntu 16.04.3 LTS) раздел, половина этого пространства, 10 ГБ используются ядрами. Загрузка и тестирование ядер являются моим разовым передачей.


Этот тест взял большую часть моих выходных плюс понедельник для завершения.

Как я могу убыстриться grep и все еще получите то, что я ищу?

7
задан 28 February 2018 в 04:06

1 ответ

Исключите виртуальные файловые системы

Рассмотрение демонстрационного вывода регистрируется, мы видим, что виртуальные файловые системы включены в поиск, который является ненужной пустой тратой времени. Отбросьте эти и другие каталоги от поиска с --exclude-dir опция. Например:

sudo time grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'Sony 50"'

Когда grep синтаксические анализы /proc цепочка каталога это бесполезно смотрит на весь идентификатор процесса, который занимает больше чем день в моем случае.

Также при обработке /mnt это будет смотреть на смонтированные диски Windows NTFS и USBs излишне.

/media хранения CD/DVD-привод и внешние карты памяти.

Вывод:

$ sudo time grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'Sony 50"'
Binary file /home/Me/.config/google-chrome/Default/Sync Data/SyncData.sqlite3 matches
11.35user 13.83system 0:56.35elapsed 44%CPU (0avgtext+0avgdata 8480maxresident)k
17369032inputs+0outputs (0major+1620minor)pagefaults 0swaps

Там Вы идете 56 Секунд вместо 50 Часов!

Отметьте, исключаете ли Вы usr (содержащий 6,5 ГБ файлов в в моем случае) от поиска это - только 8 секунд:

4.48user 1.80system 0:08.75elapsed 71%CPU (0avgtext+0avgdata 6012maxresident)k
13008964inputs+0outputs (0major+1180minor)pagefaults 0swaps

Интересные примечания

Не допускание системных каталогов, кажется, сохраняет grep на лучшей дорожке и это никогда не поражает 100% ЦП в одноядерное. Плюс вспышки света жесткого диска постоянно, таким образом, Вы знаете grep действительно работает и "думает в кругах".

Если Вы не снабжаете префиксом tmp с / затем это проигнорирует любой подкаталог, содержащий tmp например, /home/Me/tmp. Если Вы используете - исключать-dir /tmp затем Ваш каталог /home/Me/tmp будет искаться.

Если, с другой стороны, Вы снабжаете префиксом sys с / затем затем /sys каталог ищется, и об ошибках сообщают. То же верно для /proc. Таким образом, необходимо использовать sys,proc и не снабжают префиксом их /. То же верно для других системных каталогов, которые я протестировал.

Создайте псевдоним grepall

Рассмотрите установку псевдонима в ~/.bashrc таким образом, Вы не должны вводить --exclude-dir список параметров каждый раз:

alias grepall="grep --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var}"

Подробная разбивка времени

Это разрывы раздела вниз, сколько времени сэкономлено путем возрастающего добавления каталогов к --exclude-dir список параметров:

  • /proc и /sys сохранение 52 часов
  • /media сохранение 3 минут
  • /mnt сохранение 21 минуты
  • /usr/src (путем определения src) сохранение 53 секунд
  • /lib/modules (путем определения modules) сохранение 39 секунд

Исключить /proc и /sys каталоги

/proc и /sys каталоги являются самыми трудоемкими, самыми бесполезными, чтобы искать и генерировать большинство ошибок. Это "бесполезно", потому что эти два каталога динамично создаются во времени выполнения и не содержат постоянные файлы, Вы хотели бы grep.

Прекрасное время, которое сбережения, понимает исключением их:

$ sudo time grep -rnw --exclude-dir={proc,sys} '/' -e 'Garbage 098jfsd'
/var/log/auth.log:4653:Feb 16 17:46:20 alien sudo:     rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys / -e Garbage 098jfsd
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /media/rick/S3A6550D005/hiberfil.sys: Input/output error
      (... SNIP ...)
grep: /media/rick/S3A6550D005/winproductkey: Input/output error
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
422.43user 112.91system 26:59.03elapsed 33%CPU (0avgtext+0avgdata 31152maxresident)k
379671064inputs+0outputs (1major+10738minor)pagefaults 0swaps

Только 27 Минут эта экономия времени более чем 52 Часа!

Существуют все еще ошибки все же. В /var каталог, который является также "виртуальным каталогом", созданным во время выполнения. /run каталог, который содержит Сотовый телефон Android и /media каталог, который содержит старый поврежденный жесткий диск для ноутбука, теперь подключенный к USB внешний корпус жесткого диска.

Добавить /media исключить список

/media каталог содержит старый диск ноутбука, подключенный через порт USB 3.0. Ошибки ежедневных отчетов Smartctl на диске и не имеют файлов, которые мы ищем. Мы исключим его, чтобы сэкономить время и уменьшить сообщения об ошибках:

$ sudo time grep -rnw --exclude-dir={proc,sys,media} '/' -e 'Garbage 654asdf'
/var/log/auth.log:4664:Feb 16 18:26:27 alien sudo:     rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media / -e Garbage 654asdf
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
405.51user 105.38system 23:26.89elapsed 36%CPU (0avgtext+0avgdata 30908maxresident)k
365800875inputs+0outputs (0major+10961minor)pagefaults 0swaps

Исключая неисправный жесткий диск, подключенный через корпус USB 3.0 только, сохранил 3 минуты, но уменьшил сообщения об ошибках.

Добавить /mnt (Разделы Windows NTFS) для исключения списка

/mnt каталог содержит:

  • Два раздела Windows 10 NTFS (C: и E:) на SSD с 105 гибибайтами данных
  • Один раздел Windows 10 NTFS (D:) на жестком диске с 42 гибибайтами данных

Нет ничего из интереса к Windows, таким образом, мы исключим /mnt сэкономить время:

$ ll /mnt
total 44
drwxr-xr-x  5 root root  4096 Nov 12 07:19 ./
drwxr-xr-x 27 root root  4096 Feb 15 20:43 ../
drwxrwxrwx  1 root root  8192 Dec 30 14:00 c/
drwxrwxrwx  1 root root  8192 Dec 30 14:31 d/
drwxrwxrwx  1 root root 20480 Jan  1 13:22 e/

$ sudo time grep -rnw --exclude-dir={proc,sys,media,mnt} '/' -e 'Garbage zx5cv7er'
/var/log/auth.log:5093:Feb 17 10:31:44 alien sudo:     rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media --exclude-dir=mnt / -e Garbage zx5cv7er
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
51.50user 23.28system 2:08.85elapsed 58%CPU (0avgtext+0avgdata 15800maxresident)k
39866258inputs+0outputs (0major+6059minor)pagefaults 0swaps

Теперь grep только занимает 2 минуты и 8 секунд. Исключением разделов Windows 10 с 147 ГиБ Программ и Данных сохраняет 21,5 минуты!

Добавить /usr/src Заголовки Linux для исключения списка

/usr/src каталог содержит исходный код Заголовков Linux. В моем случае существуют 20 + ядра, вручную установленные, который занимает значительное место. Указывать каталог, хотя используемый аргумент src:

$ du -h -s /usr/src
3.2G    /usr/src

$ sudo time grep -rnw --exclude-dir={proc,sys,media,mnt,src} '/' -e 'Garbage z5cv7er'
/var/log/auth.log:5096:Feb 17 10:34:28 alien sudo:     rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media --exclude-dir=mnt --exclude-dir=src / -e Garbage z5cv7er
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
44.21user 8.54system 1:15.51elapsed 69%CPU (0avgtext+0avgdata 15864maxresident)k
33754180inputs+0outputs (0major+6062minor)pagefaults 0swaps

Теперь grep только занимает 1 минуту и 15 секунд. Исключая /usr/src путем определения src на --exclude-dir список сохраняет 53 секунды.

Добавить /lib/modules Модули ядра для исключения списка

/lib/modules каталог содержит скомпилированные Модули Ядра. Указывать каталог, хотя используемый аргумент modules:

$ du -h -d1 /lib/modules
285M    /lib/modules/4.14.18-041418-generic
282M    /lib/modules/4.14.14-041414-generic
     (... SNIP ...)
228M    /lib/modules/4.9.76-040976-generic
6.0G    /lib/modules

$ sudo time grep -rnw --exclude-dir={proc,sys,media,mnt,src,modules} '/' -e 'Garbage 1cv7fer'
/var/log/auth.log:5117:Feb 17 11:07:41 alien sudo:     rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media --exclude-dir=mnt --exclude-dir=src --exclude-dir=modules / -e Garbage 1cv7fer
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
19.22user 5.84system 0:35.61elapsed 70%CPU (0avgtext+0avgdata 15600maxresident)k
22111388inputs+0outputs (0major+6059minor)pagefaults 0swaps

Путем пропуска 6 ГБ модулей ядра, нашего grep время составляет 36 секунд. Добавление /lib/modules путем определения modules в --exclude-dir параметр сохраняет 39 секунд.

Разные каталоги

Сводный список других каталогов:

  • / начальная загрузка сохраняет 3 секунды (но мой является исключительно большим),
  • /dev сохраняет 3 секунды
  • / выполненный сохраняет 4 секунды
  • / var сохраняет 8 секунд
15
ответ дан 23 November 2019 в 06:15

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

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