Ich spezifiziere ein neues MacBook Pro und möchte wissen, wie viel Arbeitsspeicher mein Arbeitspensum benötigt. Ich mache meine Entwicklungsarbeit auf einem 2011er iMac mit 16 GB RAM und möchte wissen, ob ich so viel Speicher für mein neues MBP benötige, da RAM nicht aufrüstbar ist.
Ich habe eine 8-GB-RAM-Disk und eine zufällige 7-GB-Datei erstellt, um den Speicherdruck auf meinem Mac zu sehen:
diskutil erasevolume HFS+ 'RAM Disk' `hdiutil attach -nomount ram://16777216`
dd if=/dev/urandom of=temp_7gb bs=1 count=0 seek=7g
Zu meiner Überraschung hatte es fast keine Auswirkungen auf das Speicherdruckdiagramm im Aktivitätsmonitor! Mache ich das richtig? Wie kann ich simulieren, dass mein aktueller Mac nur 8 GB Arbeitsspeicher hat?
Terminal öffnen, eingeben:
sudo nvram boot-args="maxmem=8192"
und neu starten. Dadurch wird der Arbeitsspeicher auf 8 GiB begrenzt. Beginnen Sie jetzt, Ihren Mac mit der üblichen Arbeitslast zu verwenden.
Um die vollen 16 GiB-RAM wieder zu aktivieren, geben Sie einfach ein sudo nvram -d boot-args
und starten Sie erneut.
Ihr dd-Befehl wird nicht wie beabsichtigt funktionieren, da die Anzahl der geschriebenen Blöcke 0 ist (count=0) und die Blockgröße 1 Byte (bs=1) wäre. Soweit ich das beurteilen kann, wird im Dateisystemkatalog nur eine "Datei" mit der Größe von 7 GiB erstellt, aber es werden überhaupt keine Daten in die Datei selbst geschrieben. Wenn der Zählwert 1 wäre (count=1), würde 1 Byte Zufallsdaten an die Datei temp_7gb (seek=7g) angehängt.
Das Ziel (of=temp_7gb) ist zweifelhaft. Es erstellt eine Datei im Arbeitsverzeichnis. Sie müssen entweder zuerst in ein Dateisystem auf der RAM-Disk (z. B. cd /Volumes/RAM-Disk/
) wechseln, um die Datei dort zu erstellen, oder direkt auf das RAM-Disk-Gerät schreiben (von=/dev/devX).
dd ist ein Tool, das eher Festplatten-I/O misst als CPU-Last/-Geschwindigkeit oder Speicherverbrauch/-druck.
Mit einer cleveren Kombination von dd-Operanden können Sie es immer noch verwenden, um CPU-Last/Speichernutzung zu simulieren.
if=/dev/urandom or if=/dev/zero
hängen mit der CPU-Geschwindigkeit zusammenof=/dev/null
die Festplatte wird nicht beteiligt sein.bs=x
bestimmt die Speichernutzung (x ist fast proportional zur Speichernutzung)count=y
gibt Ihnen Zeit, Dinge zu testenBeispiele:
dd if=/dev/urandom of=/dev/null bs=1 count=1000
misst hauptsächlich den Systemaufruf-Overhead (einschließlich aller Spectre / Meltdown-Abschwächungen, die Ihr Kernel verwendet, wodurch Systemaufrufe langsamer werden als früher). Kryptografisch starke Zufallszahlen erfordern ebenfalls erhebliche Berechnungen, aber 1 Systemaufruf pro Byte wird dies dominieren. Der Speicherbedarf ist gering (auf meinem System ca. 400 kB)
dd if=/dev/urandom of=/dev/null bs=1g count=10
misst hauptsächlich die CPU-Geschwindigkeit, da viele Zufallsdaten berechnet werden müssen. Der Speicherbedarf ist hoch (auf meinem System etwa 1 GB). bs=1m
wäre ungefähr gleich, würde aber viel weniger Speicher verbrauchen.
dd if=/dev/zero of=/dev/null bs=1g count=10
misst hauptsächlich die Speicherbandbreite (hier ~7 GB/s) für den /dev/zero
Treiber des Kernels, der einen memset
Kernel-Speicherplatz in dd
den Puffer von einfügt. Der Speicherbedarf ~= Puffergröße, die viel größer ist als alle Caches. (Einige Systeme mit Iris Pro-Grafik verfügen über 128 MB oder 256 MB eDRAM; Tests mit bs=128m vs. bs=512m sollten diesen Unterschied zeigen.)
Der Treiber des Kernels /dev/null
verwirft die Daten wahrscheinlich, ohne sie überhaupt zu lesen, sodass Sie nur die Schreibbandbreite des Speichers messen und nicht abwechselnd schreiben und lesen. (Und der Systemaufruf-Overhead sollte vernachlässigbar sein, wenn nur ein Lese- und Schreibvorgang pro 1 GiB gespeichert wird.)
dd if=/dev/zero of=/dev/null bs=32k count=100000
misst hauptsächlich die CPU-Cache-Schreibbandbreite (hier ~13 GB/s) und den Systemaufruf-Overhead. Die CPU hat nicht viel zu rechnen (Nullen!); der Speicherbedarf ist gering (auf meinem System ca. 470 kB).
Die Größe des L1d-Cache beträgt 32 KB. Sie würden denken, bs=24k
es wäre schneller (weil es problemlos in L1d passt, anstatt mehr Räumungen zu haben, weil der Puffer von dd nicht das einzige in L1d ist), aber ein erhöhter Systemaufruf-Overhead pro kopiertem kB könnte es noch schlimmer machen.
Der L2-Cache ist 256 KB groß, der L3-Cache 3 bis 8 MiB. bs=224k
sollte ziemlich gute Bandbreite sehen. Sie können dd
jeden Kern parallel ausführen und die Bandbreite wird skaliert, da L2-Caches im Gegensatz zu gemeinsam genutztem L3 und DRAM pro Kern privat sind. (Auf Xeon-Systemen mit vielen Kernen sind mehrere Kerne erforderlich, um die verfügbare DRAM-Bandbreite zu sättigen, aber auf einem Desktop/Laptop kann ein Kern ziemlich nahe kommen.)
/dev/zero
in 1-GB-Blöcken bringt den Kernel meistens nur dazu, ein großes Memset zu machen. (Und das Ergebnis verwerfen). en.wikipedia.org/wiki/Intel_QuickPath_Interconnect hat ein Diagramm, das zeigt, dass QPI für System <-> DRAM oder CPU ist, nicht für CPU <-> DRAM.bs=32k
Engpässe beim Systemaufruf-Overhead sowie die minimalen Kosten eines 32-kB-Memsets. Mit der Minderung von Spectre + Meltdown ist der Overhead für Systemaufrufe erheblich höher. 13 GB/s sind lächerlich niedrig für Cache-Write-S/W auf einem Kern. Obwohl die L1d-Größe = 32 KB beträgt, wird dd
der Durchsatz wahrscheinlich sinken, wenn Sie ihn auf 24 KB verkleinern, sodass Sie mit größerer Wahrscheinlichkeit alle L1d-Treffer erhalten, keine Räumungen. Oder gehen Sie nach oben, wenn Sie es vergrößern bs=224k
(knapp unter der L2-Größe von 256 KB). Dies sind die Cache-Größen von Intel seit Nehalem.dd
eine Datei bekannter Größe auf einer Ramdisk erstellt, ohne zu hoffen, dass dd selbst Speicher belegen würde. (Nicht komprimierbare Daten von urandom besiegen zswap oder was auch immer, wenn MacOS das tut; ich kenne MacOS überhaupt nicht gut) Oh, außer dass sie versucht haben, eine Sparse-Datei zu erstellen. /Gesichtspalme. (Anscheinend unterstützt MacOS das Speichern von Sparse-Dateien auf HFS+, obwohl HFS+ selbst dies nicht tut)dd if=/dev/urandom of=temp_7gb bs=1 count=0 seek=7g
) ist nutzlos. Es wird nichts geschrieben (count=0) und das richtige Ziel (entweder cd auf RAM-Disk oder ein gültiges von (of=/dev*X*/)) fehlt.count=1
eine Sparse-Datei erstellen, damit es nicht einmal das wahrscheinlich nutzlose Ding macht. Es muss überhaupt nicht gesucht werden, um tatsächlich Null zu füllen, wiebs=1m count=$((7*1024))
Alexander
Mike Henderson
Jörg W Mittag
seek=7g
) und schreibt dann 0 Blöcke (count=0
) der Größe 1 Oktett (size=1
). Mit anderen Worten: Es wird überhaupt nichts geschrieben. Es wird lediglich eine Sparse-Datei mit einem 7G-Loch am Anfang und ansonsten ohne Inhalt erstellt. Die Gesamtgröße der Datei ist vernachlässigbar (im Grunde nur die Metadaten zur Beschreibung des "Lochs").Darren H
Radarbob