Cuando se ejecuta lssin argumentos, solo abrirá un directorio, leerá todo el contenido, los ordenará e imprimirá.
Cuando ejecuta ls *, primero el shell se expande *, que es efectivamente lo mismo que lo que hizo el simple ls, construye un vector de argumento con todos los archivos en el directorio actual y las llamadas ls. lsluego tiene que procesar ese vector de argumento y para cada argumento, y llama access(2)¹ al archivo para verificar su existencia. Luego imprimirá el mismo resultado que el primero (simple) ls. Es lsprobable que tanto el procesamiento de shell del vector de argumento grande como el de s impliquen una gran asignación de memoria de bloques pequeños, lo que puede llevar algún tiempo. Sin embargo, dado que había poco sysy usertiempo, pero mucho realtiempo, la mayor parte del tiempo se hubiera pasado esperando el disco, en lugar de usar la CPU para asignar la memoria.
Cada llamada a access(2)tendrá que leer el inodo del archivo para obtener la información del permiso. Eso significa muchas más lecturas y búsquedas de disco que simplemente leer un directorio. No sé qué tan caras son estas operaciones en su GPFS, pero como la comparación que ha demostrado ls -lque tiene un tiempo de ejecución similar al del comodín, parece dominar el tiempo necesario para recuperar la información del inodo. Si GPFS tiene una latencia ligeramente mayor que su sistema de archivos local en cada operación de lectura, esperaríamos que sea más pronunciada en estos casos.
La diferencia entre el caso comodín y el ls -l50% podría explicarse por el pedido de inodos en el disco. Si los inodes se dispusieran sucesivamente en el mismo orden que los nombres de archivo en el directorio y ls -lstat (2) editara los archivos en orden de directorio antes de ordenarlos, ls -lposiblemente leería la mayoría de los inodes en un barrido. Con el comodín, el shell ordenará los nombres de los archivos antes de pasarlos ls, por lslo que probablemente leerá los inodos en un orden diferente, agregando más movimiento de la cabeza del disco.
Cabe señalar que su timesalida no incluirá el tiempo que tarda el shell para expandir el comodín.
Si realmente quieres ver lo que está pasando, usa strace(1):
strace -o /tmp/ls-star.trace ls *
strace -o /tmp/ls-l-star.trace ls -l *
y eche un vistazo a las llamadas del sistema que se realizan en cada caso.
¹ No sé si access(2)realmente se usa, o algo más como stat(2). Pero ambos probablemente requieran una búsqueda de inodo (no estoy seguro si access(file, 0)pasarían por alto una búsqueda de inodo).
lssolo preguntarle al sistema de archivos "para qué son los hijos del inodopwd" dónde como conls *tiene que preguntar "cuáles son los elementos secundarios (y cuál es el archivo) del inodoa" seguido de b, c, d, etc. etc. Una consulta frente a muchas.ls -l(todavía unos 30 segundos menos quels *)ls -lllevará más tiempo quelscomo lo ha hecho astat(2)cada archivo para obtener información sobre las marcas de tiempo / información del propietario / permisos, etc.*pasa a todas las entradas del directorio actual que no comienzan con un punto, incluidos los nombres de subdirectorios. Que luego seráls'ed.ls<ls -l<ls -l *<ls *(siempre me encontré con ella tres veces). Con su explicación, no entiendo por quéls -l *es más rápido quels *