Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

279
Vistas
Medición de la sobrecarga de bloqueos de tablas de páginas en C/C++

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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:

  1. Si solo está tratando de enfatizar las tablas de páginas, es posible que también desee desactivar las Páginas enormes transparentes dentro de ese proceso. (La llamada al sistema que hay que buscar es prnctl con el indicador DISABLE_THP). Ejecute esto antes de generar cualquier proceso secundario.
  2. Fijar subprocesos a núcleos mediante cpuset.
  3. Desea controlar explícitamente su región de interés, por lo que desea elegir direcciones específicas para cada hilo que comparten la misma tabla de páginas. De esta manera, se asegura de que se utiliza el número máximo de bloqueos.
  4. Use una función pseudoaleatoria para escribir en la ubicación que tiene una semilla diferente para cada subproceso.
  5. Compare con una línea de base que hace exactamente lo mismo pero que tiene partes muy diferentes del espacio de direcciones que están estresadas.
  6. Asegúrese de que la diferencia entre la línea de base y la carga de trabajo excesivamente satisfecha sea mínima.
  7. No suscriba en exceso el procesador, esto generará una sobrecarga debido a los cambios de contexto que son notorios para erradicar.
  8. Asegúrese de comenzar a capturar el tiempo después de que se creen los subprocesos y deténgalo antes de que se destruyan.

¿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:

  1. Use mmap y acceda explícitamente a la ubicación asignada para controlar realmente la asignación de páginas individuales.
  2. La compacidad de las direcciones determina qué bloqueos se adquieren.
  3. Medir las cosas del núcleo y la memoria virtual requiere una disciplina estricta en el procedimiento de referencia.
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda