2 poin oleh GN⁺ 2025-08-23 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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.

Belum ada komentar.