6 votos

Prueba de esfuerzo de la memoria RAM

Estoy especificando un nuevo MacBook Pro y quiero saber cuánta memoria requiere mi carga de trabajo. Estoy haciendo mi trabajo de desarrollo en un iMac de 2011 con 16 GB de RAM y quiero saber si necesito tanta memoria para mi nuevo MBP ya que la RAM no es actualizable.

He creado un disco de 8GB de RAM y un archivo aleatorio de 7GB para ver la presión de la memoria en mi Mac:

diskutil erasevolume HFS+ 'RAM Disk' `hdiutil attach -nomount ram://16777216`
dd if=/dev/urandom of=temp_7gb bs=1 count=0 seek=7g

Para mi sorpresa, ¡no tuvo casi ningún impacto en el gráfico de presión de la memoria en el Monitor de Actividad! ¿Estoy haciendo esto bien? ¿Cómo puedo simular que mi actual Mac sólo tiene 8 GB de memoria?

9 votos

Yo sería cauteloso con la compra de un ordenador con "sólo 8 GB" de RAM en 2019. Mientras que es ciertamente suficiente para la mayoría de las cosas hoy, tienes que pensar en 2-5 años a partir de ahora. Con la prominencia de JavaScript pesado en los sitios, y todo el mundo escribiendo aplicaciones electrónicas de nivel de mierda, la RAM va a ser un recurso valioso para tener.

0 votos

@klanomath es para crear un archivo de 7GB con bytes aleatorios. Lo he cogido de algún foro así que puede que no haga lo que quiero

2 votos

@MikeHenderson: Ese comando se salta los primeros 7G del archivo ( seek=7g ) y luego escribe 0 bloques ( count=0 ) de tamaño 1 octeto ( size=1 ). En otras palabras: no escribirá nada en absoluto. Todo lo que hace es crear un archivo escaso con un agujero de 7G al principio y sin contenido por lo demás. El tamaño total del archivo será insignificante (básicamente sólo los metadatos para describir el "agujero").

14voto

klanomath Puntos 19587

Abre el Terminal, entra:

sudo nvram boot-args="maxmem=8192"

y reiniciar. Esto limitará la RAM a 8 GiB. Ahora comience a utilizar su Mac con la carga de trabajo habitual.

Para volver a habilitar los 16 GiB-RAM completos basta con introducir sudo nvram -d boot-args y reiniciar de nuevo.


Tu comando dd no funcionará como se pretende, porque el número de bloques escritos es 0 (count=0) y el tamaño del bloque sería de 1 Byte (bs=1). Por lo que puedo decir, sólo se crea un "archivo" con el tamaño de 7 GiB en el catálogo del sistema de archivos, pero no se escriben datos en el archivo en sí. Si la cuenta fuera 1 (count=1), se añadiría 1 Byte de datos aleatorios al archivo temp_7gb (seek=7g).

El destino (of=temp_7gb) es dudoso. Crea un archivo en el directorio de trabajo. Tienes que ir a un sistema de archivos en el disco RAM (por ejemplo cd /Volumes/RAM-Disk/ ) primero para crear el archivo allí o escribir directamente en el dispositivo RAM-disco (of=/dev/devX).

dd es una herramienta que mide más la E/S del disco que la carga/velocidad de la CPU o el uso/presión de la memoria.

Con una combinación inteligente de operandos dd todavía se puede utilizar para simular la carga de la CPU / uso de la memoria.

  1. if=/dev/urandom or if=/dev/zero están relacionados con la velocidad de la CPU
  2. of=/dev/null el disco no estará involucrado.
  3. bs=x determina el uso de la memoria (x es casi proporcional al uso de la memoria)
  4. count=y te da tiempo a probar cosas

Ejemplos:

dd if=/dev/urandom of=/dev/null bs=1 count=1000 

mide principalmente la sobrecarga de las llamadas al sistema (incluyendo cualquier mitigación de Spectre / Meltdown que su kernel utilice, que hace que las llamadas al sistema sean más lentas de lo que solían ser). Los números aleatorios criptográficamente fuertes también requieren un cálculo significativo, pero 1 llamada al sistema por byte lo dominará. La huella de memoria es baja (en mi sistema unos 400 kB)

dd if=/dev/urandom of=/dev/null bs=1g count=10

mide principalmente la velocidad de la CPU porque tiene que calcular muchos datos aleatorios. La huella de memoria es alta (en mi sistema alrededor de 1 GB). bs=1m sería más o menos lo mismo, pero utilizaría mucha menos memoria.

dd if=/dev/zero of=/dev/null bs=1g count=10

mide principalmente el ancho de banda de la memoria (aquí ~7 GB/s) para el kernel /dev/zero conductor haciendo un memset en el espacio del núcleo en dd del búfer. La huella de memoria ~= tamaño del buffer, que es mucho mayor que cualquier caché. (Algunos sistemas con gráficos Iris Pro tendrán 128MiB o 256MiB de eDRAM; las pruebas con bs=128m vs. bs=512m deberían mostrar esa diferencia).

El núcleo /dev/null El controlador probablemente descarta los datos sin siquiera leerlos, por lo que sólo está midiendo el ancho de banda de escritura en memoria, no la alternancia de escritura + lectura. (Y la sobrecarga de la llamada al sistema debería ser insignificante con sólo una lectura+escritura por cada 1GiB almacenado).

dd if=/dev/zero of=/dev/null bs=32k count=100000

mide principalmente el ancho de banda de escritura de la caché de la CPU (aquí ~13 GB/s) y la sobrecarga de las llamadas al sistema. La CPU no tiene mucho que computar (¡cero!); la huella de memoria es baja (en mi sistema unos 470 kB).

El tamaño de la caché L1d es de 32kiB. Se podría pensar que bs=24k sería más rápido (porque cabe fácilmente en L1d en lugar de tener más desalojos porque el buffer de dd no es lo único que hay en L1d), pero el aumento de la sobrecarga de llamadas al sistema por kB copiado podría hacerlo peor.

La caché L2 es de 256kiB, la L3 es de 3 a 8 MiB. bs=224k debería ver un buen ancho de banda. Puede ejecutar dd en cada núcleo en paralelo y el ancho de banda escalará porque las cachés L2 son privadas por núcleo, a diferencia de las L3 y DRAM compartidas. (En los sistemas Xeon de muchos núcleos, se necesitan varios núcleos para saturar el ancho de banda disponible de la DRAM, pero en un ordenador de sobremesa/portátil un núcleo puede acercarse bastante).

0 votos

El iMac 2011 del OP tiene una CPU con un controlador de memoria integrado, como todas las CPUs x86 desde entonces. El ancho de banda de la DRAM no es necesariamente el mismo que el del puente sur, y la lectura de /dev/zero en trozos de 1GB es mayormente hacer que el kernel haga un gran memset. (Y descartar el resultado). es.wikipedia.org/wiki/Intel_QuickPath_Interconnect tiene un diagrama que muestra que QPI es para sistema <-> DRAM o CPU, no para CPU <-> DRAM.

0 votos

Y por cierto, bs=32k cuellos de botella en la sobrecarga de las llamadas al sistema tanto como el coste mínimo de un memset de 32kB. Con la mitigación de Spectre + Meltdown, la sobrecarga de las llamadas al sistema es significativamente mayor. 13GB/s es ridículamente bajo para la escritura en caché B/N en un núcleo. Aunque el tamaño de L1d = 32kiB, probablemente verías dd El rendimiento disminuye si se reduce a 24k, por lo que es más probable que se obtengan todos los éxitos de L1d, sin desalojos. O sube si lo aumentas a bs=224k (justo por debajo del tamaño L2 de 256kB). Estos son los tamaños de caché de Intel desde Nehalem.

0 votos

@PeterCordes :-) Mientras escribía el dd-addendum, sabía que algunas afirmaciones podrían ser negrita . Antes de adjuntando a la respuesta que de hecho visitó el artículo de wikipedia vinculado porque yo no sabía realmente, cómo las CPUs modernas están vinculados a la memoria principal (sabía: no FSB + NB más). Lo más importante -lo tenía en la punta de la lengua, pero necesitaba que alguien lo mencionara- son las palabras sobrecarga de la llamada del sistema . Intentaré mejorar la respuesta, siéntase libre de hacer lo mismo (con más experiencia que yo).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X