Aufbau der Umgebung zum Bauen und Ausführen von FineMem auf eigener Hardware (2 Knoten, direkt verbundene Mellanox-InfiniBand-Karten).
Repository: https://github.com/ADSLMemoryDisaggregation/FineMem
Ubuntu 22.04.5 LTS mit Linux kernel 5.15 installieren.
MLNX OFED 5.8-7.0.6.1 installieren.
Prüfen, ob der Treiber aktiv ist:
ibdev2netdevFalls keine Ausgabe erscheint:
sudo modprobe ib_ipoibsudo apt update
sudo apt install -y \
build-essential git cmake \
libmemkind-dev libhiredis-dev \
libboost-all-dev libtbb-dev libgtest-dev \
libgflags-dev libgoogle-glog-dev libgoogle-perftools-dev \
libnuma-dev \
redis-server
libibverbsundlibrdmacmwerden ebenfalls benötigt, kommen aber bereits aus MLNX OFED (Schritt 2). Die Ubuntu-Paketerdma-core,libibverbs-devundlibrdmacm-devdürfen nicht nachinstalliert werden – sie deinstallieren Teile des OFED-Stacks.
Alle vier benötigten Bibliotheken müssen gefunden werden:
ldconfig -p | grep -E 'libibverbs|librdmacm|libmemkind|libhiredis'Redis muss vorhanden sein (FineMem startet zur Laufzeit eine eigene Instanz auf der IPoIB-Adresse, der Systemdienst wird nicht benötigt):
redis-server --versionsudo nmcli con add type infiniband ifname ibp101s0 con-name ibp101s0-static \
ipv4.method manual ipv4.addresses 10.10.1.1/24 ipv6.method disabled \
connection.autoconnect yes
sudo nmcli con up ibp101s0-static
ip -br add show ibp101s0Auf dem zweiten Knoten analog mit 10.10.1.2/24.
opensm wird nur benötigt, wenn kein gemanagter IB-Switch im Pfad ist, und dann auch nur auf einem Knoten im Subnetz – bevorzugt auf der Memory Node:
sudo systemctl start opensmecho "10.36.104.115 node1" | sudo tee -a /etc/hosts
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id student@node1
ssh student@node1 hostnameAuf allen Knoten identisch ausführen:
git clone https://github.com/timriedlinger/FineMem-Reproduction.git
cd FineMem
mkdir build && cd build
cmake ..
make -j$(nproc)Ergebnis: build/source/server, build/source/client und die Binaries in
build/microbench/.
Das Repository muss auf allen Knoten im selben Pfad liegen, am besten
unter ~/FineMem. Die Skripte in scripts/ starten ihre Remote-Aufrufe per
SSH aus dem Home-Verzeichnis heraus; relative Pfade sind dadurch knotenweit
nicht stabil. Bei abweichendem Verzeichnis alle Pfade in den Skripten
ersetzen:
cd FineMem/scripts
find -name '*.sh' | xargs perl -pi -e 's|~/FineMem|~/pfad/zu/deinem/FineMem|g'Von der Memory Node (Node 0) aus starten:
cd ~/FineMem/scripts/microbench
./run_different_size_16.sh # Ergebnis: different_size_16.csv
./run_different_thread.sh # Ergebnis: different_thread.csvJeder Lauf dauert rund eine Stunde, bricht ein Skript unplanmäßig ab, vor dem nächsten Versuch Memory- und Compute-Node zurücksetzen:
~/FineMem/scripts/fresh_all.shDer Simulator läuft ohne RDMA-Hardware auf einem einzelnen Rechner. Python-Abhängigkeiten installieren:
sudo apt update && sudo apt install -y python3-pip
pip install numpy scipy sortedcollections matplotlibAnschließend im Simulator-Verzeichnis:
cd ~/FineMem/applications/Swap_FineMem_Sim
python3 draw_remote_mem_usage.py
python3 run_small_traces.py
python3 run_large_traces.py
python3 draw_throughput_improvement_cdf.pyDetails siehe README im Ordner Swap_FineMem_Sim.
Die FUSEE-basierte KV-Store-Evaluation gehört ebenfalls zur Original-Evaluation und wird von der Memory Node aus gestartet:
cd ~/FineMem/scripts/
./batch_build_fusee.sh
./run_fusee_4KB.sh # Ergebnis: fusee_4kb.csv
python3 draw_kv.pyIn dieser Reproduktion haben diese Schritte keine verwertbaren Ergebnisse geliefert. Die Ursache konnte nicht geklärt werden; die zugehörigen Abbildungen des Papers wurden daher nicht reproduziert.
Die Skripte der Original-Evaluation sind auf einen 18-Knoten-Cluster ausgelegt. Auf dem hier verwendeten Aufbau (eine Memory Node und eine Compute Node mit je 16 Kernen) entfallen dadurch zwei Experimente:
| Skript | Grund |
|---|---|
run_different_node.sh |
Benötigt Memory Nodes 0–5 und Compute Nodes 6–17. Es standen nur eine Memory- und eine Compute-Node zur Verfügung. |
run_different_size_128.sh |
Ist für 128 Threads ausgelegt. Die verwendete Maschine hat 16 Kerne; ausgeführt wurde stattdessen run_different_size_16.sh. |