SORU
14 NİSAN 2010, ÇARŞAMBA


en hızlı (düşük gecikme süresi) Java ve C/C arasında Arası İletişim Süreci için yöntem

Bir Java uygulaması, bir "sunucu" C/C . gelişmiş TCP soket üzerinden bağlantı var

her iki uygulama ve sunucu aynı makine üzerinde, Solaris kutusu (ama sonunda Linux göç düşünüyoruz) çalışmakta. veri alış tip basit mesajlar (oturum açma, istemci bir şeyler sorar açma ACK, sunucu yanıtı). her mesaj yaklaşık 300 bayt uzunluğundadır.

Şu anda Yuva kullanıyoruz, ve hepsi bu TAMAM, ancak veri alışverişi () düşük gecikme için daha hızlı bir yol mu arıyorsunuz, IPC yöntemleri kullanıyorum.

Net araştırdım ve aşağıdaki teknolojileri referansları ile geldi:

  • paylaşılan hafıza
  • borular
  • kuyrukları
  • DMA olarak ne kadar iyi (Doğrudan Bellek Erişimi)

ama bulamadım uygun analiz kendi performansları, ne de ' nasıl onları hem JAVA ve C/C (bunlar konuşmak için birbirleriyle), borular dışında belki de ben hayal nasıl.

herkes performansları ve bu çerçevede her yöntemin fizibilite hakkında yorum yapabilir mi ? uygulaması yararlı bilgi için herhangi bir işaretçi / link ?


/ GÜNCELLEME DÜZENLEMEK

yorum ve cevapları takip var, inşa edilecek boru biraz üzerinde gibi görünüyor, ve bana tüm TCP kurtarmak olurdu Unix alan Soketi hakkında bilgi yığını buldum. belirli bir platform ya da juds junixsocket ya JNI ile test etmeyi planlıyorum.

bir sonraki olası adımları boruları doğrudan uygulama olur, sonra karmaşıklık ekstra seviye uyarıldım ancak paylaşımlı bellek,...


yardımlarınız için teşekkürler

CEVAP
20 HAZİRAN 2011, PAZARTESİ


Corei5 2.8 GHz benim Java test gecikme, tek tek bayt/alınan gönderip, 2 Java işlemler sadece, taskset ile belirli bir CPU çekirdeği atamadan kökenli:

TCP         - 25 microseconds
Named pipes - 15 microseconds

Şimdi açıkça çekirdek maskeleri belirterek, gibitaskset 1 Srv javayataskset 2 Cli java:

TCP, same cores:                      30 microseconds
TCP, explicit different cores:        22 microseconds
Named pipes, same core:               4-5 microseconds !!!!
Named pipes, taskset different cores: 7-8 microseconds !!!!

bu yüzden

TCP overhead is visible
scheduling overhead (or core caches?) is also the culprit

Aynı zamanda İplik.(0) trace gösterildiği gibi tek bir sched_yield neden olan (() Linux çekirdeği yürütülecek çağrı) uyku 0.3 mikrosaniye - named pipes tek çekirdekli planlanan hala fazla masraf var

Bazı paylaşılan bellek ölçü: 14 Eylül 2009 – Teselli Sistemleri, Birleşik Mesajlaşma Platformu API 700'den az nanosaniye paylaşılan bellek taşıma kullanarak ortalama gecikme süresi elde edebilirsiniz duyurdu. http://solacesystems.com/news/fastest-ipc-messaging/

P. S. - bellek eşlenen dosya şeklinde paylaşılan bellek ertesi gün çalıştı, eğer meşgul bekleme kabul edilebilir ise, 0.3 mikrosaniye gecikme azaltabiliriz kod ile tek bir bayt geçen bu gibi:

MappedByteBuffer mem =
  new RandomAccessFile("/tmp/mapped.txt", "rw").getChannel()
  .map(FileChannel.MapMode.READ_WRITE, 0, 1);

while(true){
  while(mem.get(0)!=5) Thread.sleep(0); // waiting for client request
  mem.put(0, (byte)10); // sending the reply
}

Notlar: İplik.uyku(0) 2 işlemler birbirlerinin değişiklikleri görebilmesi için gereklidir (Başka bir yol olduğunu henüz) bilmiyorum. Eğer 2 işlemler taskset ile çekirdek aynı,yapmak zorunda kalsaydınız gecikme olur 1.5 mikrosaniye - içerik anahtarı bir gecikme

P. P. S - 0,3 mikrosaniye iyi bir sayı! Aşağıdaki kodu yalnızca ilkel bir dize birleştirme yaparken tam olarak 0.1 mikrosaniye alır:

int j=123456789;
String ret = "my-record-key-"   j    "-in-db";

P. P. P. S - Bu çok konu dışı değil, ama sonunda İplik değiştirmeyi denedim umarım.statik değişken int bir değişken (JVM bunu yaparken CPU cache yıkayın başına gelir) artırma ve kayıt elde yatmak(0)! -72 nanosaniye java-java iletişimin gecikmesi!

Ne zaman zorla için aynı CPU Çekirdek, ancak, uçucu artan Jvm'ler hiç verim kontrol etmek için birbirlerine, böylece üreten tam 10 milisaniyelik gecikme - Linux zamanı kuantum sanırım 5 ms... Yani bu kullanılmalıdır yalnızca bir yedek core - yoksa uyuyamıyorum(0) daha güvenli.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bigky226

    bigky226

    11 HAZİRAN 2006
  • monkophile

    monkophile

    25 Temmuz 2007
  • PlayStation

    PlayStation

    16 Aralık 2005