Kinerja perdagangan platform dengan contoh sederhana


Dalam artikel ini saya ingin berbicara dalam bentuk ilmiah-populer tentang mengoptimalkan waktu respons dalam platform perdagangan pertukaran dan bank (HFT). Sebagai referensi, kita berbicara tentang waktu dari ratusan nanodetik hingga ratusan mikrodetik. Untuk sebagian besar aplikasi lain, banyak metode optimasi di bawah ini tidak relevan hanya karena tidak ada persyaratan ketat seperti itu.


Biasanya kami mempertimbangkan kinerja dalam satuan bandwidth. Misalnya di Gigaflops. Tugas pengoptimalan dalam kasus tersebut dikurangi untuk melakukan jumlah perhitungan maksimum per unit waktu atau menyelesaikan masalah dalam waktu minimum. Desain prosesor dirancang terutama untuk mencapai jumlah maksimum perhitungan per unit waktu dan teknik optimasi standar untuk hal yang sama.


Namun, ada aplikasi di mana waktu respons lebih penting, misalnya, platform perdagangan dalam perdagangan komputer (HFT), mesin pencari, robot, dan telekomunikasi. Waktu respons adalah waktu pelaksanaan transaksi "tunggal" jenis ini, misalnya, dari menerima paket dengan penawaran harga terkini dari bursa hingga mengirim pesanan untuk operasi pertukaran. Sebenarnya, waktu respons dan throughput (jumlah operasi jenis ini per unit waktu) terkait erat, tetapi perbedaannya mendasar. Seringkali dimungkinkan untuk meningkatkan throughput hanya dengan menambahkan perangkat keras (lebih banyak server), tetapi meningkatkan waktu respons dengan cara ini bermasalah (kecuali dalam kasus beban puncak).


Beberapa teknik luar biasa digunakan untuk mengoptimalkan waktu respons. Beberapa meningkatkan baik waktu respon dan throughput pada saat yang sama, yang lain meningkatkan satu dengan mengorbankan yang lain. Sebagai contoh, untuk meningkatkan throughput, buffering adalah tipikal untuk memproses array paket pada suatu waktu. Jelas, untuk waktu respons terhadap satu paket, pendekatan ini berbahaya.


Dalam platform perdagangan, stabilitas waktu respons juga sangat penting. Sebagian besar keuntungan dan kerugian terjadi selama pergerakan tajam pasar, disertai dengan aktivitas tinggi yang tidak normal. Platform harus menahan beban seperti itu. Steker apa pun dapat menyebabkan kerugian nyata.


Secara umum, optimasi waktu respons tingkat rendah seperti itu adalah topik kompleks yang membutuhkan pemahaman yang baik tentang tumpukan jaringan, inti dari sistem operasi, kinerja prosesor dan platform, dan sinkronisasi ulir yang efisien. Tugas saya adalah menjelaskan semua hal kompleks ini dengan contoh yang sederhana dan mudah dipahami.


Pekerjaan kantor


Mari kita gunakan analogi berikut ini. Bayangkan sekelompok orang yang bekerja di kantor. Komunikasi terjadi melalui pertukaran pesan di atas kertas (surat). Setiap surat berisi penerima, pengirim dan tugas. Surat ditempatkan di atas meja-meja tertentu di kantor. Ada karyawan yang tugasnya menerima surat dari dunia luar dan menaruhnya di atas meja. Yang lain mengambil surat dari meja dan meneruskannya ke pembuat keputusan. Setiap pembuat keputusan hanya bekerja dengan jenis huruf (atau tugas) tertentu.


Pembuat keputusan membaca surat-surat yang ditujukan untuknya dan memutuskan apakah tugas ini akan selesai, ditunda atau diabaikan. Tugas untuk eksekusi ditumpuk pada tabel terpisah. Pekerja khusus mengambil surat dari tabel ini dan membagikannya kepada para pemain. Beberapa surat harus dijawab di luar kantor, misalnya, mengirim konfirmasi ke pengirim eksternal.


Agar lebih dekat dengan kenyataan, mari kita sedikit mempersulit kondisi. Misalnya, kantor adalah jaringan kompleks kamar dan koridor, dan berbagai jenis pekerja hanya dapat pergi ke tempat-tempat tertentu di mana mereka memiliki akses. Seperti yang dikatakan matematikawan, tanpa kehilangan keumuman, anggap bahwa kantor kami, dalam kondisi normal, memproses 200 pesan sehari dengan waktu pemrosesan pesan rata-rata 5 menit.


Jadi, tugas kita adalah meminimalkan waktu pemrosesan pesan. Dalam hal ini, diinginkan bahwa waktu pemrosesan maksimum tidak melebihi rata-rata lebih dari, katakanlah, dua kali. Artinya, semburan aktivitas harus ditangani secara efektif.


Jadi dari mana kita mulai? Cara termudah untuk mempekerjakan lebih banyak karyawan adalah dengan memproses lebih banyak pesan. Sangat menyenangkan untuk mencari pekerja cepat, maka waktu pemrosesan akan berkurang. Katakanlah kita menyewa Usain Bolt dan finalis Olimpiade lainnya. Mungkin waktu pemrosesan menurun hingga 2 menit. Tetapi jelas bahwa tidak ada tempat untuk bergerak lebih jauh ke arah ini. Tidak ada yang berjalan lebih cepat. Batas tercapai. Membandingkan pendekatan ini dengan komputer, mempekerjakan orang membeli perangkat keras tambahan (server, prosesor, inti) untuk meningkatkan jumlah utas eksekusi. Mempekerjakan atlet mirip dengan membeli besi tercepat (frekuensi maksimum di tempat pertama).


Mungkin tata letak kantor kami tidak optimal. Ruang yang memadai harus disediakan bagi pekerja untuk bekerja secara efisien. Mungkin memperluas koridor, kalau tidak orang harus saling memberi jalan, kehilangan waktu berharga? Mari berkembang. Mari kita sedikit meningkatkan ruangan agar orang tidak berkerumun saat mendekati meja. Ini seperti membeli server dengan lebih banyak core dan lebih banyak memori dan bandwidth I / O.


Selain itu, kita dapat beralih ke layanan ekspres alih-alih surat biasa untuk bertukar pesan dengan dunia luar. Dalam istilah komputer, ini mirip dengan memilih dan mengoptimalkan peralatan jaringan dan tumpukan jaringan sistem operasi. Semua ini adalah biaya tambahan, tetapi kami menganggap bahwa mereka pasti akan membayar.


Jadi, setelah inovasi, waktu pemrosesan pesan kami turun menjadi, katakanlah, satu menit. Pekerja juga dapat dilatih untuk meningkatkan proses komunikasi dan eksekusi. Mungkin ini akan memberi 15 persen dengan motivasi yang tepat. Dia tahu kita mencapai 51 detik. Ini mirip dengan optimasi perangkat lunak.


Langkah selanjutnya adalah mencoba menghindari tabrakan antara pekerja kami yang bergerak cepat. Kemacetan yang mungkin terjadi adalah pendekatan ke tabel. Dianjurkan agar pekerja memiliki akses instan dan simultan ke meja yang mereka butuhkan. Anda dapat mengurutkan pesan di atas meja saat meletakkan (meletakkan di folder terpisah) untuk mempercepat akses. Pesan mungkin juga memiliki prioritas yang berbeda. Dalam program ini, ini adalah analogi sinkronisasi ulir. Streaming harus memiliki akses paralel dan maksimum tanpa batas ke data. Memperbaiki masalah sinkronisasi utas sering kali memberikan peningkatan besar dalam throughput sistem dan membantu meningkatkan waktu respons. Dalam arti memproses semburan aktivitas, pengaruh algoritma sinkronisasi optimal umumnya sulit ditaksir terlalu tinggi.


Selain itu, pekerja terkadang menemukan diri mereka di depan pintu yang tertutup. Masalah kecil lainnya dari sifat ini dapat menyebabkan ketidaknyamanan dan keterlambatan. Dianjurkan untuk memenuhi kondisi berikut: jumlah orang di gedung yang diberikan tidak pernah melebihi kapasitasnya, kecepatan karyawan tidak terbatas, tidak ada tindakan yang diambil yang tidak terkait dengan pekerjaan utama, dan tidak ada orang luar yang masuk ke dalam proses kerja. Dalam istilah komputer, ini berarti bahwa jumlah utas tidak pernah melebihi jumlah inti yang tersedia, platform dikonfigurasikan untuk frekuensi / kinerja maksimum, mode ekonomis dimatikan, mode Turbo dihidupkan, dan kernel sistem operasi dan aplikasi lain diisolasi dan (hampir) tidak mempengaruhi platform perdagangan.


Sekarang saatnya mempertimbangkan lebih cermat lagi kondisi di kantor. Apakah pintu terbuka dengan mudah? Apakah lantainya tergelincir? Ini hampir sama dengan menganalisis interaksi dengan sistem operasi. Jika tidak ada yang diperbaiki, Anda dapat mencoba menghindari penggunaan bagian-bagian tertentu. Misalnya, alih-alih mengirim surat melalui kantor, mengapa tidak mencoba melemparkannya dari jendela ke jendela? Anda mengatakan tidak nyaman? Mungkin tidak nyaman, tetapi cepat. Ini mirip dengan menggunakan pendekatan bypass kernel di tumpukan jaringan.


Alih-alih menggunakan tumpukan jaringan sistem operasi, bypass kernel mengeksekusi tumpukan jaringan di ruang pengguna. Ini membantu untuk menyingkirkan penyalinan data yang tidak perlu antara sistem dan tumpukan pengguna dan keterlambatan dalam pelaksanaan aliran penerimaan pesan. Dalam memotong kernel, aliran terima biasanya menunggu secara aktif. Dia tidak duduk di kunci sistem operasi, tetapi terus-menerus memeriksa variabel kunci sampai memberinya izin untuk dieksekusi.


Bahkan, jika kita mulai melempar pesan melalui windows, mari kita lakukan secara efisien. Pilihan yang paling dapat diandalkan adalah melewati jendela dari tangan ke tangan. Prinsip ini digunakan dalam protokol TCP. Ini bukan opsi tercepat. UDP memungkinkan Anda untuk mengirim pesan tanpa pengakuan. Lebih cepat. Tidak ada yang diminta untuk menunggu. Pikirkan ini batasnya? Tidak, Anda masih bisa belajar melempar melalui jendela sehingga surat itu jatuh langsung di atas meja yang diinginkan dan di folder yang diinginkan. Pendekatan ini disebut akses memori langsung jarak jauh (RDMA). Saya pikir kami mengurangi waktu pemrosesan detik menjadi 35.


Atau mungkin membangun kantor dari awal alih-alih mengadaptasi kantor yang ada dengan kebutuhan kita? Sedemikian rupa sehingga memberikan kondisi kerja yang ideal. Mungkin ini akan meningkatkan waktu respons detik hingga 20, atau bahkan kurang. Desain kantor sendiri adalah penggunaan field programmable gate array (FPGA). FPGA adalah sesuatu seperti prosesor yang perangkat kerasnya diprogram untuk memecahkan masalah tertentu. Prosesor reguler dikodekan untuk mengeksekusi serangkaian instruksi spesifik pada tipe data tertentu dan utas eksekusi (jangan dikacaukan dengan utas aplikasi) juga diperbaiki. Berbeda dengan prosesor, FPGA tidak diprogram untuk serangkaian instruksi, tipe data, dan aliran eksekusi. Mereka diprogram untuk tugas tertentu dan dalam kondisi ini hanya mampu menjalankannya (hingga pemrograman ulang berikutnya). Pemrograman FPGA yang efektif bukanlah tugas yang mudah. Membuat perubahan pada program mungkin juga membutuhkan banyak upaya. Meskipun FPGA tidak menyiratkan mempekerjakan Usain Bolt (frekuensi jauh lebih rendah daripada prosesor), tetapi paralelisme eksekusi instruksi yang tidak terbatas memungkinkan mencapai waktu pemrosesan pesan yang lebih rendah daripada pada prosesor.


Kesimpulannya, saya akan merekomendasikan alat analisis kinerja untuk perangkat lunak. Intel VTuneTM Amplifier dan teknologi Intel Processor Trace membantu Anda melihat secara terperinci di mana dan mengapa waktu CPU terbuang.


Jika Anda tertarik dengan topik ini, Anda dapat membaca artikel saya di Intel Developer Zone (dalam bahasa Inggris), yang juga memberikan tips teknis praktis tentang cara mengoptimalkan waktu respons.


  • https://software.intel.com/en-us/articles/optimizing-computer-applications-for-latency-part-1-configuring-the-hardware
  • https://software.intel.com/en-us/articles/optimizing-computer-applications-for-latency-part-2-tuning-applications

Source: https://habr.com/ru/post/id437626/


All Articles