Descripción general de los principios de jemalloc

Jemalloc saltó a la fama en el mundo Linux y ha sido portado a múltiples plataformas. El rendimiento de tcmalloc, una estrella en ascenso, es similar a él. Aunque existe Google, el alcance de uso de tcmalloc sigue siendo ligeramente inferior debido a la belleza de jemalloc. Hay muchas interpretaciones de jemalloc en Internet, por lo que no las repetiré una por una, aquí hay algunos puntos clave para analizar.

1. Acceso a la dirección
El primer parámetro de malloc y free es la dirección de memoria. ¿Cómo localizar rápidamente la dirección base del bloque de memoria al que pertenece la dirección? En la asignación de memoria de alta frecuencia, esta es la primera prioridad. jemalloc usa un truco simple, chunk = addr & (~chunksize_mask), para garantizar que el direccionamiento se pueda realizar en O(1). En esta fórmula, existe una premisa muy vaga de que la dirección del fragmento debe poder cumplir con el formato como 0xaabb0000, y el número de ceros al final debe ser mayor o igual al número de F en chunksize_mask.
Cuando jemalloc asigna, hará tal intento, alloc_size = size + aligment - PAGE_SIZE, y luego eliminará el encabezado para garantizar que la dirección del fragmento cumpla con esta condición. De lo contrario, devuelva la dirección de memoria redundante al sistema.

2. Gestión de páginas de memoria.
Los objetos pequeños se pueden asignar a fragmentos mediante trucos, pero no hay forma de utilizar el truco anterior para el direccionamiento de fragmentos. Jemalloc utiliza un árbol de base de tres capas, por lo que la eficiencia de la búsqueda sigue siendo bastante alta, pero debe bloquearse al agregar, eliminar, modificar y verificar. El bloqueo afectará la eficiencia, pero debido a que el número de veces es relativamente pequeño, no tendrá mucho impacto. Cabe señalar que después de la asignación, los nodos del árbol de base global de jemalloc no se liberan hasta que finaliza el proceso final. Desde el sistema, jemalloc se aplica en función de 4M cada vez.

3. Alineación de longitud
En escenarios reales, el tamaño de byte solicitado para la asignación es aleatorio. Si se asigna de acuerdo con el tamaño real, es fácil provocar interrupciones en las páginas de memoria que faltan, por lo que se requiere alineación de bytes. En jemalloc, no se trata de una alineación de bytes fija, sino de acuerdo con la lógica de la siguiente tabla:
número de serie
rango de tamaño
alineación de bytes
0
[0--16]
8
1
(16, 128]
dieciséis
2
(128, 256]
32
3
(256, 512]
64

4. Concurso de hilos
Durante la asignación de memoria, los bloqueos hacen que los subprocesos esperen, lo que tiene un gran impacto en el rendimiento. Jemalloc utiliza dos medidas para evitar la aparición de bloqueos de competencia de subprocesos:
1. Al utilizar variables de subproceso, cada subproceso tiene su propio administrador de memoria y la asignación se completa dentro de este subproceso, por lo que no es necesario competir con otros subprocesos.
2. La arena asigna una matriz y cada hilo corresponde a un elemento de la matriz mediante el mapeo del número de hilo. De esta forma, se reduce la probabilidad de que varios subprocesos compitan por un elemento.
Es un poco sorprendente que jemalloc básicamente no use operaciones atómicas y todos los bloqueos usen mutex con mayor granularidad. Este tipo de bloqueo de grano grueso solo es necesario cuando necesita esperar mucho tiempo, como cuando está atrapado en el sistema. Hay mucha información relacionada con la arena, que se puede encontrar en línea.

5. Proceso de asignación
Suponemos un escenario de aplicación donde se va a asignar un bloque de memoria de tamaño TAMAÑO, el proceso es el siguiente:
1. Seleccione una arena o tchache.
2. Calcule la longitud de alineación correspondiente, consulte la Sección 3, y calcule los subíndices de los contenedores en la arena de acuerdo con la longitud de alineación.
3. En contenedores, si runccur está disponible, asigne en runcur; de lo contrario, elija una de las ejecuciones.
4. A partir de la ejecución seleccionada, calcule el mapa de bits, obtenga la región libre y regrese.



Jemalloc saltó a la fama en el mundo Linux y ha sido portado a múltiples plataformas. El rendimiento de tcmalloc, una estrella en ascenso, es similar a él. Aunque existe Google, el alcance de uso de tcmalloc sigue siendo ligeramente inferior debido a la belleza de jemalloc. Hay muchas interpretaciones de jemalloc en Internet, por lo que no las repetiré una por una, aquí hay algunos puntos clave para analizar.

1. Acceso a la dirección
El primer parámetro de malloc y free es la dirección de memoria. ¿Cómo localizar rápidamente la dirección base del bloque de memoria al que pertenece la dirección? En la asignación de memoria de alta frecuencia, esta es la primera prioridad. jemalloc usa un truco simple, chunk = addr & (~chunksize_mask), para garantizar que el direccionamiento se pueda realizar en O(1). En esta fórmula, existe una premisa muy vaga de que la dirección del fragmento debe poder cumplir con el formato como 0xaabb0000, y el número de ceros al final debe ser mayor o igual al número de F en chunksize_mask.
Cuando jemalloc asigna, hará tal intento, alloc_size = size + aligment - PAGE_SIZE, y luego eliminará el encabezado para garantizar que la dirección del fragmento cumpla con esta condición. De lo contrario, devuelva la dirección de memoria redundante al sistema.

2. Gestión de páginas de memoria.
Los objetos pequeños se pueden asignar a fragmentos mediante trucos, pero no hay forma de utilizar el truco anterior para el direccionamiento de fragmentos. Jemalloc utiliza un árbol de base de tres capas, por lo que la eficiencia de la búsqueda sigue siendo bastante alta, pero debe bloquearse al agregar, eliminar, modificar y verificar. El bloqueo afectará la eficiencia, pero debido a que el número de veces es relativamente pequeño, no tendrá mucho impacto. Cabe señalar que después de la asignación, los nodos del árbol de base global de jemalloc no se liberan hasta que finaliza el proceso final. Desde el sistema, jemalloc se aplica en función de 4M cada vez.

3. Alineación de longitud
En escenarios reales, el tamaño de byte solicitado para la asignación es aleatorio. Si se asigna de acuerdo con el tamaño real, es fácil provocar interrupciones en las páginas de memoria que faltan, por lo que se requiere alineación de bytes. En jemalloc, no se trata de una alineación de bytes fija, sino de acuerdo con la lógica de la siguiente tabla:
número de serie
rango de tamaño
alineación de bytes
0
[0--16]
8
1
(16, 128]
dieciséis
2
(128, 256]
32
3
(256, 512]
64

4. Concurso de hilos
Durante la asignación de memoria, los bloqueos hacen que los subprocesos esperen, lo que tiene un gran impacto en el rendimiento. Jemalloc utiliza dos medidas para evitar la aparición de bloqueos de competencia de subprocesos:
1. Al utilizar variables de subproceso, cada subproceso tiene su propio administrador de memoria y la asignación se completa dentro de este subproceso, por lo que no es necesario competir con otros subprocesos.
2. La arena asigna una matriz y cada hilo corresponde a un elemento de la matriz mediante el mapeo del número de hilo. De esta forma, se reduce la probabilidad de que varios subprocesos compitan por un elemento.
Es un poco sorprendente que jemalloc básicamente no use operaciones atómicas y todos los bloqueos usen mutex con mayor granularidad. Este tipo de bloqueo de grano grueso solo es necesario cuando necesita esperar mucho tiempo, como cuando está atrapado en el sistema. Hay mucha información relacionada con la arena, que se puede encontrar en línea.

5. Proceso de asignación
Suponemos un escenario de aplicación donde se va a asignar un bloque de memoria de tamaño TAMAÑO, el proceso es el siguiente:
1. Seleccione una arena o tchache.
2. Calcule la longitud de alineación correspondiente, consulte la Sección 3, y calcule los subíndices de los contenedores en la arena de acuerdo con la longitud de alineación.
3. En contenedores, si runccur está disponible, asigne en runcur; de lo contrario, elija una de las ejecuciones.
4. A partir de la ejecución seleccionada, calcule el mapa de bits, obtenga la región libre y regrese.



Supongo que te gusta

Origin blog.csdn.net/yc7369/article/details/124366827
Recomendado
Clasificación