Как Bash передает большие объемы по каналу данных?

Размер каталога (как замечено с ls -ld /var/lib/php/sessions) может дать признак. Если это является маленьким, нет многих файлов. Если это является большим, там может быть много записей, или в прошлом, возможно, были многие.

Список содержания, пока Вы не делаете stat отдельные файлы, не должен брать намного намного дольше, чем чтение файла тот же размер.

То, что могло бы произойти, - то, что у Вас есть псевдоним для ls это делает ls -F или ls --color. Те опции вызывают lstat системный вызов, который будет выполнен на каждом файле для наблюдения, например, если они - файл или каталог.

Вы также захотите удостовериться, что Вы перечисляете точечные файлы и что Вы оставляете список файлов неотсортированным. Для этого, выполненного:

command ls -f /var/lib/php/sessions | wc -l

Если не слишком много имен файлов имеют символы новой строки, которые должны дать Вам хорошую оценку.

$ ls -lhd 1
drwxr-xr-x 2 chazelas chazelas 69M Aug 15 20:02 1/
$ time ls -f 1 | wc -l
3218992
ls -f 1  0.68s user 1.20s system 99% cpu 1.881 total
wc -l  0.00s user 0.18s system 9% cpu 1.880 total
$ time ls -F 1 | wc -l
<still running...>

Можно также вывести количество файлов там путем вычитания количества уникальных файлов в другом месте в файловой системе от количества используемого inodes в выводе df -i.

Например, если файловая система смонтирована на /var, с GNU find:

find /var -xdev -path /var/lib/php/sessions -prune -o \
  -printf '%i\n' | sort -u | wc -l

Найти количество файлов не в/var/lib/php/sessions. Если Вы вычитаете это к IUsed поле в выводе df -i /var, Вы получите приближение (потому что некоторые специальные inodes не связаны ни с каким каталогом в типичной файловой системе расширения) количества файлов, связанных с /var/lib/php/sessions это иначе не связано больше нигде (обратите внимание, что/var/lib/php/sessions мог очень хорошо содержать один миллиард записей для того же файла (хорошо на самом деле, максимальное количество ссылок на файл будет намного ниже, чем это в большинстве файловых систем), так, чтобы метод не был надежным).

Обратите внимание, что при чтении содержания каталога должно быть относительно быстрым, удаление файлов может быть крайне медленным.

rm -r, когда удаление файлов, первые списки содержание каталога, и затем звонит unlink() для каждого файла. И для каждого файла, система имеет к поиску файл в том огромном каталоге, который, если это не хешируется, может быть очень дорогим.

3
31.10.2014, 06:21
3 ответа

READ будет блокировать, пока данные не будут доступен, и напишите заблокируют или выйдут, чтобы пройти полную трубу. Там мало параметров, таких как Pipe_buf , Pipe_size и O_NONBLOCK , которые играют ключевую роль в трубе.

Значение PIPE_BUF можно определить через «Ulimit -a». Это определено в пределах. Pipe_buf управляет гарантированным размером для атомных напитков . Это помогает в создании безопасных многопоточных приложений.

Pipe_size зависит от размера страницы. В 2,4 ядре он был эквивалентен размеру одной страницы (4 КБ). Однако версии после 2,6 сопоставлены на массив 16 страниц (64 КБ). Это определяется в файле Pipe_fs_i.h Как Pipe_Buffers (16). Последние версии ядра имеют FCNTL с F_SetPipe_SZ Включить увеличение размера страницы.

О O_NONBLOCK позволяет выполнять частичные и отложенные записи. Тем не менее, если O_NONBLOCK включен, но если количество байтов будет записано в трубе, больше, чем Pipe_buf, то запись не пройдет неудачу в трубу, если они заполнены, остальные на основе возвращаемого значения записи, он будет перемежен с данными из других процессов. Отказ

2
27.01.2020, 21:11

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

В man-странице man 7 pipe есть все подробности, также как и в другом U&L Q&A под названием: Насколько велик буфер трубы?

6
27.01.2020, 21:11

Попробуйте использовать опцию -B, она использует только 64k буфер.

cat /dev/sda1 | less -B

Из man less:

-B или --auto-buffers По умолчанию, когда данные читаются из трубы, буферы выделяются автоматически по мере необходимости. Если из трубы считывается большое количество данных, это может привести к выделению большого объема памяти. выделение. Опция -B отключает автоматическое выделение буферов для труб, так что для трубы будет использоваться только 64K (или объем пространства, указанный опцией -b). Предупреждение: использование опции -B может привести к ошибочному отображению, так как в памяти сохраняется только самая последняя просмотренная часть файла; все более ранние данные теряются.

0
27.01.2020, 21:11

Теги

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