- Untuk membuat server web berperforma tinggi, sebelumnya digunakan berbagai model berbasis event seperti select(), poll(), epoll
- Namun karena batas performa dari system call tersebut, muncullah io_uring, yang memperkenalkan cara memasukkan permintaan ke antrean agar kernel memprosesnya secara asinkron
- kTLS membuat kernel menangani pemrosesan enkripsi TLS, sehingga dimungkinkan penggunaan sendfile() dan offloading perangkat keras untuk optimasi tambahan
- Pengenalan Descriptorless files menyediakan pendekatan yang dioptimalkan untuk io_uring tanpa perlu meneruskan file descriptor secara langsung
- Melalui proyek open source tarweb yang menggabungkan Rust, io_uring, dan kTLS, HTTPS dapat disediakan tanpa system call tambahan per permintaan, sekaligus membahas isu keamanan dan manajemen memori
Evolusi arsitektur server web berperforma tinggi
- Sejak awal 2000-an, kebutuhan akan server web berkapasitas tinggi terus meningkat
- Pada awalnya, pendekatan yang umum adalah membuat proses baru untuk setiap permintaan, tetapi karena biayanya tinggi, muncullah teknik preforking
- Setelah itu, arsitektur berkembang melalui penggunaan thread serta aktivasi select(), poll() untuk mengurangi biaya context switching
- Namun, pendekatan select() dan poll() juga memiliki batas skalabilitas karena semakin banyak koneksi, semakin sering array besar harus dikirim ke kernel
Munculnya epoll
- Di lingkungan Linux, epoll diperkenalkan sehingga pemrosesan banyak koneksi menjadi lebih efisien dibanding pendekatan sebelumnya
- epoll hanya menangani perubahan (delta), sehingga mengurangi konsumsi resource yang tidak perlu
- Meski tidak menghilangkan semua system call sepenuhnya, biayanya berkurang secara signifikan
Gambaran umum io_uring
- io_uring menambahkan permintaan ke antrean di memori agar kernel dapat memprosesnya secara asinkron, alih-alih memanggil system call untuk setiap permintaan
- Misalnya, jika accept() dimasukkan ke antrean, kernel akan memprosesnya lalu mengembalikan hasil ke completion queue
- Server web bekerja dengan menambahkan permintaan ke antrean, lalu memeriksa hasilnya di area memori terpisah
- Untuk menghindari busy loop, jika tidak ada perubahan pada antrean maka server web dan kernel hanya memanggil system call saat benar-benar diperlukan, sehingga ada efek penghematan daya
- Dengan library yang tepat, server yang sedang aktif dapat berjalan tanpa system call tambahan selama pemrosesan permintaan
Multi-core dan lingkungan NUMA
- Dengan mempertimbangkan lingkungan CPU multi-core modern, strategi single thread per core dan meminimalkan berbagi struktur data merupakan pendekatan yang efektif
- Di lingkungan NUMA, optimasi dilakukan dengan membuat setiap thread hanya mengakses memori node lokalnya sendiri
- Penyeimbangan distribusi permintaan secara sempurna masih memerlukan riset tambahan
Alokasi memori
- Baik di kernel maupun di server web, alokasi memori tetap ada, dan alokasi di user space pada akhirnya juga terhubung ke system call
- Di sisi server web, blok memori berukuran tetap dialokasikan terlebih dahulu untuk tiap koneksi guna mencegah fragmentasi dan kekurangan memori
- Di sisi kernel, buffer I/O per koneksi juga diperlukan, dan sebagian dapat disesuaikan melalui opsi socket
- Jika terjadi kekurangan memori, hal ini dapat berujung pada gangguan serius
Pengenalan kTLS (kernel TLS)
- kTLS adalah fitur di kernel Linux yang menangani operasi enkripsi dan dekripsi
- Handshake ditangani oleh aplikasi, tetapi setelah itu kernel memproses transmisi data seolah-olah berupa teks biasa
- Penggunaan sendfile() menjadi mungkin, sehingga salinan memori antara user space dan kernel space dapat dikurangi
- Jika didukung oleh kartu jaringan, ada keuntungan tambahan berupa offloading operasi enkripsi ke perangkat keras
Descriptorless Files
- Ini adalah pendekatan yang muncul untuk mengurangi overhead saat meneruskan file descriptor secara langsung dari user space ke kernel space
- Dengan register_files, digunakan nomor file berupa 'integer' terpisah yang hanya valid di io_uring, dan tidak muncul di /proc/pid/fd
- Batas ulimit sistem tetap berlaku
Pengenalan proyek tarweb
- tarweb adalah proyek open source server web contoh yang menerapkan semua teknologi di atas
- Strukturnya menyajikan isi dari satu file tar, dan menggabungkan teknologi berperforma tinggi modern seperti Rust, io_uring, kTLS
- Dalam penggunaan nyata, ada masalah kompatibilitas antara io_uring dan kTLS (seperti setsockopt yang belum didukung), dan beberapa isu diselesaikan melalui Pull Request
- Proyek ini masih belum selesai, dan library rustls milik Rust dapat melakukan alokasi memori selama proses handshake
- Poin utamanya adalah layanan HTTPS dimungkinkan tanpa system call tambahan untuk tiap permintaan
Benchmark dan pengukuran performa
- Penulis belum melakukan benchmark yang cukup, dan berencana menguji performa setelah perapian kode selesai
Masalah keamanan io_uring dan Rust
- Berbeda dari system call sinkron, pada io_uring buffer memori tidak boleh dibebaskan sebelum event penyelesaian diterima
- crate io-uring tidak menjamin keamanan compile-time ala Rust, dan juga minim pemeriksaan saat runtime
- Jika digunakan secara keliru, hal ini dapat menyebabkan masalah serius seperti pada C++, sehingga keamanan bawaan Rust menjadi melemah
- Diperlukan crate safer-ring terpisah yang secara aktif memanfaatkan pinning dan borrow checker
- Masalah ini sudah sedang dibahas di komunitas
Referensi dan tautan tambahan
- Konten ini adalah postingan yang dibahas di HackerNews per 2025-08-22
Belum ada komentar.