Почему `ls --color= всегда` может быть медленным для небольшого каталога?

Для определенного каталога DIR в моей системе ls --color=always занимает около 8 секунд, хотя он содержит менее 10 файлов и подкаталогов. Без аргумента цвета это не займет времени.

Почему бы ls так долго с аргументом о цвете, и как я могу узнать, что именно так долго? Вероятно, это какой-то подкаталог в DIR, который смонтирован, но как я могу узнать, кто из них является источником проблем?

4 ответа

Они просто отключили цвет на серверах на моей работе. Согласно этому блогу: http://www.techper.net/2011/01/25/ls-command-slow-on-very-large-directories/

Это может быть связано с тем, что функция stat() вызывается на всех различных монтировках в определенном каталоге, чтобы получить информацию, представленную цветами...

Это легко подтвердить:

time command ls /dir/with/many/toplevel/entries/ >/dev/null
time $SHELL -c "ls --color=always /dir/with/many/toplevel/entries/ >/dev/null"

Первая команда для определенной проблемной структуры каталогов, которую я создал, дает:

real    0m0.523s
user    0m0.284s
sys     0m0.052s

И второй:

real    1m47.799s
user    0m0.360s
sys     0m0.928s

Помните, что если вы повторите нижний "тест", то при его втором запуске данные stat() уже будут в кеше. Второй прогон для цветного вывода дал мне:

real    0m0.409s
user    0m0.256s
sys     0m0.120s

Я не смог полностью очистить кеш, чтобы убедиться, что смог воспроизвести результат "более 90 сек". vm.drop_caches sysctl, как описано в https://stackoverflow.com/questions/599719/how-to-clean-caches-used-by-the-linux-kernel было недостаточно.

Попробуйте выполнить команду ls, используя *s, чтобы получить список только определенных вещей и посмотреть, какие комбинации являются медленными.

Судя по комментариям в этом отчете об ошибке , одно решение/обходной путь (который, как я могу подтвердить, работает для меня) — добавить следующее в ваш~/.profileфайл:

      eval `dircolors -b | sed s/or=[^:]*://`

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

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