4 poin oleh GN⁺ 2025-12-09 | 1 komentar | Bagikan ke WhatsApp
  • Selama proses migrasi codebase dari Scala 2.13 ke Scala 3, terjadi penurunan performa yang tidak terduga
  • Pada pengujian awal dan lingkungan deployment, semua metrik terlihat normal, namun beberapa jam kemudian lag Kafka meningkat
  • Hasil load test menunjukkan adanya penurunan throughput yang tajam saat memproses pesan yang terperinci
  • Melalui analisis async-profiler, terungkap bahwa penyebabnya adalah bug inefisiensi evaluasi chain pada library Quicklens
  • Setelah library diperbarui, performa pulih, dan ditekankan perlunya kewaspadaan terhadap perbedaan perilaku library antar versi Scala

Proses Migrasi Layanan

  • Layanan yang ada sebelumnya dipindahkan dari Scala 2.13 ke Scala 3.7.3
    • Ini adalah layanan yang berfokus pada pengumpulan data tanpa menggunakan macro, dengan performa sebagai aspek penting
    • Setelah menerapkan perubahan pada dependensi, opsi compiler, tipe, dan sintaks, kompilasi berhasil
  • Di lingkungan pengujian dan deployment bertahap, log dan metrik semuanya tampak normal
    • Metrik di tingkat infrastruktur, JVM, dan aplikasi semuanya dikonfirmasi dalam kondisi sehat
Iklan

Penurunan Performa dengan Penyebab yang Tidak Jelas

  • Sekitar 5–6 jam setelah deployment, terjadi peningkatan lag Kafka
    • Bahkan ketika tidak ada lonjakan data, throughput per instance menurun
    • Setelah rollback, throughput segera pulih, yang mengonfirmasi bahwa perubahan kode adalah penyebabnya

Analisis Performa dan Pelacakan Penyebab

  • Dalam load test, pada awalnya regresi performa tidak berhasil direproduksi
    • Penurunan throughput yang tajam hanya terjadi pada payload yang terperinci dan heterogen
  • Library dependensi (serialisasi, DB SDK, image Docker, library konfigurasi, dan lainnya) dikembalikan satu per satu untuk diuji, tetapi tidak ada perubahan
  • Hasil profiling CPU dengan async-profiler menunjukkan bahwa,
    • Di Scala 3, penggunaan CPU oleh compiler JIT dan tahap decoding meningkat tajam
    • Di bagian atas flamegraph, pemanggilan Quicklens memakan setengah dari total waktu CPU
    • Di Scala 2.13, pemanggilan yang sama hanya berada di kisaran 0,5%
    Iklan

Akar Penyebab Masalah

  • Bug inefisiensi evaluasi chain pada library Quicklens muncul di Scala 3
    • Perbaikan terkait telah diterapkan dalam GitHub PR #115
    • Setelah library diperbarui, perbedaan performa antara Scala 3 dan 2.13 pun hilang

Pelajaran dan Rekomendasi

  • Ketergantungan library pada metaprogramming dapat menyebabkan perbedaan performa antar versi Scala
  • Meskipun migrasi selesai dengan normal, hotspot dan titik bottleneck tetap harus dibenchmark
  • Untuk layanan yang sensitif terhadap performa, alih-alih berasumsi “berjalan dengan baik”, validasi berbasis pengukuran nyata itu wajib
  • Diperlukan pemeriksaan awal untuk mencegah situasi di mana benchmark, bukan kode, yang mengungkap bottleneck

1 komentar

 
GN⁺ 2025-12-09
Opini Hacker News
  • Saya bukan penggemar Scala, tetapi proses analisis mendalam dan debugging yang dilakukan sangat mengesankan
    Blog teknis memang seharusnya ditulis seperti ini. Sulit membayangkan AI bisa menggantikan alur berpikir setingkat ini
    • Saat me-refresh salah satu layanan kami, kami melakukan migrasi dari Scala 2.13 ke Scala 3
      Pertanyaan pertamanya sederhana — “kenapa harus upgrade?”
  • Di Scala 3, kata kunci inline bekerja sebagai bagian dari sistem makro
    Jika inline dipakai pada parameter, compiler diarahkan untuk meng-inline ekspresi di titik pemanggilan
    Tetapi jika ini besar, bebannya menjadi sangat berat bagi compiler JIT
    Di Scala 2, @inline hanya berupa saran, tetapi di 3 diterapkan tanpa syarat
    Jadi, sekadar mengganti @inline menjadi inline adalah kesalahan besar
    • Perbedaan ini mirip dengan yang pernah terjadi pada kata kunci register di C/C++ lama
      Awalnya bersifat memaksa, tetapi seiring optimisasi berkembang, ia menjadi sekadar rekomendasi lalu akhirnya diabaikan
      inline di C++ juga mengalami proses serupa
    • Kotlin sangat aktif menggunakan inline hampir di mana-mana
      Tujuannya untuk menghilangkan overhead lambda pada fungsi seperti map
      Hampir tidak ada masalah performa, tetapi jika digabung dengan sistem makro Scala, ekspresi kompleks bisa muncul dan mungkin menimbulkan masalah
  • Setelah library di-upgrade, performa Scala 3 menjadi hampir sama dengan Scala 2.13
    Saya juga pernah mengalami hal serupa saat upgrade Ruby 2→3
    Bukan cuma bahasanya yang perlu dinaikkan, tetapi seluruh dependensi juga harus dimutakhirkan agar sistem stabil
  • Masalah Scala 3 adalah tidak ada yang menginginkannya
    Masalah inferensi tipe di Scala 2 tetap belum terselesaikan, sementara yang berubah justru bahasanya
    Jadinya seperti membuat produk yang tidak diinginkan siapa pun sambil mengabaikan kebutuhan pasar
    PS: compiler benar-benar perlu punya suite unit test yang layak
    • Sedih, tapi saya setuju. Scala sempat menjanjikan sekitar 2010~15
      Namun rewrite Scala 3 gagal menyelesaikan kecepatan kompilasi dan masalah tooling, dan proyeknya kehilangan momentum sepenuhnya
      Rasanya sulit membayangkan ada orang yang memulai proyek baru dengan Scala pada 2025
    • Saya sudah beberapa kali mencoba belajar Scala, tetapi pada akhirnya selalu kembali ke Clojure
      Scala terasa seperti bahasa buatan akademisi, dan justru aneh kalau dulu sempat populer di industri
    • Ini tepat mengenai inti masalah
      Sekarang semua tool harus menyesuaikan diri dengan Scala 3, dan bahkan IntelliJ pun masih belum mendukungnya sepenuhnya
      Andai Scala 2 ditingkatkan secara bertahap, bukannya fokus pada keberhasilan akademis saja
      Misalnya, seperti di tulisan tpolecat, bahkan soal early return pun masih diperdebatkan, padahal Kotlin mendukungnya tanpa masalah
    • Pernyataan “tidak ada test” adalah informasi keliru
      Compiler Scala punya ribuan hingga puluhan ribu test, dan
      direktori test resmi serta
      sistem community build memverifikasi jutaan LOC
    • Sepertinya Anda tidak membaca artikelnya dengan benar. Poin utamanya meleset total
  • Hal paling menarik dari tulisan ini adalah bahwa pengujian performa terotomatisasi dan analisis flamegraph harus dimiliki sebagai dasar
    Ini особенно wajib saat menghadapi perubahan besar seperti upgrade versi bahasa
    • Benchmark test, tidak seperti test biasa, membutuhkan pengaturan yang rinci
      Kami terus melakukan benchmark pada tool yang ditulis dalam C++, tetapi sulit menjaga konsistensi hasil karena noise lingkungan
      Kami sedang mempertimbangkan cara membandingkan dengan menjalankannya berulang kali di mesin yang sama
    • Saya penasaran tool pengujian performa apa yang sekarang umum dipakai di JVM
  • Satu-satunya masalah Scala 3 adalah iri pada Python
    Masalahnya adalah membuat sintaks kedua lalu mendorongnya sebagai masa depan
    Ini juga memperlambat ekosistem tooling
    • Sekarang sebagian besar tool sudah mendukung sintaks baru
      Gaya penulisan juga bisa dikonversi otomatis dengan compiler atau scalafmt
    • Sesuai gaya Scala, sekarang satu hal bisa dilakukan dengan banyak cara
      Kini ada dua kali lipat: sintaks kurung kurawal dan sintaks indentasi
    • Seandainya dibandingkan dengan Haskell, mungkin akan terasa lebih menarik
    • Sebagai mantan penggemar Scala, saya kaget melihat contoh sintaks barunya
      Sintaks match terasa terlalu bertele-tele dan seperti meniru Python
  • Saya pernah melakukan migrasi Scala 2.x, dan yang paling berat adalah menunggu dependensi
    Waktu itu Scala sempat mendapat sorotan berkat Spark, tetapi kehilangan kesempatan berkembang sebagai bahasa komersial
    Sekarang Spark bergerak ke Python, dan posisi bahasa modern di JVM diambil Kotlin
    Pada akhirnya Scala terasa kembali menjadi bahasa akademis
    • Tetapi Scala masih tetap banyak dipakai di perusahaan besar
      Itu bisa dilihat di Scala Adoption Tracker
      Fitur-fitur baru Scala 3 masih punya potensi untuk kembali menginovasi ekosistem bahasa
      Contoh: penjelasan tentang Capture Checking
    • Saya ragu Kotlin benar-benar sudah menguasai JVM
      Java menambahkan fitur-fitur fungsional dan menyerap sebagian daya tarik Scala
    • Di JVM server-side, kehadiran Kotlin nyaris tidak terasa
      Dalam pengalaman saya, permintaan pasar juga minim
    • Kotlin pada dasarnya adalah bahasa khusus Android
      Itu terjadi hanya karena Google membatasi dukungan Java
      Di seluruh pasar JVM, pangsa Kotlin hanya sekitar 10%
  • Saya merasa aneh mereka pindah ke Scala 3 tanpa upgrade versi library
    Jika Anda menjalani audit keamanan (PIC-DSS dan sebagainya), menjaga library tetap terbaru adalah hal wajib
    • Ungkapan “menjaganya tetap terbaru itu kebiasaan baik” adalah cara yang menutup diskusi
      Saya justru cenderung membiarkan dependensi tetap lama
      Versi baru membawa bug baru, perubahan maintainer, dan juga risiko keamanan
    • Saya juga bingung. Di tulisan itu disebut “dependensi sudah di-update”, tetapi belakangan dikatakan “setelah update performanya jadi sama”
      Sepertinya awalnya hanya sebagian yang dinaikkan. Membaginya ke langkah-langkah kecil itu umum, tetapi kali ini mereka kurang beruntung
    • Setelah tahu penyebab bug-nya, kesannya jadi kurang menarik
      Masalahnya bukan Scala 3 itu sendiri, melainkan interaksi beberapa faktor
    • Semakin besar perubahan seperti upgrade versi bahasa, semakin baik mengubah satu hal pada satu waktu
    • Jika memberi batasan versi di Maven/Gradle/SBT, itu tetap terjaga terpisah dari versi bahasa
      Tetapi untuk library khusus Scala, versi Scala sering ikut masuk ke nomor versinya sehingga perlu diperhatikan
  • Laporan bug dari SoftwareMill dan Scala GitHub adalah perbaikan yang kecil tetapi tepat
    Daya ekspresif Scala dan type safety-nya terlihat menonjol
    Seperti di tulisan Li Haoyi, bahasa ini juga cukup menarik sebagai alternatif Python
  • Pelajaran utamanya adalah, saat melakukan upgrade mayor bahasa atau framework, library juga harus ikut dimutakhirkan
    Ini makin penting jika banyak library yang terlalu bergantung pada fitur-fitur magic