Pada mesin NUMA, reservasi ruang alamat virtual tidak selalu langsung menentukan node NUMA fisik yang akan menyediakan setiap halaman. Untuk memori anonim, alokasi fisik umumnya terjadi kemudian saat CPU pertama kali memicu page fault pada sebuah halaman. Di bawah kebijakan alokasi lokal default, fault tersebut dapat membuat urutan inisialisasi menjadi bagian dari keputusan penempatan memori.

Perilaku ini sering disebut penempatan first-touch. Thread yang pertama kali menulis atau memicu fault pada sebuah halaman dapat membuat Linux mengalokasikan memori backing di dekat node NUMA tempat thread itu berjalan, dengan tetap tunduk pada memory policy aktif, batasan cpuset, ketersediaan memori, dan mekanisme fallback kernel.

Dampak praktisnya cukup halus: dua program dapat mereservasi jumlah memori yang sama dan menjalankan komputasi paralel yang sama, tetapi memulai dengan lokalitas berbeda jika halaman mereka mengalami fault dari CPU yang berbeda.

Reservasi virtual dan penempatan fisik adalah dua peristiwa terpisah

Sebuah proses dapat memperoleh mapping anonim berukuran besar tanpa langsung menerima halaman fisik tersendiri untuk setiap halaman virtual dalam rentang tersebut. Linux dapat menunda alokasi fisik sampai akses memicu page fault.

Saat fault terjadi, kernel memiliki konteks yang konkret: task sedang berjalan pada sebuah CPU, CPU tersebut berada pada node NUMA tertentu, dan proses tunduk pada memory policy serta batasan sumber daya. Dengan kebijakan default, kernel biasanya memprioritaskan memori lokal pada node yang terkait dengan CPU pemicu fault.

Hal ini memisahkan pembentukan address space dari penempatan halaman. Pemanggilan yang membuat mapping menetapkan rentang virtual, sedangkan fault berikutnya dapat menentukan asal node bagi masing-masing halaman backing.

Perbedaan ini penting untuk array besar. Satu mapping pada akhirnya dapat berisi halaman dari beberapa node NUMA karena thread worker yang berbeda memicu fault pada bagian berbeda ketika berjalan pada CPU yang berbeda.

Inisialisasi serial dapat memusatkan halaman pada satu node

Bayangkan program yang mengalokasikan array besar dan menginisialisasi seluruh elemennya dari satu thread sebelum menjalankan thread worker. Jika inisialisasi tersebut memicu fault pada halaman array ketika thread tetap berada pada satu node NUMA, banyak halaman dapat dialokasikan dari node tersebut.

Sesudahnya, worker yang dijadwalkan pada node lain mungkin berulang kali mengakses halaman itu melalui jalur memori remote. Fase paralel akhirnya dapat memiliki pembagian kerja CPU yang seimbang tetapi penempatan memori yang tidak simetris.

Masalahnya bukan karena thread worker tidak dapat mengalamatkan memori remote. Sistem NUMA menyediakan address space koheren untuk akses memori CPU biasa. Perbedaan biaya berasal dari topologi: akses ke memori yang terpasang pada node lain dapat melewati sumber daya interconnect tambahan serta memiliki karakteristik latensi dan bandwidth yang berbeda dari akses lokal.

Biaya pastinya bergantung pada mesin, topologi firmware, generasi prosesor, workload, dan lalu lintas. Penempatan first-touch tidak berarti penalti akses remote memiliki nilai tetap.

Inisialisasi paralel dapat mendistribusikan penempatan

Salah satu teknik penempatan adalah menginisialisasi setiap partisi dari worker yang nantinya memproses partisi tersebut. Jika worker dipasang dengan affinity atau tetap berada pada node NUMA yang dituju, fault pertama mereka dapat mengalokasikan halaman backing dekat CPU tersebut di bawah kebijakan default.

Sebagai contoh, array besar yang dibagi menjadi region kontigu dapat diinisialisasi secara paralel, dengan setiap worker menyentuh region miliknya. Distribusi halaman yang dihasilkan dapat mengikuti penempatan NUMA para worker, bukan lokasi satu thread penginisialisasi.

Ini adalah konsekuensi penempatan, bukan aturan optimasi universal. Workload yang kemudian membagikan setiap halaman secara merata ke seluruh node mungkin memerlukan kebijakan berbeda. Interleaving halaman antar-node dapat lebih sesuai untuk sebagian pola akses bersama, sedangkan binding eksplisit dapat berguna ketika kepemilikan stabil.

Poin pentingnya adalah inisialisasi bukan sekadar proses mengisi byte. Pada memori NUMA berbasis demand paging, inisialisasi juga dapat menjadi peristiwa yang menetapkan lokalitas fisik.

CPU affinity membuat penempatan lebih dapat diprediksi

Perilaku first-touch bergantung pada lokasi eksekusi thread saat fault terjadi. Jika scheduler memindahkan thread penginisialisasi antar-node NUMA ketika halaman mengalami fault, penempatan yang dihasilkan dapat tersebar pada node-node tersebut.

CPU affinity dapat mengurangi variasi itu dengan membatasi worker pada CPU tertentu. Aplikasi yang sadar NUMA sering menggabungkan penempatan CPU dengan strategi inisialisasi memori yang disengaja agar CPU pemicu fault pertama juga dekat dengan halaman yang akan digunakannya.

Affinity saja tidak memaksakan memory policy tertentu. Affinity mengatur CPU yang boleh dipakai, sedangkan memory policy mengatur preferensi atau persyaratan alokasi. Keduanya berinteraksi karena kebijakan lokal default memakai node CPU pemicu fault sebagai preferensi alokasi.

Konfigurasi container dan cpuset juga dapat membatasi CPU serta node memori yang tersedia. Karena itu, penempatan CPU yang terlihat oleh aplikasi perlu dibaca bersama batasan tersebut.

Memory policy dapat menggantikan preferensi lokal default

First-touch paling berguna sebagai deskripsi perilaku pada alokasi lokal biasa. Linux juga menyediakan NUMA memory policy yang dapat meminta strategi penempatan lain.

Sebuah proses atau mapping dapat diikat ke node memori tertentu, dapat memprioritaskan sebuah node, atau dapat memakai kebijakan interleaving. Tool dan API yang memakai fasilitas NUMA Linux dapat menetapkan kebijakan tersebut tanpa hanya bergantung pada node tempat fault pertama terjadi.

Kebijakan ini mengubah keputusan alokasi pada saat fault. Halaman yang pertama kali diakses pada satu CPU tidak harus berasal dari node CPU tersebut jika kebijakan eksplisit mengarahkan alokasi ke tempat lain.

Tekanan sumber daya juga berpengaruh. Bahkan dengan preferensi lokal, kernel dapat menghadapi kondisi ketika node pilihan tidak dapat memenuhi alokasi berdasarkan kebijakan dan batasan yang berlaku. Karena itu, penempatan sebaiknya diamati secara langsung ketika lokalitas penting bagi operasi sistem.

Ukuran halaman mengubah granularitas penempatan

Penempatan berlaku pada halaman fisik, bukan pada masing-masing objek aplikasi. Dengan base page biasa, byte yang berdekatan dan berbagi halaman juga berbagi lokasi NUMA yang sama.

Halaman yang lebih besar memperbesar granularitas tersebut. Transparent Huge Pages atau penggunaan huge page eksplisit dapat membuat region virtual yang jauh lebih besar ditopang oleh satu halaman besar, bergantung pada perilaku dan konfigurasi kernel. Implikasi penempatannya kemudian berlaku pada unit yang lebih besar itu.

Hal ini dapat berpengaruh ketika beberapa worker bekerja pada region yang berdekatan. Batas partisi pada level aplikasi yang berada di dalam satu halaman fisik tidak dapat memberikan lokasi NUMA independen untuk setiap sisi halaman tersebut.

Layout halaman, alignment, kebijakan huge page, dan pembagian akses karena itu memengaruhi seberapa dekat perilaku first-touch dapat mengikuti kepemilikan logis.

Penempatan dapat berubah setelah fault awal

First-touch menggambarkan alokasi awal; mekanisme ini bukan label kepemilikan permanen. Linux dapat memigrasikan halaman melalui operasi NUMA eksplisit, dan automatic NUMA balancing dapat mengambil sampel pola akses serta memindahkan task atau halaman untuk memperbaiki lokalitas ketika fasilitas tersebut aktif.

Snapshot yang diambil lama setelah startup karena itu dapat berbeda dari distribusi awal. Migrasi thread, migrasi halaman, tekanan memori, perubahan kebijakan, dan aktivitas balancing dapat memengaruhi keadaan yang diamati.

Artinya, penempatan saat startup dan penempatan steady-state merupakan dua persoalan berbeda. Inisialisasi paralel yang disengaja dapat menghasilkan layout awal yang berguna, tetapi perilaku jangka panjang tetap bergantung pada lokasi komputasi dan halaman yang diakses oleh setiap CPU.

Lokalitas adalah properti yang perlu diukur

Penempatan NUMA merupakan state sistem yang dapat diamati. Linux menyediakan informasi memori per-node, peta NUMA proses, serta counter terkait NUMA yang dapat membantu menghubungkan penempatan halaman dengan eksekusi CPU. Tool performa dapat menambahkan bukti mengenai akses remote dan perilaku memori jika hardware serta kernel menyediakan event yang sesuai.

Pertanyaan diagnostik yang berguna bukan sekadar apakah sebuah program memakai NUMA. Pada sistem multi-node, pertanyaan yang lebih presisi adalah lokasi eksekusi thread, lokasi halaman fisik, thread yang mengakses halaman tersebut, serta apakah hubungan itu tetap stabil seiring waktu.

Penempatan first-touch menghubungkan dua tahap awal dalam rangkaian tersebut. Page fault terjadi pada CPU tertentu, dan di bawah kebijakan lokal default lokasi itu memengaruhi sumber memori fisik yang diprioritaskan. Urutan inisialisasi karena itu dapat menjadi bagian dari topologi NUMA program sebelum komputasi utamanya dimulai.