Hay dos bloqueos en los niveles PMD y PTE de la tabla de páginas en el kernel de Linux. Cada vez que un subproceso/proceso asigna/asigna una memoria, debe contener uno de estos bloqueos para actualizar la tabla de páginas en consecuencia. Es obvio que a medida que aumenta el número de subprocesos, también aumenta la carrera por mantener los bloqueos. Esto puede degradar el rendimiento del mapeo de memoria ya que muchos subprocesos mantienen el spinlock.
Lo que me gustaría medir para una tarea es la sobrecarga en el peor de los casos de estos bloqueos en el rendimiento del mapeo de memoria, pero no tengo idea de cómo medirlo.
Intenté usar malloc en un infinite-loop medida que aumentaba la cantidad de subprocesos que ejecutan el mismo ciclo. Compruebo /proc/{pid}/maps para cada conjunto de subprocesos en ejecución para contar la cantidad de memorias asignadas. Pero no estoy seguro si es la forma correcta. Además, este método consume mucha memoria.
¿Hay alguna forma eficiente de medir la sobrecarga de estos bloqueos en el peor de los casos?
Muchos de los comentarios son correctos, sin embargo, pensé que podría intentar una respuesta completa. En primer lugar, el uso de malloc no le permitirá tener un control explícito sobre las asignaciones de página, ya que un comentario decía que la parte malloc de stdlib en realidad asignará una gran cantidad de memoria después de la primera asignación. En segundo lugar, al crear un nuevo subproceso, este utilizará el mismo espacio de direcciones, por lo que no se crearán asignaciones adicionales.
Voy a suponer que desea hacer esto desde el espacio del usuario, porque desde el espacio del kernel, puede hacer muchas cosas para hacer que esta exploración sea algo degenerada (por ejemplo, puede intentar mapear páginas en la misma ubicación). En su lugar, desea asignar páginas anónimas utilizando mmap. Mmap es una llamada explícita para crear una entrada de memoria virtual de modo que cuando se acceda a esa página en particular por primera vez, el núcleo pueda poner algo de memoria física en blanco en esa ubicación. Es el primer acceso a esa ubicación el que causa la falla, y ese primer acceso es el que realmente usará los bloqueos en el PTE y PUD.
Garantizar un buen procedimiento de evaluación comparativa:
¿Qué se traduce esto en cada hilo?
address = <per-thread address> total = 0; for(int i = 0; i < N; i++) { uint64_t* x = (uint64_t*) mmap((void*) address, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS, -1, 0); //Maps one page anonymously assert(x); *x ^= pseudo_rand(); // Accesses the page and causes the allocation total += *x; // For fun int res = munmap((void*) x, 4096); //Deallocates the page (similar locks) assert(!res); }Las grandes conclusiones son:
mmap y acceda explícitamente a la ubicación asignada para controlar realmente la asignación de páginas individuales.