For a certain directory DIR on my system, the ls --color=always
takes about 8 seconds, although it contains less than 10 files and subdirectories. Without the color argument it takes no time.
Why would ls
take so long with the color argument, and how can I find out what exactly is taking so long? It is probably some subdirectory in DIR that is mounted, but how can I find out which one is the troublemaker?
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:
The first command, for a certain problematic directory structure I created, gives:
And the second one:
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:
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.Try doing ls using *s to only list certain things and see which combinations are slow.
Some color configurations are silly and read file contents. Check your config. I use colorized ls but only such that lstat would provide all the required information.
Based on the comments in this bug report, one solution/workaround (which I can confirm works for me) is to add the following to your
~/.profile
file: