¿Existe alguna relación entre la fragmentación de la memoria y si el intercambio está habilitado o no en un sistema?


8

Una de las respuestas a ¿Necesito espacio de intercambio si tengo una cantidad de RAM más que suficiente? Me pregunté si hay alguna relación entre la fragmentación de la memoria medida por cat /proc/buddyinfo y si el intercambio está en uso o no. Para ser más específico, me pregunto si utilizar el intercambio puede reducir la fragmentación de la memoria. Durante un día normal de trabajo con swap off en mi sistema, tengo esto:

tvbox@tvbox-G31M-ES2L:~$ cat /proc/buddyinfo
Node 0, zone      DMA      3      3      4     14     16      6      2      0      0      1      0 
Node 0, zone   Normal   1564   1052    462    356    240    109     33     21      6      1      0 
Node 0, zone  HighMem     43   1972    839    285    183    109     98     34     16      0      0 
tvbox@tvbox-G31M-ES2L:~$ free
             total       used       free     shared    buffers     cached
Mem:       2053888    1821904     231984     171376     299908     812940
-/+ buffers/cache:     709056    1344832
Swap:            0          0          0

Nota: este sistema tiene un tiempo de actividad que nunca supera las 18 horas.

En un sistema más utilizado tengo esto:

me@me-zippy:~$ cat /proc/buddyinfo
Node 0, zone      DMA    149    106     70     26     15      5      4      0      0      2      0 
Node 0, zone   Normal   2455   3527   4651   1421    367    157     61     19     14      3      0 
Node 0, zone  HighMem      7     43     75    266    166    162     91     43     27      0      0 
me@me-zippy:~$ free -h
             total       used       free     shared    buffers     cached
Mem:          7.4G       7.0G       351M       281M       116M       6.0G
-/+ buffers/cache:       967M       6.4G
Swap:           0B         0B         0B
me@me-zippy:~$ uptime
 12:01:49 up 3 days,  3:20,  2 users,  load average: 0.52, 0.23, 0.17

Notarás que ninguno de estos sistemas tiene habilitado el intercambio.


44
Por curiosidad, ¿por qué importaría si la memoria estuviera fragmentada? No es como un disco duro donde el tiempo de búsqueda importa. La memoria siempre aparecerá lógicamente contigua en el espacio de direcciones virtuales del proceso de todos modos, por lo que el espacio del usuario ni siquiera puede decir si la memoria está fragmentada en el nivel físico. ¿Es porque las tablas de traducción de páginas se vuelven más complicadas?
Celada

Buena pregunta. La condición se planteó como una razón para usar el intercambio. Sigo siendo escéptico, así que estoy buscando cualquier conexión entre la utilización de intercambio y la fragmentación de la memoria. No espero encontrar uno, pero siempre estoy dispuesto a cambiar mi postura ante la nueva información. Puedo terminar respondiendo esto yo mismo después de más pruebas.
Élder Geek

Respuestas:


3

El intercambio permite que las páginas físicas se muevan, en el sentido de que una página utilizada para un propósito podría tener su contenido intercambiado y luego utilizado para otro propósito.

Bajo un sistema de gestión de memoria virtual de gran variedad de jardines, no existe la fragmentación de la memoria física en lo que respecta a las aplicaciones. Cada página asignada por una aplicación puede llevarse a cualquier parte de la memoria física, no hay razón por la cual dos páginas consecutivas en la memoria virtual necesiten tener una cercanía particular en la memoria física.

Hay muchos casos en los que la fragmentación de la memoria es una preocupación: cualquier circunstancia en la que la ubicación de la memoria física sea importante. Esto incluye:

  • Paravirtualización , donde las máquinas virtuales deciden quién posee qué página física con una granularidad que es más gruesa que una página.
  • Del mismo modo, clústeres donde varios nodos comparten el mismo grupo de RAM.
  • Memoria utilizada por los periféricos, que generalmente requiere grandes memorias intermedias contiguas.
  • Optimizaciones como páginas enormes .

En ausencia de escenarios "complejos", la fragmentación de la memoria física podría ocasionar problemas al conectar un nuevo dispositivo que requiere un conjunto de memoria contigua (el kernel mantiene esos conjuntos para eso, pero podrían necesitar ampliarse si un controlador de repente hace un gran solicitud). Si el uso del dispositivo es constante, la fragmentación física no importaría y, en particular, no haría que una aplicación se ejecute más lentamente o se quede sin espacio.

Es posible que la fragmentación del espacio de direcciones físicas provoque que se use más memoria en el núcleo para representar la lista libre. No creo que este sea el caso en Linux, pero estoy lejos de ser un experto en la gestión de la memoria.

En resumen, permitir que parte de una aplicación se intercambie no permite que esta aplicación asigne más memoria, pero podría permitir que algunos controladores de hardware asignen la memoria que necesitan.

Agregar intercambio no tiene ningún efecto en el espacio de memoria virtual de la aplicación. Ese es el punto de intercambio, después de todo: es transparente para las aplicaciones.

Sin embargo, es posible que agregar swap a una máquina tenga una influencia indirecta en la fragmentación dentro del espacio de memoria virtual de una aplicación. Si el sistema se queda sin memoria virtual, entonces la aplicación tendrá que conformarse con lo que tiene. Si la aplicación usa la mayor parte de la memoria que asignó del sistema operativo, con el tiempo esto causará fragmentación dentro de ese espacio a medida que se liberan pequeños bloques aquí y allá. Si la aplicación tiene más memoria virtual (parte de la cual se intercambia), esto le da al administrador de memoria más espacio para maniobrar y, por lo tanto, reduce el riesgo de que la aplicación se quede sin memoria, con tres bloques separados de 2kB disponibles cuando quería un solo Objeto de 4kB.


¿No es interesante cómo cada respuesta lleva a una nueva pregunta? Ahora siento curiosidad por el orden de las operaciones de administración de memoria y qué técnicas para liberar memoria tienen que fallar antes de que se alcance una condición de falta de memoria. Mi suposición es que el caché es lo menos importante y sería arrojado primero. Sé que hay un núcleo de verdad aquí en alguna parte (juego de palabras). ;-)
Élder Geek

@ElderGeek - Documentation / cgroups / memory.txt es probablemente un buen lugar para comenzar. Aunque está irremediablemente desactualizado , presenta una descripción general bastante buena del controlador de memoria del núcleo.
mikeserv

@mikeserv Gracias por eso. También encontré - landley.net/writing/memory-faq.txt, que también parece estar "irremediablemente desactualizado", pero al menos parece que mi teoría sobre el vertido lógico de caché primero para liberar RAM antes de recurrir a matar Los procesos son precisos. Dudo que aprenda mucho más al respecto sin profundizar en el código en sí. Eso podría estar un poco más allá de mí, ya que no he escrito ningún código más allá de las secuencias de comandos bash durante décadas ...
Élder Geek
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.