Linux io_uring dapat mengirim I/O asynchronous dengan buffer user biasa, tetapi operasi berulang masih dapat membuat kernel harus mencari dan menahan halaman user yang relevan pada setiap request. Registered buffer memindahkan sebagian pekerjaan itu ke fase setup yang eksplisit.
Aplikasi mendaftarkan satu atau beberapa region memori ke ring. Kernel mencatat region tersebut dan mempertahankan halaman backing dalam keadaan pinned selama registrasi masih aktif. Request berikutnya dapat merujuk region terdaftar melalui indeks, bukan menyerahkan buffer arbitrer yang harus disiapkan dari awal.
Perubahan ini memindahkan titik pembayaran biaya. Registrasi lebih mahal daripada satu request biasa, dan halaman yang dipin memberi ruang gerak lebih kecil bagi subsistem virtual memory. Sebagai gantinya, workload yang memakai buffer yang sama secara berulang dapat mengurangi pekerjaan manajemen memori pada tiap operasi.
Registrasi membentuk kumpulan buffer yang stabil
Registrasi buffer dilakukan melalui operasi io_uring_register seperti IORING_REGISTER_BUFFERS. Aplikasi memberikan array iovec yang mendeskripsikan rentang virtual address.
Kernel memvalidasi rentang tersebut, mencari halaman backing, lalu menahan halaman itu agar dapat dipakai oleh ring. Registrasi melekat pada instance io_uring tersebut. Registrasi bukan pool tingkat proses yang otomatis dipakai bersama oleh setiap ring.
Setelah registrasi, operasi fixed-buffer seperti IORING_OP_READ_FIXED dan IORING_OP_WRITE_FIXED memilih entri terdaftar melalui buffer index pada request. Request tetap membawa address dan length untuk bagian yang akan ditransfer, tetapi rentang itu harus berada di dalam registered buffer yang dipilih.
Asosiasi yang stabil menjadi bagian pentingnya. Kernel sudah memiliki referensi halaman untuk memori terdaftar, sehingga I/O berulang pada memori tersebut tidak perlu mengulangi seluruh jalur page pinning pada setiap request.
Halaman yang dipin merupakan komitmen resource
Registrasi bukan cache tanpa biaya. Halaman user yang dipin tidak dapat diperlakukan seperti anonymous memory biasa yang bebas direclaim selama pin masih aktif. Halaman tersebut menjadi komitmen resource sampai buffer di-unregister atau ring dibongkar.
Registrasi berukuran besar dapat menambah tekanan memori walaupun hanya sebagian buffer yang aktif pada suatu waktu. Service yang mendaftarkan beberapa gigabyte hanya untuk menghadapi lonjakan langka dapat mempertahankan memori pinned jauh di atas kebutuhan I/O steady-state.
Karena itu, ukuran buffer menjadi keputusan operasional, bukan sekadar pilihan kapasitas maksimum. Pool reusable yang lebih kecil dapat menjaga fast path tetap efisien tanpa menahan seluruh working set aplikasi.
Lifetime juga penting saat konfigurasi berubah. Memori yang akan diregistrasikan perlu tetap valid dan stabil selama periode registrasi. Pola yang lazim adalah mengalokasikan region, mendaftarkannya, memakainya untuk I/O, melakukan unregister, lalu melepaskan atau memakai ulang memorinya.
Fixed buffer cocok untuk jalur data berulang
Kecocokan paling kuat muncul pada workload dengan kumpulan buffer terbatas yang berputar melalui banyak request. Storage engine, proxy, dan service ber-throughput tinggi sering sudah memakai buffer pool, sehingga registrasi dapat mengikuti model ownership yang telah ada.
Transfer sekali pakai memiliki profil biaya berbeda. Membayar overhead registrasi untuk memori yang hanya melayani satu atau dua operasi dapat lebih mahal daripada memakai buffer biasa secara langsung. Fixed buffer merupakan optimasi untuk reuse, bukan syarat bagi I/O asynchronous.
Fitur ini juga tidak menghapus latency dari device, filesystem, atau scheduler. Registrasi menangani satu bagian persiapan request yang terkait dengan memori user. Queueing, pekerjaan filesystem, perilaku block layer, service time device, dan pemrosesan completion tetap menjadi bagian terpisah dari jalur I/O.
Registrasi buffer dan pemilihan buffer menangani kebutuhan berbeda
io_uring juga menyediakan mekanisme provided buffer. Aplikasi memasok kelompok buffer dan kernel memilih buffer yang tersedia untuk operasi seperti receive. Fasilitas ini berguna saat aplikasi belum mengetahui buffer spesifik yang akan menerima data masuk.
Fixed registered buffer memakai kontrak interface berbeda. Request menunjuk entri terdaftar tertentu, sehingga model ini cocok saat aplikasi mengendalikan sendiri penugasan buffer.
Kedua mekanisme dapat mengurangi friksi dalam penanganan buffer berulang, tetapi pola ownership-nya berbeda. Menganggap seluruh fitur buffer io_uring sebagai pool yang sama dapat menghasilkan asumsi keliru mengenai field request, lifetime buffer, dan metadata completion.
Registrasi memindahkan pekerjaan keluar dari hot path
Nilai praktis fixed buffer berasal dari amortisasi. Resolusi halaman dan pinning dilakukan saat setup, sedangkan request berikutnya memakai kembali state pemetaan yang sudah terbentuk.
Trade-off ini paling berguna saat volume request cukup tinggi untuk menutup biaya setup dan memori dapat tetap dipin tanpa mengganggu bagian sistem lain. Nilainya lebih kecil saat buffer berumur pendek, sangat bervariasi, atau terlalu besar untuk dipertahankan resident dengan nyaman.
Untuk pool buffer I/O yang stabil, registered buffer memberi io_uring cara menukar fleksibilitas memori dengan jalur request berulang yang lebih ringkas. Optimasi ini bersifat eksplisit: tahan halamannya, pakai berulang kali, lalu lepaskan registrasi saat reuse berakhir.