OpenMPI Multinode Troubleshooting
Catatan: Halaman ini mendokumentasikan proses membangun cluster OpenMPI heterogen (2 laptop x86_64, rencana ditambah HP Android ARM64) dari masalah build OpenMPI sampai masalah koneksi antar-node. Tiap masalah ditulis dengan format Gejala / Penyebab / Solusi. Nilai-nilai (hostname, IP, path) di sini adalah contoh dari setup nyata; sesuaikan dengan punyamu.
Cluster yang dibahas terdiri dari dua laptop yang dihubungkan lewat switch kabel (LAN khusus), masing-masing menjalankan OpenMPI 4.1.5 dari source. Tujuannya menjalankan program MPI + OpenCL (matmul terdistribusi) di mana tiap rank memakai device OpenCL berbeda (GPU NVIDIA di satu node, CPU pocl di node lain).
Lingkungan
| Komponen | Master (darmogandolz) |
Node (tumbal / mpi-node1-amd-a8)
|
|---|---|---|
| Arsitektur | x86_64 | x86_64 |
| OS | Arch Linux | Arch Linux |
| CPU/Device OpenCL | NVIDIA GeForce RTX 3050 (GPU) | AMD A8-6410 APU via pocl (CPU) |
| OpenMPI | 4.1.5 (build dari source) | 4.1.5 (build dari source) |
| Prefix instalasi | /home/haidhi/ompi4 |
/home/haidhi/ompi4
|
| NIC kabel (cluster) | enp8s0 → 192.168.100.1/24 |
eno1 → 192.168.100.2/24
|
| NIC wifi (internet) | wlp0s20f3 → 192.168.1.130/24 |
wlo1 → 192.168.1.156/24
|
Catatan penting: kedua mesin multi-homed punya dua jaringan aktif sekaligus (kabel dan wifi). Fakta ini jadi sumber salah satu masalah di bawah.
Ikhtisar masalah
| # | Tahap | Gejala singkat |
|---|---|---|
| 1 | Build | call to undeclared function 'realloc' (Clang 16+)
|
| 2 | Build | incompatible integer to pointer conversion pada backtrace_symbols
|
| 3 | Launch | orted: command not found
|
| 4 | Launch | Data unpack had inadequate space ... plm_base_launch_support.c
|
| 5 | Koneksi | connect() to ... failed, Operation now in progress (115)
|
Bagian 1: Build OpenMPI
Awalnya OpenMPI 5.0.10 dicoba di-build langsung di Termux (Android). Dua error muncul. Pada akhirnya diputuskan tidak memakai v5 di HP, tapi pencatatan ini tetap berguna karena penyebabnya umum di toolchain modern.
Masalah 1: realloc undeclared (Clang 16+)
Gejala
Saat make, kompilasi gagal:
error: call to undeclared function 'realloc'; ISO C99 and later
do not support implicit function declarations
Penyebab
Clang versi 16 ke atas mengubah -Wimplicit-function-declaration dari warning menjadi error (mengikuti C99). Beberapa berkas sumber memanggil fungsi tanpa #include header yang tepat pada lingkungan Android; di compiler lama ini cuma warning, di Clang baru jadi fatal.
Solusi
Turunkan kembali jadi warning lewat CFLAGS, lalu reconfigure:
export CFLAGS="-Wno-implicit-function-declaration"
./configure --prefix=$HOME/ompi ... # ulang configure agar CFLAGS terpakai
make -j$(nproc)
Aman, karena Clang tetap memakai signature builtin yang benar untuk fungsi standar seperti realloc; yang dimatikan hanya pengetatan diagnostiknya.
Masalah 2: backtrace_symbols (execinfo)
Gejala
error: incompatible integer to pointer conversion ...
(pada kode yang memakai backtrace() / backtrace_symbols())
Penyebab
bionic (libc Android) baru meng-expose <execinfo.h> pada API level ≥ 33. Pada target API Termux yang lebih rendah, deklarasi fungsinya disembunyikan walaupun symbol-nya sebenarnya ada di device Android 13. Karena deklarasi hilang, compiler menebak tipe return jadi int → muncul konversi int-ke-pointer.
Solusi
Beberapa opsi:
# Opsi A: matikan diagnostik (backtrace jadi agak rusak, hanya dipakai saat crash)
export CFLAGS="$CFLAGS -Wno-int-conversion"
# Opsi B: paksa target API agar header execinfo terbuka
export CFLAGS="$CFLAGS -D__ANDROID_API__=33"
Atau yang dipilih akhirnya: hindari masalah ini sama sekali dengan mem-build OpenMPI di laptop, bukan di HP.
Keputusan: standardisasi OpenMPI 4.1.5
Karena build v5 di Termux rewel, diambil keputusan:
- Laptop: build OpenMPI 4.1.5 dari source ke prefix khusus.
- HP: tetap pakai paket Termux (juga seri v4).
Alasan tambahan ada di bagian berikutnya: antar-node, versi MPI wajib cocok.
Syarat: versi & build harus identik antar-node
| Kondisi | Kompatibel? |
|---|---|
| Beda MAJOR (mis. 4.x vs 5.x) | Tidak v4 memakai ORTE, v5 memakai PRRTE; arsitektur runtime beda total |
| Sama MAJOR.MINOR, beda PATCH | Biasanya jalan, tapi tidak dijamin |
| Identik (versi + opsi build) | Paling aman |
Pola build yang dipakai (langkah identik di tiap laptop):
tar xf openmpi-4.1.5.tar.bz2 && cd openmpi-4.1.5
./configure --prefix=$HOME/ompi4 \
--enable-orterun-prefix-by-default \
--with-pmix=internal \
--with-hwloc=internal \
--with-libevent=internal
make -j$(nproc) && make install
Memaksa pmix/hwloc/libevent ke versi internal (bawaan tarball) membuat tiap build self-contained dan dijamin sama wire-format-nya antar-node relevan untuk Masalah 4.
Bagian 2 Launch & koneksi multi-node
Masalah 3: orted: command not found
Gejala
bash: line 1: orted: command not found
--------------------------------------------------------------------------
ORTE was unable to reliably start one or more daemons.
--------------------------------------------------------------------------
Penyebab
Dua hal yang menumpuk:
- Dua instalasi OpenMPI di mesin yang sama (
~/ompidan~/ompi4).PATHmenunjuk ke salah satu, padahal yang di-rebuild / di-configure adalah yang lain. Gejalanya:which mpirunmenunjukkan folder berbeda dari yang dikira. - Sesi SSH non-interaktif tidak punya OpenMPI di PATH. Saat
mpirunSSH ke node remote untuk menjalankanorted, shell non-interaktif tidak menemukanorted. Penyebabnya, banyak~/.bashrcpunya baris di awal:
[[ $- != *i* ]] && return # keluar lebih dulu kalau non-interaktif
- Bash memang membaca
~/.bashrcsaat dipanggil sshd, tetapiexport PATH=...yang ditaruh setelah baris itu jadi terlewat.
Solusi
Cara 1 (disarankan) --prefix:
mpirun --prefix /home/haidhi/ompi4 --hostfile hostfile -np 2 ./app
--prefix membuat mpirun memanggil orted remote lewat path lengkap sekaligus men-set LD_LIBRARY_PATH-nya, jadi PATH remote tidak relevan. Node remote tidak perlu disentuh. Syarat: remote punya OpenMPI di path yang sama. (Atau build dengan --enable-orterun-prefix-by-default agar otomatis.)
Cara 2 perbaiki .bashrc remote:
Taruh export di paling atas ~/.bashrc remote, di atas baris interactive-guard:
# baris paling atas ~/.bashrc
export PATH=$HOME/ompi4/bin:$PATH
export LD_LIBRARY_PATH=$HOME/ompi4/lib:$LD_LIBRARY_PATH
Uji: ssh NODE 'which orted' harus memunculkan path-nya.
Bersihkan ambiguitas: pilih satu instalasi, hapus yang lain (rm -rf ~/ompi), dan samakan PATH di semua tempat. Dua instalasi yang hidup berdampingan adalah akar dari kebingungan ini (dan Masalah 4).
Masalah 4: Data unpack had inadequate space
Gejala
[host:NNN] [[X,0],0] ORTE_ERROR_LOG: Data unpack had inadequate space
in file base/plm_base_launch_support.c at line 1213
--------------------------------------------------------------------------
ORTE was unable to reliably start one or more daemons.
--------------------------------------------------------------------------
Penyebab
Ketidakcocokan wire-format antara mpirun (lokal) dan orted (remote) saat handshake peluncuran. Pesan ini adalah tanda khasnya. Urutan kemungkinan penyebab:
- Beda versi OpenMPI antar-node (paling sering).
- Versi sama, tapi beda build mis. PMIx/hwloc/libevent internal di satu node, eksternal (paket sistem) di node lain. Protokol launch OpenMPI 4.x lewat PMIx, jadi PMIx beda → struktur pesan beda.
- mpirun yang benar-benar jalan ambigu ini kasus nyatanya: ada dua instalasi (
~/ompivs~/ompi4), dan job ter-launch dengan mpirun dari satu instalasi tetapiorteddari instalasi lain (lewat--prefixyang menunjuk folder berbeda).
Diagnosis
Bandingkan versi dan build di kedua sisi:
# versi
/home/haidhi/ompi4/bin/mpirun --version
ssh NODE '/home/haidhi/ompi4/bin/mpirun --version'
# build + PMIx (perhatikan baris "Configure command line")
/home/haidhi/ompi4/bin/ompi_info | grep -iE 'configure command|pmix'
ssh NODE '/home/haidhi/ompi4/bin/ompi_info | grep -iE "configure command|pmix"'
Pada kasus ini versi (4.1.5), configure command line, dan PMIx (pmix3x internal) ternyata identik di dua node jadi yang salah bukan build ompi4-nya, melainkan mpirun mana yang dipakai.
Solusi
Buang ambiguitas: paksa lokal = ompi4 lewat path lengkap + LD_LIBRARY_PATH eksplisit, dan pastikan semua node memakai instalasi identik di path sama:
LD_LIBRARY_PATH=/home/haidhi/ompi4/lib \
/home/haidhi/ompi4/bin/mpirun --prefix /home/haidhi/ompi4 \
--hostfile hostfile -np 2 ./app
Kalau memang build-nya beda dependency: rebuild semua node dengan --with-pmix=internal --with-hwloc=internal --with-libevent=internal agar self-contained dan seragam (lihat bagian standardisasi). Solusi permanen: kunci path mpirun di Makefile (lihat Konfigurasi final).
Masalah 5: connect() Operation now in progress (115)
Gejala
Kedua rank launch dan device OpenCL terdeteksi, tapi lalu:
WARNING: Open MPI failed to TCP connect to a peer MPI process.
Local host: tumbal
Message: connect() to 192.168.1.130:1024 failed
Error: Operation now in progress (115)
Penyebab
- Mesin multi-homed. Kedua node punya dua jaringan UP: kabel
192.168.100.x(switch cluster) dan wifi192.168.1.x(router rumah).mpirunpolos mencoba semua interface dan nyasar ke wifi. Perhatikan IP gagal192.168.1.130itu IP wifi master. - "Operation now in progress" (bukan "connection refused") berarti paket di-DROP, bukan ditolak ciri khas firewall (atau AP isolation di router). SSH (port 22) terbuka sehingga launch berhasil, tapi port ephemeral MPI diblok.
Solusi
1. Pin OpenMPI ke subnet cluster (pakai CIDR agar aman walau nama interface beda di tiap node):
mpirun --prefix /home/haidhi/ompi4 \
--mca btl_tcp_if_include 192.168.100.0/24 \
--mca oob_tcp_if_include 192.168.100.0/24 \
--hostfile hostfile -np 2 ./app
btl_tcp_if_include mengunci jalur data antar-rank; oob_tcp_if_include mengunci jalur kontrol (orted ↔ mpirun). Keduanya perlu.
2. Buka firewall untuk subnet cluster (atau matikan saat menguji):
sudo systemctl is-active firewalld nftables ufw 2>/dev/null # cek yang aktif
sudo ufw allow from 192.168.100.0/24 # ufw
sudo firewall-cmd --zone=trusted --add-source=192.168.100.0/24 # firewalld (+ --permanent)
3. Rapikan hostfile jangan campur IP dan hostname yang bisa resolve ke wifi. Cek dulu:
getent hosts mpi-node1-amd-a8 # pastikan menunjuk ke IP kabel, bukan wifi
Pakai IP kabel secara konsisten (lihat Konfigurasi final).
Konfigurasi final yang berhasil
hostfile
192.168.100.1 slots=1
192.168.100.2 slots=1
Memakai IP kabel di kedua baris membuat topologi eksplisit dan menghilangkan ketergantungan pada resolusi hostname (yang bisa nyasar ke wifi).
Makefile (target run-host)
OMPI_PREFIX ?= /home/haidhi/ompi4
MPIRUN ?= $(OMPI_PREFIX)/bin/mpirun
CLUSTER_NET ?= 192.168.100.0/24
run-host:
$(MPIRUN) --prefix $(OMPI_PREFIX) \
--mca btl_tcp_if_include $(CLUSTER_NET) \
--mca oob_tcp_if_include $(CLUSTER_NET) \
--hostfile $(HOSTFILE) -np $(NP) $(TARGET) $(M) $(K) $(N)
Memakai path lengkap MPIRUN mematikan ambiguitas ompi-vs-ompi4 secara permanen. (Ingat: baris recipe Makefile harus di-indent TAB, bukan spasi.)
Hasil
Hello World from MPI rank 0/2 on host 'darmogandolz' using OpenCL device 'NVIDIA GeForce RTX 3050 6GB Laptop GPU'
Hello World from MPI rank 1/2 on host 'tumbal' using OpenCL device 'cpu-ivybridge-AMD A8-6410 APU with AMD Radeon R5 Graphics'
Matrix multiply 512x512 * 512x512 = 512x512 selesai pada 2 proses MPI. Verifikasi: OK ✓
Ringkasan
| Masalah | Penyebab inti | Solusi inti |
|---|---|---|
realloc undeclared |
Clang 16+ menjadikan implicit-decl sebagai error | CFLAGS="-Wno-implicit-function-declaration" + reconfigure
|
backtrace_symbols int-conversion |
execinfo bionic hanya pada API ≥ 33 | -Wno-int-conversion / -D__ANDROID_API__=33, atau build di laptop
|
orted: command not found |
Dua instalasi + PATH SSH non-interaktif kosong | --prefix (atau prefix-by-default); rapikan jadi satu instalasi
|
Data unpack had inadequate space |
Wire-format mismatch (versi/build/instalasi beda) | Path lengkap mpirun + instalasi identik di semua node |
connect() ... in progress (115) |
Multi-homed → nyasar ke wifi + firewall | --mca btl/oob_tcp_if_include ke subnet kabel + buka firewall
|
Catatan
- Mesin multi-homed wajib di-pin. Begitu sebuah node punya lebih dari satu interface (wifi, kabel,
docker0,virbr0), OpenMPI harus diberi tahu subnet mana yang dipakai lewatbtl_tcp_if_includedanoob_tcp_if_include. - "In progress" vs "refused".
Operation now in progress (115)= paket di-DROP (firewall / isolasi).Connection refused= sampai ke host tapi tidak ada yang listen. Bedanya menentukan arah perbaikan. - SSH jalan ≠ MPI jalan. Launch lewat SSH (port 22) dan komunikasi MPI (port ephemeral) adalah jalur berbeda; firewall bisa membuka satu dan memblok yang lain.
- Satu instalasi saja. Memiliki
~/ompidan~/ompi4sekaligus adalah sumber Masalah 3 dan 4. Pilih satu, hapus sisanya, dan kunci path-nya di Makefile. - Identik antar-node. Versi + opsi build yang sama di semua node mencegah Data unpack error. Build dengan dependency internal membuatnya seragam tanpa bergantung paket sistem tiap mesin.
- Skala ke HP. Saat node Android ditambahkan, pastikan ia mendapat IP
192.168.100.xdi switch yang sama; karena beda arsitektur (ARM64 vs x86_64), program perlu di-launch sebagai binary terpisah per-arch (MPMD).