Why might `ls --color=always` be slow for a small directory?
Solution 1:
They just disabled color on servers at my work. According to this blog: https://web.archive.org/web/20160410082228/http://www.techper.net/2011/01/25/ls-command-slow-on-very-large-directories/
It may be due to the stat() function being called on all the different mounts in a specific directory to get the information presented by the colors...
It's easy to confirm this:
time command ls /dir/with/many/toplevel/entries/ >/dev/null
time $SHELL -c "ls --color=always /dir/with/many/toplevel/entries/ >/dev/null"
The first command, for a certain problematic directory structure I created, gives:
real 0m0.523s
user 0m0.284s
sys 0m0.052s
And the second one:
real 1m47.799s
user 0m0.360s
sys 0m0.928s
Please keep in mind that if you repeat the bottom "benchmark", its second run will have the stat() data already in cache. The second run for the colorized output gave me:
real 0m0.409s
user 0m0.256s
sys 0m0.120s
I was unable to completely clear the cache to ensure I could reproduce the "more than 90secs" result. The vm.drop_caches
sysctl as described in https://stackoverflow.com/questions/599719/how-to-clean-caches-used-by-the-linux-kernel was insufficient.
Solution 2:
Try doing ls using *s to only list certain things and see which combinations are slow.