Intercambie el tamaño de la partición en una computadora RAM de 64 GB para un trabajo de memoria intensiva

36

Tengo 64 GB de RAM y 240 GB de SSD en mi computadora, que voy a usar para cálculos intensivos en memoria (aprendizaje automático, minería de datos, etc.). La mayoría de los consejos que encontré en Internet son sobre computadoras de 2-4-8 GB de RAM, y recomiendan 2 veces el tamaño de la partición de intercambio de RAM (128 GB).

¿Es razonable hacer una partición de intercambio de 128 GB? ¿Qué ventajas obtengo al hacer una gran partición de intercambio?

¿Entiendo correctamente que, en caso de que me quede sin RAM física:

  1. Si no tengo intercambio, aparece un error de "falta de memoria"
  2. Si tengo intercambio, algunas de las páginas de RAM se copiarán en la partición de intercambio, y el programa continuará ejecutándose (aunque más lentamente).

Algunas personas dicen que es una mala idea hacer un intercambio en SSD, ya que tiene una cantidad limitada de ciclos de lectura / escritura. ¿Qué tan rápido usando el intercambio agotará los ciclos de lectura / escritura de SSD (que yo sepa, son alrededor de 50000 IOPS de escritura)?

Estoy usando Linux ( Ubuntu 14.04 (Trusty Tahr)).

Establecer un intercambio de 16 GB por ahora, como seguramente debería ser suficiente (por ejemplo, RedHat sugiere 4 GB), y 16 GB de espacio en disco no es realmente un gran problema.

wrwt
fuente
1
En lugar de confiar explícitamente en el intercambio, si conoce el tamaño de su configuración de trabajo por adelantado, o está dispuesto a hacer un poco más de administración de memoria de bajo nivel, considere usar mmappara asignar sus páginas de configuración de trabajo. Entonces su cantidad de intercambio será exactamente la cantidad que necesita para su proceso.
esponjoso
55
El consejo que recomienda "dos veces la cantidad de RAM" se remonta a los viejos tiempos, cuando las computadoras tenían poca RAM. Varios documentos indican que es principalmente aplicable a computadoras con <2 GB de RAM. Por encima de eso, el tamaño de intercambio está relacionado principalmente con lo que está haciendo con la máquina.
John WH Smith
Consulte también estas preguntas y respuestas sobre la falla del servidor : si está ejecutando Java (y posiblemente otras aplicaciones), debe asegurarse de tener suficiente intercambio para que aumenten sus asignaciones de memoria. Personalmente me quedo con el estándar RHEL de RAM + 2 para mi partición de intercambio
warren
2
Es una pena que la mayoría de los comentarios aquí hayan sido eliminados. Agregar nuevamente: Vale la pena mencionar, por cierto, que si su núcleo lo admite, es posible que desee montar su partición de intercambio discarden un SSD. Además (y esto se mencionó en una respuesta a continuación), no olvide que puede usar un archivo en lugar de una partición para una administración potencialmente más fácil (y no afecta el rendimiento de un SSD debido, por ejemplo, a la fragmentación).
Jason C
1
Si tiene una aplicación de memoria intensiva, como el aprendizaje de SVM, y se queda sin memoria RAM y comienza a intercambiar, todo se volverá demasiado lento para recuperarse y su único movimiento disponible será desconectarlo (eso me sucedió un par de veces) . Probablemente desee que su proceso sea eliminado por OOM si comienza a intercambiarse, para que al menos pueda cambiar las cosas y comenzar de nuevo. Quizás con las unidades SSD no sea tan malo. También verificaría la configuración de OOMK: me sucedió en Ubuntu que a veces los procesos se desactivaron cuando todavía quedaba suficiente memoria RAM porque se asignaron agresivamente
Pqnet

Respuestas:

36

Probablemente solo necesite una pequeña cantidad de intercambio. Cuando tenga suficiente RAM para el conjunto de trabajo típico de su computadora, lo cual estoy bastante seguro de que tiene, solo necesita cambiar por dos cosas:

  1. Necesita cambiar para obtener información a la que probablemente nunca se accederá fuera de la RAM para liberar más espacio para el caché de disco. Muchas aplicaciones se ejecutan al inicio del sistema y nunca se volverá a acceder a ellas. No quieres que las páginas que ensuciaron se peguen en la RAM para siempre. Por lo tanto, necesita intercambiar para mantenerlos.

  2. Necesita cambiar para cubrir las asignaciones que nunca se completarán. Este espacio simplemente tiene que estar disponible, aunque no se utilizará. Sin él, el sistema tendrá que negarse a asignar memoria incluso cuando tenga suficiente RAM física libre porque no tiene suficiente almacenamiento de respaldo para permitir que todas sus asignaciones se usen a la vez.

Ninguno de estos requiere una gran cantidad de intercambio. 16 GB, por ejemplo, deberían ser más que suficientes. El propósito no es permitirle ejecutar conjuntos de trabajo más grandes a costa de la velocidad. El propósito es permitirle usar su 64GB de manera efectiva y no tener que obstruirlo con basura o reservarlo para casos extremos que nunca sucederán.

(Estoy de acuerdo con Bert en que es probable que 4 GB sean suficientes).

David Schwartz
fuente
2
@wrwt Coloque su partición de intercambio al final de la unidad (o al menos después de su partición de datos), hará que el cambio de tamaño sea más rápido y menos intensivo en escritura si alguna vez elige ajustarla (más específicamente, hará que cambiar el tamaño de la partición de datos para acomodarlo más simple, ya que no tiene que mover el inicio). No existe un vínculo entre la posición y el rendimiento en las unidades SSD, como a veces existe en las unidades mecánicas.
Jason C
Si bien esta respuesta probablemente sea suficiente para la mayoría de los aficionados, entonces es un mal consejo para servidores reales: la respuesta depende de cómo esté escrita la aplicación, porque quedarse sin espacio de intercambio hará que el asesino sin memoria se inicie y termine un proceso al azar (sí, has leído bien; "al azar")
Soren
3
@Soren Esto es superusuario, no servidor predeterminado. ;) Es cierto que configurar el espacio de intercambio no es la única decisión que debe tomar para "servidores reales". También debe tomar decisiones sobre cosas como el exceso de compromiso, puede que necesite ajustar el asesino OOM, y así sucesivamente. (Y las respuestas se vuelven mucho más complicadas si espera que su conjunto de trabajo exceda la RAM física. Pero casi nadie opera más máquinas de esa manera.)
David Schwartz
55
Linux sobrecomprometirá la memoria incluso sin ningún intercambio habilitado. Simplemente procesará OOMK cuando se use demasiada memoria. Entonces el segundo punto de la respuesta es incorrecto.
Ruslan
1
@MaciejPiechotka O use un archivo.
Jason C
29

RedHat recomienda 4 GB en una máquina con 64 GB .

Sin embargo, el cambio de tamaño es más un arte que una ciencia. Depende de para qué se usa la máquina, cuánto espacio en disco y memoria tiene, y otros factores. Recuerde, siempre puede agregar más intercambio más tarde.

El uso de la regla de memoria física 2X está desactualizado con la cantidad de sistemas de memoria que tienen estos días. Pero no se recomienda ejecutar con intercambio cero a menos que sepa lo que está haciendo. La recomendación de 4 GB es un buen punto de partida.

Bert
fuente
12
+1 para el último párrafo. La recomendación 2x ​​se remonta a cuando la mayoría de las computadoras no tenían suficiente memoria RAM para evitar el intercambio en el uso normal. Subjetivamente, por el uso de computadoras, el límite de 2x parece haber sido seleccionado como un número lo suficientemente grande como para que la computadora se vuelva inusualmente lenta antes de quedarse sin intercambio.
Dan Neely
1
2X también funcionó bien cuando los sistemas tenían 4GB / 8GB de RAM y cientos de gigabytes de espacio en disco. Claro, probablemente fue más de lo necesario, pero ¿cuál fue el daño? Pero ahora que los sistemas tienen 16 GB / 64 GB de RAM y SSD de 128 GB / 256 GB, el daño es obvio.
David Schwartz
12

En Linux, necesita suficiente intercambio para que la memoria virtual total disponible (RAM + SWAP) sea suficiente para todos los procesos que desea ejecutar a la vez y su huella virtual máxima.

Si tiene menos intercambio que este, o ningún intercambio, entonces ocurre la siguiente situación: el sistema se queda sin memoria tratando de asignar una página. Pero, esto sigue siendo una falla suave aunque no haya intercambio, porque el sistema tiene muchas páginas "víctimas" que pueden eliminarse para hacer espacio: es decir, las páginas de todas las asignaciones de memoria respaldadas por archivos, como los ejecutables y bibliotecas compartidas!

A medida que su sistema demanda más y más espacio para datos (que no se pueden intercambiar), evacuará cada vez más el código ejecutable (bibliotecas y ejecutables compartidos), lo que provocará una terrible sacudida, ya que el conjunto de trabajo se recorta en un conjunto más y más ajustado de páginas

El espacio de intercambio suaviza este problema al proporcionar un lugar para intercambiar páginas anónimas (no mapeadas de archivos): las páginas utilizadas para las asignaciones de memoria, de modo que el código ejecutable pueda permanecer en la memoria.

Aun así, si no ejecuta con frecuencia tareas de uso intensivo de memoria, es posible que pueda ejecutar sin intercambio la mayor parte del tiempo y configurar manualmente un archivo de intercambio (en lugar de una partición dedicada) cuando lo necesite. Para hacer un archivo de intercambio sobre la marcha, conviértase en root y:

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

Cuando ya no lo necesites:

swapoff /path/to/swapfile
rm /path/to/swapfile

Notas:

  1. Definitivamente no necesita configurar al menos tanto intercambio como RAM. Esta regla general se remonta a los sistemas operativos donde era un requisito difícil debido a la forma en que se diseñó el intercambio.

  2. Hay maneras de hacer que Linux falle con dificultad cuando no hay memoria disponible, es decir, mediante la manipulación de los valores de estas entradas de sysctl:

    vm.overcommit_memory
    vm.overcommit_ratio
    
Kaz
fuente
2
+1 para referirse realmente a los parámetros de configuración del kernel: la clave está en la parte de la pregunta If I have no swap, I get an 'out of memory' error, que es false, la verdad es que cuando se queda sin espacio de intercambio, el asesino sin memoria se activará y matará un proceso aleatorio para liberar espacio, por lo que la cantidad de espacio de intercambio necesaria depende de cómo se escriba su solicitud.
Soren
@Soren Es probable que la mayor parte de la RAM se llene con datos reales, por lo que el asesino sin memoria no hará mucha diferencia. Gracias por 'la verdad' de todos modos.
escrito el
3

Hay más consideraciones. Si necesita / desea suspender para trabajar, necesita al menos el tamaño de su RAM y algo más. Sin embargo, parece poco probable que lo necesite, dado que parece construir principalmente un caballo de trabajo computacional.

En este caso, considere usar un archivo de intercambio en lugar de una partición. No necesita preocuparse demasiado por el tamaño, deshacerse de él o agregarlo más tarde no requiere ningún reparto. No hay penalización de rendimiento (notable) al usar un archivo sobre una partición. Si alguna vez lo necesita, eche un vistazo al tamaño y esto también le dará buenos consejos.

kaste
fuente
1
@Kaz Creo que estás hablando de algo diferente al kaste. kaste dice que si desea poder suspender / hibernar su computadora, apagarla y retomarla donde la dejó más tarde, necesita suficiente espacio de intercambio para almacenar toda su RAM (¿de lo contrario, dónde iría?).
amalloy
@amalloy Si almacenó su RAM en su espacio de intercambio, ¿a dónde va el intercambio (recordando que el intercambio se trata como memoria, si se pierde es lo mismo que perder el ram).
NPSF3000
2

La carga de trabajo que desea aplicar a la máquina necesita una cierta cantidad de memoria para ejecutarse (recuerde agregar suficiente a la ecuación para manejar las cargas máximas), y necesita configurar su computadora para tener al menos eso.

Los sistemas operativos modernos proporcionan memoria virtual como una combinación de memoria física y espacio de intercambio, por lo que si necesita más memoria de la que tiene disponible la máquina, debe agregar suficiente espacio de intercambio para llenar el vacío. Es decir, si necesita 80 GB como máximo y la máquina tiene 64 GB, necesita un intercambio de 16 GB.

Por lo general, los instaladores del sistema operativo le piden que realice un área de intercambio inicial (ya que es la más simple y permite que incluso las computadoras pequeñas se instalen), y se ha encontrado que una buena regla general para las operaciones típicas de Unix es tener un tamaño de memoria virtual tres veces la memoria física, por lo que esto generalmente se sugiere. Sin embargo, usted sabe más sobre el patrón de uso para que pueda cambiarlo según corresponda.

No hay nada de malo en trabajar sin espacio de intercambio si la presión de su memoria siempre es menor. Linux usará de forma transparente cualquier memoria no utilizada como caché de disco.

Thorbjørn Ravn Andersen
fuente
2

Una idea mucho mejor que tener "mucho intercambio" es (re) organizar su trabajo para que los conjuntos de trabajo quepan en la memoria, luego usar el sistema de archivos para almacenar y recuperar el trabajo que realiza. Es decir, en lugar de obligar al sistema operativo a adivinar cuáles serán sus patrones de uso de memoria, use lo que sabe sobre sus problemas para controlar sus patrones de uso de memoria.

Como un ejemplo aleatorio que es inmediatamente relevante para mí este verano ... Al implementar el tamiz cuadrático, uno necesita una matriz contigua (aparentemente) grande para marcar (con algún algoritmo complicado cuyos detalles en realidad no importan para este ejemplo). La matriz debe tener ~ 100 Giga-entradas, tan fácilmente en el rango de 1 TB. Podría pretender asignar eso y dejar que el sistema operativo realice una cantidad increíble de intercambio ineficiente para que las páginas entren y salgan de la RAM para admitir todas las escrituras secuenciales a través de la matriz. En lugar de hacer algo descabellado, he dispuesto asignar una matriz mucho más pequeña que se ajuste exactamente en la memoria y luego reutilizar esa pequeña matriz para cubrir iterativamente el resto de la gran matriz en sectores. También eliminé el sistema operativo, eliminé el conjunto de servicios en ejecución, reemplacé el shell,

El SSD puede ser rápido, pero no es tan rápido como organizar su computación para realizar el mismo conjunto de operaciones sin tener que detenerse para intercambiar.

Eric Towers
fuente
1

Como los otros mencionaron, una partición de intercambio es una buena idea incluso si tiene mucha RAM. No es una buena idea ponerlo en un SSD; las escrituras frecuentes de una partición de intercambio eventualmente desgastarán su unidad.

Si tiene un puerto USB 3.0 de repuesto, sugeriría usar una unidad flash para su espacio de intercambio. Hay muchas unidades flash de alta velocidad que son tan rápidas como su SSD, pero mucho más baratas, lo suficientemente baratas como para reemplazarlas si comienzan a fallar. Una búsqueda rápida en Amazon muestra que hay muchas unidades flash USB 3.0 de 16 GB decentes por menos de $ 20, e incluso algunas unidades de 64 GB por menos de $ 60.

Particione toda la unidad flash como espacio de intercambio, y tendrá espacio de intercambio si lo necesita, y la tranquilidad de saber que la memoria que se escribe repetidamente es fácilmente (y económica) reemplazable.

ArmanX
fuente
3
+1 para no cambiar a SSD, -1 para cambiar a un componente que tiene una vida útil muy corta cuando se usa así.
Aviator45003
1
@TC tiene razón, ArmanX: si está tratando de evitar el uso de flash (SSD), ¿por qué usaría flash en USB? Eso es irracional
warren
2
@TC: No usar SSD para el intercambio debido al desgaste del medio es una leyenda urbana injustificada. El intercambio no ocurre "todo el tiempo", pero rara vez. Además, esto es algo que se ha investigado extensamente en Microsoft después del lanzamiento de Win7 con el resultado de que los patrones de acceso típicos de intercambio son bastante aceptables para SSD (eso es Windows, no Ubuntu, pero es probable que Linux no funcione mucho peor). Tiene cientos (o mil) veces más operaciones de escritura que desgastan su SSD debido a los archivos de registro tontos que nadie está leyendo (generalmente sincronizando cada línea).
Damon
La lógica es defectuosa: si la memoria USB es tan rápida como la SSD, ¿por qué es más barata?
Agent_L
Es un equilibrio. Por un lado, es una buena idea tener un archivo de intercambio. Por otro lado, si un archivo de intercambio desgasta un SSD (lo cual, tiene razón, probablemente no importará), sería mejor usar un reemplazo barato, y una unidad flash por $ 20 es mucho mejor que un SSD por más de $ 100.
ArmanX
1

Estarás bien incluso con 1GiB (y probablemente menos) de intercambio. Mi computadora de trabajo generalmente no usa más de 140-150 MiB. Un gigabyte es un exceso de aprovisionamiento para eso.
A menos que realice tareas de cómputo que requieran conjuntos de datos en cientos de gigabytes y (¡este es importante!) Se accede a los datos de manera más o menos de acceso único, nunca querrá tener un intercambio mucho más grande que eso. Pero, de nuevo, simplemente el mapeo de memoria de un archivo de datos funciona igualmente bien para esa aplicación.

Pero más intercambio ayuda más, ¿verdad? ¡Más de todo siempre es mejor!

Considere qué diferencia hará un intercambio de, digamos, 16GiB (o piense en 64GiB). Si nunca usa estos 16GiB, también podría no tenerlos apartados en primer lugar. Pero si los usas , ¿qué pasa? El disco, en comparación con la memoria principal, es extremadamente lento. Incluso con un SSD SATA-600, transferir 16GiB toma entre 30 y 40 segundos, y 2-4 veces más en algunas otras configuraciones.
Ahora, inevitablemente, alguien objetará que estás entrando y saliendo de una docena de páginas de 4 KB, no 16 GB de una sola vez. Si bien eso es cierto, el punto no obstante se mantiene. Si solo necesita intercambiar un par de páginas, no necesita 16GiB de intercambio, pero si necesita 16GiB de intercambio, entonces también las transferirá (de una forma u otra).

En teoría, el 99.9% de todos los usuarios podrían incluso usar una máquina de 64GiB (o cualquier máquina de 8 + GiB) sin ningún intercambio, y lo más probable es que nunca noten que falta algo. Sin embargo, esto no es aconsejable.
Primero, es subóptimo porque el sistema operativo tiene menos opciones en lo que puede descartar cuando se queda sin memoria física. Hay dos cosas que puede hacer: intercambiar algo que no se usa o tirar páginas de la memoria caché del búfer. Si no tiene intercambio, solo hay una cosa que puede hacer. Tirar páginas de la memoria caché del búfer es inofensivo, pero puede afectar notablemente el rendimiento.
En segundo lugar, las asignaciones anónimas privadas simplemente pueden fallar si no hay intercambio. Eso generalmente no sucederá, pero eventualmente cuando no hay suficiente memoria física disponible para satisfacerlos a todos, y no hay intercambio, el sistema operativo solo tiene esta opción, excepto ...
Tercero, el temido asesino OOM puede entrar en acción Lo que significa que un proceso más o menos aleatorio puede ser asesinado. No gracias. Esto no es algo que quieras que suceda.

Dicho esto, consejos como si necesita un intercambio X veces la cantidad de RAM instalada proviene de personas que repiten algo que escucharon (¡y no entendieron!) De alguien que repitió algo que escucharon (¡y no entendieron!) Décadas hace.
La regla de "usar 2X su RAM" fue una regla práctica fácil de recordar en los años 80 y 90, nunca fue la "verdad dorada" (algo que funcionó bien para la mayoría de los usuarios), y no se aplica en absoluto hoy en día. .

Debe tener una cantidad razonable de intercambio que pueda pagar fácilmente (por ejemplo, un gigabyte), para que el sistema operativo pueda localizar algunas cosas obsoletas, y para que el mundo no termine inmediatamente cuando una vez pide un poco más de memoria. Pero eso es todo.

Damon
fuente