1 poin oleh GN⁺ 2023-10-08 | 1 komentar | Bagikan ke WhatsApp
  • Artikel ini membahas perdebatan di komunitas Rust tentang penggunaan eksekutor multithread, yaitu runtime async yang melakukan work-stealing untuk mendistribusikan tugas secara seimbang.
  • Sebagian pengguna Rust mendorong arsitektur alternatif bernama "thread-per-core", yang menjanjikan kinerja lebih baik dan implementasi yang lebih mudah.
  • Istilah "thread-per-core" bersifat menyesatkan. Semua eksekutor multithread pada dasarnya adalah thread-per-core, membuat satu thread OS per inti dan menjadwalkan tugas di atas thread-thread tersebut.
  • Thread-per-core menggabungkan tiga gagasan: menangani konkurensi di ruang pengguna, membuat I/O menjadi asinkron untuk menghindari pemblokiran thread, dan mempartisi data antar inti CPU untuk menghilangkan biaya sinkronisasi serta perpindahan data antar cache CPU.
  • Perdebatan ini terutama berfokus pada poin ketiga, dan dengan async Rust, dua kebutuhan pertama dapat dipenuhi.
  • Dalam arsitektur thread-per-core, ada dua optimasi yang bisa dilakukan: mencuri pekerjaan antar thread, dan berbagi status sesedikit mungkin.
  • Work-stealing meningkatkan tail latency dengan memastikan semua thread selalu bisa bekerja, tetapi sulit diimplementasikan dan dapat menimbulkan biaya sinkronisasi serta cache miss.
  • Share-nothing meningkatkan tail latency dengan menjaga data tetap berada di cache yang lebih cepat milik satu inti CPU, tetapi bisa sulit diterapkan pada aplikasi kompleks yang perlu mengubah status di beberapa partisi.
  • Artikel ini mengusulkan bahwa dalam sistem yang menggunakan status bersama, work-stealing dapat meningkatkan utilisasi CPU saat berada di bawah beban.

1 komentar

 
GN⁺ 2023-10-08
Komentar Hacker News
  • Inti perdebatan bukanlah executor pencurian kerja per inti, melainkan apakah async/await di Rust merupakan abstraksi yang baik.
  • Thread-per-core diciptakan untuk mengatasi skalabilitas dan efisiensi komputasi pada server umum dengan banyak inti, dan terbukti unggul untuk pekerjaan I/O-bound berthroughput tinggi.
  • Arsitektur thread-per-core akan tetap ada karena skalabilitas dan efisiensinya, tetapi sebagian besar insinyur perangkat lunak memiliki intuisi yang terbatas tentang seperti apa desain thread-per-core yang modern dan idiomatis.
  • Beberapa aplikasi lebih cocok untuk sistem single-thread, dan Rust memungkinkan fleksibilitas ini.
  • Ada kritik terhadap pemrograman async Rust, termasuk keharusan Send + Sync + 'static, yang oleh sebagian orang dirasa memberatkan.
  • Batasan Send adalah persyaratan yang memungkinkan pemindahan tugas antar thread executor, dan ini tampak sebagai kelemahan dalam sistem async Rust.
  • Tidak ada pendekatan seragam yang dapat mencapai kinerja terbaik untuk semua program, dan penggunaan async dianggap sebagai optimisasi prematur untuk banyak program Rust.
  • Context switch kernel mahal, sehingga desain thread-per-core lebih disukai, tetapi penjadwalan context switch di ruang pengguna juga bisa menjadi masalah.
  • Pencurian kerja adalah cara untuk mengatasi tail latency, tetapi menimbulkan cache miss dan tambahan batasan bagi pengembang seperti Send, Sync, dan ‘static.