Si uso la siguiente llamada en C++, esperaría que el WorkingSet del proceso nunca caiga por debajo de 100MB.¿Hay alguna manera de forzar el WorkingSet de un proceso de 1 GB en C++?
Sin embargo, el sistema operativo aún recorta el conjunto de trabajo a 16 MB, incluso si realizo esta llamada.
Establecer WorkingSet a 100MB daría lugar a un aumento drástico en la velocidad de mi aplicación, eliminando las fallas de página suave (consulte el diagrama a continuación).
¿Qué estoy haciendo mal?
SIZE_T workingSetSizeMB = 100;
int errorCode = SetProcessWorkingSetSizeEx(
GetCurrentProcess(),
(workingSetSizeMB - 1) * 1024 * 1024), // dwMinimumWorkingSetSize
workingSetSizeMB * 1024 * 1024, // dwMaximumWorkingSetSize,
QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE
);
// errorCode returns 1, so the call worked.
(extra para expertos)metodología experimental
escribí un ensayo C++ proyecto para asignar 100 MB de datos para llevar el WorkingSet más de 100 MB (como se ve en el Explorador de Proceso), a continuación, cancela la asignación que memoria. Sin embargo, el SO recortó el WorkingSet a 16 MB tan pronto como desasigné esa memoria. Puedo proporcionar el proyecto C++ de prueba que utilicé si lo desea.
¿Por qué Windows proporciona una llamada a SetProcessWorkingSetSizeEx() si no parece funcionar? Debo estar haciendo algo mal.
El siguiente diagrama muestra el aumento dramático en el número de fallas de página blanda (los picos rojos) cuando la línea verde (el conjunto de trabajo) cayó de 50MB a 30MB.
actualización
Al final, terminamos ignorando el problema, ya que no tuvo impacto en el rendimiento tanto.
Más importante aún, SetProcessWorkingSetSizeEx hace no control de la WorkingSet actual, y es no relacionado de alguna manera con los errores de página suaves. Todo lo que hace es evitar las fallas de páginas duras, al evitar que el WorkingSet actual se pagine en el disco duro.
En otras palabras, si uno quiere reducir las fallas de página de software, SetProcessWorkingSetSizeEx no tiene absolutamente ningún efecto, ya que se refiere a las fallas de páginas duras.
Hay una gran descripción en "Windows a través de C/C++" (Richter) que trata de Windows con la memoria.
¿Cómo espera que el sistema operativo mantenga más páginas en memoria de las que ha asignado? –
@James McNellis Si el SO pudiera mantener más páginas en el WorkingSet, entonces el número de fallas de página disminuiría, lo que aceleraría drásticamente el programa. Tenemos 16 GB de RAM libre en el servidor, y no estaría de más tener 1 GB asignados permanentemente a este proceso (lo que reduciría el número de fallas de página suave a 0). – Contango
@ Gravitas: ¿cómo se asigna y accede a la memoria? – ybungalobill