Menulis Java latensi rendah [ditutup]

30

Apakah ada teknik khusus Java (hal-hal yang tidak berlaku untuk C ++) untuk menulis kode latensi rendah, di Jawa? Saya sering melihat peran rendah latensi Jawa dan mereka meminta pengalaman menulis Jawa latensi rendah - yang kadang-kadang tampaknya sedikit oxymoron.

Satu-satunya yang saya pikirkan adalah pengalaman dengan JNI, outsourcing panggilan I / O ke kode asli. Juga mungkin menggunakan pola pengganggu, tapi itu bukan teknologi yang sebenarnya.

Apakah ada kiat khusus Java untuk menulis kode latensi rendah?

Saya sadar ada Real Time Java Spec, tetapi saya telah diperingatkan bahwa real-time tidak sama dengan latensi rendah ....

pengguna997112
sumber
jangan membuat terlalu banyak objek yang mungkin memicu siklus koleksi akan menjadi tebakan saya
ratchet freak
@ scratchet, saya kira Jaringan atau Disk apa pun yang terkait akan menjadi JNI juga?
user997112
Untuk tautan dan presentasi lebih lanjut, Anda mungkin tertarik dengan Performance Java User's Group plus.google.com/u/1/communities/107178245817384004088
Peter Lawrey
Saya akan menambahkan menggunakan sun.misc.Unsafe, secara langsung atau tidak langsung bermanfaat. Banyak metode tidak aman diperlakukan sebagai intrinsik yang berarti mereka diganti dengan kode mesin, yang menghindari JNI.
Peter Lawrey
Teknik utama adalah untuk sepenuhnya menghindari overhead GC. Anda dapat membaca lebih lanjut tentang itu dalam artikel ini Java Development Without GC
rdalmeida

Jawaban:

35

Selain komentar Martijn saya akan menambahkan:

  1. Lakukan pemanasan JVM Anda. Bytecode mulai ditafsirkan untuk Hotspot dan kemudian dikompilasi di server setelah pengamatan 10 ribu . Kompilasi Berjenjang dapat menjadi celah berhenti yang baik.

  2. Classloading adalah proses berurutan yang melibatkan IO ke disk. Pastikan semua kelas untuk aliran transaksi utama Anda dimuat di muka dan bahwa mereka tidak pernah diusir dari pembuatan perm.

  3. Ikuti " Prinsip Penulis Tunggal " untuk menghindari pertikaian dan implikasi efek antrian Hukum Little, ditambah mempelajari Hukum Amdhal untuk apa yang bisa paralel dan apakah itu layak.

  4. Modelkan domain bisnis Anda dan pastikan semua algoritme Anda adalah O (1) atau setidaknya O (log n). Ini mungkin penyebab terbesar masalah kinerja dalam pengalaman saya. Pastikan Anda memiliki tes kinerja untuk menutupi kasus utama.

  5. Latensi rendah di Jawa tidak hanya terbatas di Jawa. Anda harus memahami seluruh tumpukan yang dijalankan oleh kode Anda. Ini akan melibatkan penyetelan OS, memilih perangkat keras yang sesuai, perangkat lunak sistem penyetelan dan driver perangkat untuk perangkat keras itu.

  6. Jadilah realistik. Jika Anda membutuhkan latensi rendah, jangan gunakan hypervisor. Pastikan Anda memiliki inti yang cukup untuk semua utas yang perlu berada dalam status runnable.

  7. Kehilangan cache adalah biaya terbesar Anda untuk kinerja. Gunakan algoritma yang ramah cache dan atur afinitas ke inti prosesor baik dengan tasket atau numactl untuk JVM atau JNI untuk masing-masing utas.

  8. Pertimbangkan JVM alternatif seperti Zing dari Azul dengan pengumpul sampah yang jeda.

  9. Yang paling penting adalah melibatkan seseorang dengan pengalaman. Ini akan menghemat banyak waktu dalam jangka panjang. Steker tak tahu malu :-)

Real-time dan latensi rendah adalah subjek yang terpisah meskipun sering terkait. Real-time adalah tentang lebih dapat diprediksi daripada cepat. Dalam pengalaman saya, JVM real-time, bahkan yang lembut real-time, lebih lambat dari JVM normal.

Martin Thompson
sumber
2
+1 untuk jawaban yang bagus. Sebagai seseorang yang berkepentingan dengan pemrosesan pos seperti ini adalah titik awal yang bagus untuk penelitian.
mcfinnigan
23

Ada banyak hal yang harus diperhatikan ya. Saya di Kreta saat ini dengan akses internet terbatas sehingga ini akan (cukup) singkat. Juga, saya bukan ahli latensi rendah, tetapi beberapa rekan saya memainkannya dalam kehidupan nyata :-).

  1. Anda perlu menghargai Mechanical Sympathy (istilah yang diciptakan oleh Martin Thompson ). Dengan kata lain Anda perlu memahami apa yang dilakukan perangkat keras mendasar Anda. Mengetahui bagaimana CPU memuat garis cache, berapa bandwidth baca / tulisnya, kecepatan memori utama dan banyak lagi, jauh lebih penting. Mengapa? Karena Anda harus mempertimbangkan bagaimana kode sumber Java Anda mempengaruhi OperatingSystem / Hardware melalui runtime JVM. Sebagai contoh, adalah cara variabel bidang Anda diletakkan di kode sumber Anda yang menyebabkan penggusuran garis cache (biaya Anda ~ 150 siklus clock), hmmm ... :-).

  2. Secara umum Anda ingin mengunci algoritma gratis dan I / O. Bahkan aplikasi konkuren yang paling baik dirancang (yang menggunakan kunci) berisiko diblokir, memblokir dalam latensi rendah umumnya buruk :-).

  3. Memahami Alokasi Objek dan Pengumpulan Sampah. Ini adalah topik besar, tetapi pada dasarnya Anda ingin menghindari jeda GC (sering disebabkan oleh sifat Stop the World dari berbagai koleksi GC). Kolektor GC spesialis seperti kolektor Azul dalam banyak kasus dapat memecahkan masalah ini untuk Anda di luar kebiasaan, tetapi bagi kebanyakan orang, mereka perlu memahami cara menyetel Sun / Oracle GC (CMS, G1, dll).

  4. JIT Hotspot sangat luar biasa. Pelajari tentang pengoptimalannya, tetapi secara umum semua teknik OO yang baik (enkapsulasi, metode kecil, sebanyak mungkin data tidak berubah) akan memungkinkan JIT untuk mengoptimalkan, memberi Anda berbagai tingkat kinerja yang diberikan oleh kode C / C ++ yang dibuat dengan baik.

  5. Arsitektur sistem secara keseluruhan. Waspadai jaringan, bagaimana mesin ditempatkan bersama, jika Anda terhubung ke pertukaran melalui serat dll.

  6. Waspadai dampak penebangan. mencatat biner atau menggunakan keluaran kode yang dapat Anda parsing secara off-line mungkin merupakan ide yang bagus.

Secara keseluruhan saya sangat merekomendasikan mengikuti kursus Java Performance Tuning Kirk Pepperdine [Penafian: Saya mengajar kursus ini sendiri, jadi saya bias]. Anda akan mendapatkan cakupan yang baik dari berbagai aspek JVM dan dampaknya pada O / S dan perangkat keras yang mendasarinya.

PS: Saya akan mencoba meninjau kembali nanti dan membereskannya.

Martijn Verburg
sumber
Akan sangat menyenangkan jika mereka yang berpengalaman dengan Simpati Mekanik dapat berbagi beberapa trik untuk mendeteksi ketika batas yang diberikan telah dilewati.
Saya sudah ping twitter untuk mencoba dan mendapatkan ahli nyata di :-)
Martijn Verburg
Keren, Martin Thompson telah menimpali, layak mengikuti nasihatnya atas saya.
Martijn Verburg