CreateProcess en Windows es lento en el mejor de los casos, y los desarrolladores de Chrome a menudo no se encuentran en el mejor de los casos. Algunos problemas de creación / destrucción de procesos que se han abordado durante los últimos años en la compilación de Chrome incluyen:
Otros problemas de creación / destrucción de procesos que no afectaron las compilaciones de Chrome incluyen:
Actualmente, todos estos problemas están mitigados, con la excepción de MsMpEng.exe que causa una sobrecarga distinta de cero incluso cuando todo está en carpetas excluidas. Sin embargo, se necesita un esfuerzo continuo para mantener correctamente configuradas las máquinas de todos los desarrolladores de Chrome, y cierta pérdida de seguridad debido a las muchas exclusiones necesarias para mantener un rendimiento de construcción decente. También hay un esfuerzo continuo para detectar e investigar estos problemas.
En algún momento, ya no vale la pena inclinarse hacia el molino de viento CreateProcess y, en su lugar, evitar llamar a CreateProcess con tanta frecuencia. A ninja.exe se le podría enseñar cómo usar IPC para comunicarse con un proceso de servidor local que administraría un grupo de procesos de compilación (goma y / o clang-cl) para evitar el 99% de las llamadas a CreateProcess durante una compilación.
Hacer esto reduciría el costo de CPU de CreateProcess, eliminaría CreateProcess de la ruta crítica serializada en ninja, permitiría habilitar más monitoreo de seguridad con menos exclusiones y nos ahorraría los costos (tiempo de investigación y tiempo de construcción) de regresiones futuras. .
Alternativamente, ninja podría CreateProcess con múltiples subprocesos, pero esta no es una solución tan completa.
Cambiar de CreateProcess a IPC en ninja no es claramente lo correcto, pero vale la pena discutirlo. Se ha creado un prototipo, por lo que los resultados de las pruebas deben compartirse aquí.
Me parece que Ninja-ifying library permitiría esfuerzos como este para inyectar más fácilmente el comportamiento que desean, como derivar de una clase de interfaz para personalizar el comportamiento de creación del proceso.
No es de extrañar que esté totalmente en desacuerdo con esto. Ninja es un sistema de construcción simple que asume que el entorno de construcción es sano. Hay otros sistemas de construcción con diferentes diseños que pueden asumir entornos de construcción hostiles, pero ninja no es ese sistema.
Parece que el diseño actual de ninja ayuda a identificar muchos errores que vale la pena corregir. Considero esto una característica.
@nico , estoy totalmente en desacuerdo con tu opinión sobre este asunto.
Para empezar, Ninja comenzó como una herramienta para mejorar los tiempos de compilación del proyecto Chrome. http://neugierig.org/software/chromium/notes/2011/02/ninja.html
Ahora le está diciendo a alguien que está hablando sobre formas de mejorar los tiempos de compilación para el proyecto de Chrome que su contribución no es bienvenida.
Ninja se adaptaría fácilmente al uso de IPC para ejecutar trabajos de compilación si primero fuera una biblioteca de ejecución de gráficos y, en segundo lugar, una herramienta de compilación. Eso permitiría inyectar la lógica de IPC en la biblioteca, en lugar de vivir en el código central.
Además, como "mantenedor" de un proyecto que rara vez ve informes de errores tan sofisticados (con la promesa implícita de seguir con el código real), es bastante ridículo que cierre este sin absolutamente ninguna discusión sobre el tema, pero ninguno de las otras 189 cuestiones que permanecen abiertas, algunas de hasta 8 años.
Y, por supuesto, llamar a Windows un entorno de compilación hostil puede ser cierto, pero no es una justificación válida para ignorar una contribución. Windows sigue siendo uno de los sistemas operativos de desarrollo más utilizados, e ignorarlo es, en el mejor de los casos, falso.
@nico Te animo a que te
@randomascii Me
¿Podría describir más cómo se gestionaría un conjunto de procesos de compilación? ¿Windows tiene un mecanismo que permite reutilizar un proceso para ejecutar otra cosa? ¿O esto requeriría que el proceso del compilador sea reutilizable?
Tengo entendido que un colega tiene un prototipo de ninja con IPC.
Mi principal preocupación acerca de cerrar esto sin más discusión es que pierde la oportunidad de discutir las compensaciones de seguridad. La mayoría de las formas en que hemos mitigado los costos / serialización de CreateProcess son deshabilitando varios controles de seguridad. No soy un experto en el valor de esos controles, pero podría ser instructivo que aquellos que son expertos opinen sobre los beneficios de poder habilitarlos.
Animaría a su colega a enviar una solicitud de extracción aquí en github con su prototipo, para que se pueda discutir la implementación.