¿Por qué ls commands ralentizan la interrupción en el directory NFS con muchos files?

Me di count en los directorys con muchos files en NFS si lo hago

ls * 

luego presiona Ctrl-C, puede tardar un time (digamos 20 segundos) antes de que vuelva.

¿Por qué? ¿Se puede arreglar el command ls para que sea más receptivo?

Solutions Collecting From Web of "¿Por qué ls commands ralentizan la interrupción en el directory NFS con muchos files?"

Cuando ejecuta ls * , lo primero que sucede es que el shell obtiene una list del directory actual. Si el directory es enorme y el server es lento, esto podría llevar un time.

Una vez que el shell ha obtenido la list de nombres de files en el directory actual, ordera esa list (que es muy rápida en comparación con cualquier interacción de networking), luego llama a ls . El command ls busca cada file uno por uno y recupera sus metadatos (llamada de stat ) para comprobar si se trata de un directory; si un file es un directory, ls enumera sus contenidos en lugar del directory en sí.

Cuando presiona Ctrl + C , esto no interrumpirá la operación NFS actual. No se puede interrumpir una operación del sistema de files en cualquier lugar, ya que esto podría dejar el sistema en un estado incoherente. Incluso leer un file podría actualizar su time de acceso. La mayoría de las veces, una operación de lectura o escritura elemental en un file es instantánea para los estándares humanos, pero NFS es una exception, especialmente con grandes cantidades de datos en una networking lenta.

Por lo tanto, presionar Ctrl + C solo tendrá efecto:

  • si el shell está actualmente generando la list de nombres de files, cuando esa list se recupera por completo;
  • si ls se ha iniciado y actualmente está obteniendo metadatos sobre un file, cuando el server proporciona los metadatos;
  • si ls ha sido iniciado y actualmente está enlistndo un directory, cuando la list se recupera completamente, o al less después de una parte de ella.

No es culpa del command ls (que quizás ni siquiera se haya iniciado aún). Ni siquiera es culpa del caparazón: es culpa de NFS. NFS es bastante lento.

Hipótesis: atravesar un directory a través de NFS carga especulativamente más datos de los que esperaría de una vez. Demasiado IO en el lado del server, causando que una sola llamada NFS tome> 20s. mount con la opción intr podría permitir que Ctrl-C interrumpa la llamada durante el vuelo.

Google encontró una list de llamadas NFS que incluye READDIRPLUS. Básicamente readdir + luego stat para cada file. También getacl. En otras palabras, hay una llamada NFS que básicamente hace ls -l (para una cierta cantidad de files). En lugar de enviar requestes de statistics individuales para cada file.

Google buscando nfs readdirplus: parece bastante plausible. El primer resultado es un informe de error (pagado).

RHEL6: NFSv3 READDIRPLUS ralentiza drásticamente el globbing sobre un directory NFS que conduce a problemas de performance

  • RHEL 6.2 con un assembly estándar, un glob en un directory que contiene más de 3000 directorys toma 218 segundos (casi cuatro minutos).
  • Un assembly del mismo directory que usa la opción nordirplus para deshabilitar el uso de llamadas readdirplus, un glob en el mismo directory toma solo 1.7 segundos

así que parece una línea de investigación interesante.


EDITAR: tenga en count que su ejemplo ls * también es un uso de globbing. ls . evitaría el glob. Si eso hace una diferencia en su pregunta específica, podría ser porque el globbing tiene lugar en el shell, en lugar de ls, lo que podría afectar la forma en que se procesa Ctrl-C. Dudo que importe, pero me pareció una pregunta interesante.

Puede haber varias razones para que el command ls sea ​​lento en el directory NFS.

  • Es posible que el directory no esté ensamblado.
  • Es posible que las máquinas no estén en la misma networking.

Sin embargo, esta es una idea más general en lugar de específica para NFS . Para enumerar los files sin clasificar, puede probar ls -U que enumera los files sin orderar. Desde la página de manual de ls ,

-Uno ordera; enumerar las inputs en order de directory. En combinación con el formatting one_per_line '-1', mostrará los files inmediatamente y no tiene limitaciones de memory.

Hay varias variaciones para evitar la sorting. Puede consultar la página de manual de su sistema y probar cualquiera de las siguientes opciones.

 ls -f ls -U ls --sort=none 

Si tiene un alias para ls también puede causar lentitud, pruebe \ ls even \ ls -altr O cualquier otra opción de ls.