Почему `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 предоставил всю необходимую информацию.