Soru Düşük gecikme programlama


Düşük gecikmeli finansal sistemler hakkında çok şey okudum (özellikle kurumsal casusluk meşhur olgularından beri) ve düşük gecikme sistemleri fikri aklımda. Bu adamların ne yaptığını kullanabilecek bir milyon uygulama var, bu yüzden konu hakkında daha fazla bilgi edinmek istiyorum. Mesele, konuyla ilgili değerli bir şey bulamıyorum. Herkes düşük gecikme sistemlerinde kitap, site ve örnek önerebilir mi?


37
2017-07-30 22:42


Menşei


Hangi kurumsal casusluk vakası? - Gavin Miller
Goldman Sachs programcılarının yüksek frekanslı işlem platformlarına kaynak kodu çaldıkları iddia ediliyor: ftalphaville.ft.com/blog/2009/07/08/60761/... - mattnewport
Sağol Matt! - Gavin Miller
Biraz geç ama bu linklerle ilgilenebilirsin plus.google.com/u/1/communities/107178245817384004088  Java sistemlerini, kutunun dışında kalan 20 saniyelik saniyelik sürenin altında (TCP) geliştirebilirsiniz. - Peter Lawrey


Cevaplar:


Borsalar ile doğrudan iletişim kurmak için düşük gecikme yazılımı üreten bir finans şirketi için çalışıyorum (işlemler ve akış fiyatlarının sunulması için). Şu anda öncelikle Java'da geliştiriyoruz. Düşük gecikme süresi, doğrudan çalıştığım bir alan olmasa da, gereken beceriyi içeren adil bir fikre sahibim;

  • Java bellek modeli ve gereksiz çöp toplama (örneğin, nesne havuzu) önlemek için teknikler hakkında detaylı bilgi. Kullanılan tekniklerin bir kısmı, geleneksel bir OO ortamında genellikle "anti-kalıp" olarak kabul edilebilir.
  • Hata ayıklama ve ölçüm gecikmesi için yardımcı programlar dahil olmak üzere TCP / IP ve UDP çok noktaya yayın hakkında ayrıntılı bilgi (örn. Solaris'te DTrace).
  • Profil uygulamalarıyla deneyim.
  • Java.nio paketinin bilgisi, NIO tabanlı ölçeklenebilir sunucu uygulamaları geliştirme deneyimi, tel protokollerinin tasarlanması konusunda deneyim. Ayrıca, çok sayıda özel kod yazmayı tercih ettiğimizden, genellikle çerçeveleri ve harici kitaplıkları (ör. Google Protobuf) kullanmaktan kaçındığımızı unutmayın.
  • FIX ve ticari FIX kütüphaneleri bilgisi (ör. Cameron FIX).

Ne yazık ki, becerilerin çoğu, bir fiyat sunucusunu ya da bir spekülatöre dayalı bir ticaret motorunun uygulanmasından elde edilen deneyimin yerini tutamayacağından, sadece "işin üstünde" geliştirilebilir. bir değişim veya satıcıdan. Bununla birlikte, firmamızın en azından eğilimi olduğunu belirtmekte fayda var. belirli bir deneyim için bakmamak Bu (veya diğer) niş bölgelerde, bunun yerine iyi analitik ve problem çözme becerilerine sahip insanları işe almayı tercih eder.


42
2017-11-08 16:02



Düşük gecikme süresi ve Java? bir çeşit oksimoron gibi görünüyor. - Zamfir Kerlukson
@ZamfirKerlukson: Gelen mesajları 8-9 mikrosaniyede işleyen bir Java mesajlaşma uygulamasına sahibiz. 65-80 mikrosaniyede daha karmaşık sunucu uygulama süreçlerimiz. Java hakkında akılda tutulması gereken bir şey, JIT derleyicisinin kod analizi ve dinamik olarak satır içi yöntemler ve veri erişimi yapabilmesidir. Bu, C programcılarının "inline" anahtar kelimesi ile manuel olarak ne yaptığını otomatikleştirir. Ancak, GC duraklatma sürelerini kontrol etmek zorlayıcıdır (buna değinmeye çalışan bazı JVM çözümleri olsa da). - Sam Goldberg
Java'da düşük gecikme ??? Nasıl mümkün olabilir ??? Düşük gecikme süresi istiyorsanız, en azından C / C ++ veya hatta düzene geçmelisiniz. Düşük gecikme değişim ağ geçidi için çalışıyorum ve mesaj ayrıştırma, risk kontrolü, veritabanı ayırma, yerel mesaj dönüştürme için FIX, C ++ dahil olmak üzere bir paket işleme için 10-20 bize ulaşabilirsiniz. Java ile, birincisinde tamamen yanlış olduğu ortaya çıktı. - DU Jiaen


Düşük gecikme, birçok şeyin bir işlevidir, en önemli iki şey:

  • ağ gecikmesi - yani mesajları iletmek / almak için ağda geçen süre.
  • işlem gecikmesi - yani uygulamanızın bir mesaj / etkinlik üzerinde harekete geçmesi için geçen süre.

Dolayısıyla, bir Sipariş Eşleştirme sistemi yazıyorsanız, ağ gecikmesi, ağınız içinde ne kadar sürede sipariş eşleştirme isteğini alabileceğinizi gösterecektir. İşlem gecikmesi, uygulamanızın Siparişi mevcut, açık siparişlere karşı eşleştirmesi için harcadığı zamanı temsil eder.

Infiniband ağlarında çok noktaya yayın, UDP, güvenilir çoklu yayın, Kernel baypası (Java 7, Informatica Ultra Messaging ve diğer birçok kişi tarafından desteklenen), bu alandaki tüm şirketler tarafından kullanılan bazı yaygın teknolojilerdir.

Ek olarak, düşük gecikme uygulamalarıyla uğraşmak için tasarım modellerini uygulayan bozucu (http://code.google.com/p/disruptor/) gibi düşük gecikme programlama çerçeveleri vardır. Öldüren şey, ana iş akışınızın bir parçası olarak bir DB'ye veya günlük dosyalarına yazmak zorunda kalıyor. Çözmeye çalıştığınız sorunun gereksinimlerini karşılayan benzersiz çözümler bulmak zorunda kalacaksınız.

Java gibi dillerde, uygulamanızı uyguladığınızda (neredeyse) sıfır çöplük, gecikme için çok önemli hale gelir. Adamski'nin dediği gibi, Java bellek modeli hakkında bilgi sahibi olmak çok önemlidir. Farklı JVM uygulamalarını ve sınırlamalarını anlayın. Küçük nesne oluşturma etrafında tipik Java tasarım kalıpları pencereden dışarı atmak olacak ilk şeylerdir - Java Çöp Toplayıcı düşük gecikme elde etmek için yeterli asla düzeltmek asla - tek şey sabit olabilir çöp.

İyi şanslar!


21
2017-11-05 23:14



Düşük gecikme süresi için bozucu seçmek ne zaman iyidir? - gaurav


Bu yazıda çok iyi bir cevap var. Deneyimlerimi de eklemek isterim

  • Java'da düşük gecikme süresi elde etmek için java'da GC'nin kontrolünü almanız gerekir, örneğin nesnelerin önceden tahsisi için (örneğin, flyweight tasarım deseni kullanın), ilkel nesneleri kullanmanın birçok yolu vardır - bu, tüm veriler için çok iyidir yapı ilkel temelli Örneğin yeni nesneleri oluşturmayı azaltmak için sistem genelindeki sözlük oluşturmak, akış / soket / db'den veri okurken çok iyi bir seçenek yaratmak için nesne örneğini yeniden kullanın.

    • Beklemesiz algo kullanmayı deneyin (ki bu biraz zor), kilitsiz algo kilitleyin. Bunun için tonlarca örnek bulabilirsiniz

    • Bellek içi bilgi işlem kullanın. Hafıza ucuz, hafızadaki verilere göre tera byte sahip olabilirsiniz.

    • Eğer bit-bilge usta ustalaşırsanız, o zaman çok iyi bir performans verir.

    • Teknik sempati kullanın - bkz. Lmax bozucu, mükemmel çerçeve


7
2017-10-10 13:06





Eh, sadece "geleneksel" gerçek zamanlı programlama değil, her şey. Borsa için çalışıyorum - hız kraldır. Tipik bir problem, bir dosyaya yazmanın en hızlı yolu nedir? Bir nesneyi serileştirmenin en hızlı yolu? vb.


5
2017-10-03 12:42



Yazılımınız için hangi dili kullanıyorsunuz, C / C ++ veya başka bir şey var mı? - Sam Goldberg


Gerçek zamanlı programlamadaki herhangi bir şey tasarıya uygun olurdu. Tam olarak neyin peşinde olduğunu sanmıyorum, şüpheliyim, ama başlamak için son derece iyi bir yer.


4
2017-07-30 22:50



Gerçek zamanlı programlama, düşük gecikme değil, belirli bir zaman dilimindeki olaylara tepki verme, hızlı bir şekilde değil. - user997112


ZeroMQ'ya bir göz atın. http://www.zeromq.org

Bu sitedeki beyaz makaleleri okuyun ve düşük gecikme programlaması için gerekenleri anlayacaksınız.


4
2017-11-08 16:13





Java düşük gecikme gelişmesiyle ilgileniyorsanız, Çöp Toplayıcıyı kontrol altında tutmanız koşuluyla bir RTSJ (Gerçek Zamanlı) JVM olmadan yapılabileceğini bilmelisiniz. Bir göz atmanı öneririm Bu makale GC geliştirme olmadan Java Geliştirme hakkında konuşuyor. Ayrıca başka birçok makalemiz var bizim sitemiz Düşük gecikmeli Java bileşenleri hakkında konuşur.


4
2018-06-12 14:58





Düşük Gecikme Programlama hakkında bazı yorumlar vermek istiyorum.     Şu anda finansal yazılımlarda düşük gecikme süresi ve yüksek yürütme motorları geliştirme konusunda 5 yıldan fazla deneyime sahibim.

Gecikmenin ne olduğunu anlamak gerekli mi?

Gecikme, sürecinizi tamamlamak için zamana ihtiyacı olduğu anlamına gelir. Kullandığınız geliştirme araçlarına (java, c ++, net vb.) Bağlı değildir, programlama becerilerinize ve sisteminize bağlıdır.

Java kullandığınızı varsayalım, ancak bir hata işleminizde gecikme yapabilir. Örneğin, her fiyat yenilemesinde bazı işlevleri çağırdığınız ve böyle devam eden bir ticaret uygulaması geliştirdiniz. Bu, fazladan değişkenlere, gereksiz bellek kullanımına, süreçte gecikmeye neden olabilecek gereksiz döngülere neden olabilir. Geliştiricinin yukarıdaki hatalara dikkat etmesi halinde .net'te geliştirilen aynı uygulama, java'dan daha iyi performans gösterebilir.

Ayrıca, çoklu işlemci sistemi uygulamanızın çok iş parçacıklı olması durumunda iyi performans gösterebileceği gibi, sunucu sisteminize de bağlıdır.


3
2017-09-17 06:21





Düşük gecikmeli sunucu tasarımı hakkında konuşuyorsanız, bunlar bazı iyi işaretçilerdir: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html


2
2017-12-30 01:40