es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un recuento excesivo de hilos produce mejores resultados al leer archivos.

Tengo cien millones de archivos, mi programa lee todos estos archivos en cada inicio. He estado buscando formas de hacer que este proceso sea más rápido. En el camino, me he encontrado algo extraño. Mi CPU tiene 4 núcleos físicos, pero leer esta cantidad de archivos con recuentos de hilos aún más altos produce resultados mucho mejores. Lo cual es interesante, dado que abrir hilos más allá del recuento lógico de núcleos de la CPU debería ser algo un tanto inútil.

8 Hilos: 29.858 s
16 Hilos: 15.882 s
32 Hilos: 9.989 s
64 Hilos: 7.965 s
128 Hilos: 8.275 s
256 Hilos: 8.159 s
512 Hilos: 8.098 s
1024 Hilos: 8.253 s
4096 Hilos: 8.744 s
16001 Hilos: 10.033 s

¿Por qué puede ocurrir esto? ¿Es algún tipo de cuello de botella del disco?

  • Hice la tarea, perfilé el código, literalmente el %95 del tiempo de ejecución consiste en leer(), abrir() y cerrar().
  • Estoy leyendo los primeros 4096 bytes de cada archivo (mi tamaño de página).
  • Ubuntu 18.04
  • Intel i7 6700HQ
  • Samsung 970 Evo Plus NVMe SSD
  • GCC/G++ 11
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Posibles razones por las cuales usar más hilos que la cantidad física de núcleos produce mejores resultados:

    1. Cuello de botella de E/S de disco: al leer una gran cantidad de archivos al iniciar, se realizan muchas operaciones de E/S de disco, las cuales pueden convertirse en un cuello de botella si no se manejan de manera eficiente. Al utilizar múltiples hilos, el programa puede paralelizar las operaciones de E/S de disco y reducir la latencia general. Sin embargo, si el disco ya está saturado con solicitudes de E/S, agregar más hilos puede no ayudar e incluso empeorar el rendimiento.
    2. Utilización de la CPU: aunque la CPU solo tenga 4 núcleos físicos, puede tener núcleos lógicos adicionales mediante la hiperroscación. Al utilizar más hilos, el programa puede aprovechar mejor los recursos de la CPU disponibles y evitar ciclos inactivos. Sin embargo, si los hilos no se programan de manera eficiente por el sistema operativo, podrían competir por los mismos recursos de la CPU y en realidad ralentizar el rendimiento general.

    3. Patrones de acceso a la memoria: al leer una gran cantidad de archivos, se accede a una gran cantidad de memoria, lo cual puede generar fallos en la caché y en las páginas. Al utilizar más hilos, el programa puede optimizar mejor los patrones de acceso a la memoria y reducir la latencia general. Sin embargo, si los hilos no se coordinan de manera eficiente, podrían causar más sobrecarga de la caché e intercambio de páginas, lo cual empeoraría el rendimiento.

    Para determinar la causa raíz del mejor rendimiento con más hilos, se recomienda analizar más a fondo el código y el comportamiento del sistema utilizando herramientas de perfilado y pruebas de rendimiento. Esto podría ayudar a identificar posibles cuellos de botella, ineficiencias u oportunidades de optimización.

Comments are closed.