Socket Programlama ile İlgili

Başlatan yamak, 12 Ocak 2016, 11:39:19

yamak

Merhaba Arkadaşlar,
Çok fazla TCP bağlantıyı(Yaklaşık 10000) aynı anda karşılayabilecek bilecek ve gelen paketleri database e yazacak bir java programı yazdım..Bu programı test etmek için aynı anda 10000 bağlantı açıp gerekii paketleri gönderen bir program daha yazdım simüle etmek için.Simulasyon programım her bir bağlantı için ayrı bir thread oluşturup bağlantıyı kuracak şekilde.Ve bağlantıların açılma süreleri arasında hiç bir bekleme yok Ayrıca simülasyonu loopback adresi ile yapıyorum yani hem server hem client aynı pc üzerinde çalışıyor.Şimdi sorunum şu:
Bu simülasyonu evdeki danki laptopumda yaptığım server program %100 e yakın tüm paketleri alıp veritabanına yazıyor.Ama aynı testi iş yerindeki workstation da yaptığımda aynı performansı alamıyorum.Bağantılar açıldıktan sonra paketler çok yavaş geliyor ve bir süre sonra da programda timeout süresi aşıldığı için bağlantıyı server tarafından kapatıyorum.
Burda sormak istediğim soru:Bu şekilde bir test yapmam doğru mudur?Ayrıca yukarıdaki durum normal midir?Problemi yazdığım programda mı aramalıyım?

kralsam

Hocam ayrı thread'e neden ihtiyaç duydun? Tek thread ve gerektiği kadar soket açarak yapsan daha iyi olmaz mı? (Tabi amaç sadece geleni database yazmak kadar sadeyse)

yamak

Hocam server tarafından non blocking IO kullandığım için zaten tek thread açıyorum.Thread açıyorum dediğim yer simülasyon için yazdığım client programı.Ayrıca hocam sadece geleni database e yazmıyorum.Login olma gerekli paketler ack nack gönderme checksum kontrolü gibi olaylar da var.

peko

Alıntı Yaploopback adresi ile yapıyorum

10000 bağlantı açman hiç mühim değil, bu bağlantıların kaç tanesine bilgisayarından eş zamanlı çıkış izni veriyorsun o önemli. (loopback bunu bypass ediyor ve herşey yolunda gidiyor.)

Fiddler ile izle bakalım neler dönüyor arkada..
" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

yamak

#4
Hocam program kaba taslak şöyle işliyor:
Bir thread sadece non blocking olarak bağlantıları handle ediyor.Bu thread gelen data ları bir hash map e  yazıp başka bir threadi notify ediyor.Sonra bu thread her bir connection ı parse etmesi için yazmış olduğum bir class tan her bir connection için bir instance üretiyor.Bu instance larda frame parse edip checksum ları kontrol ettikten sonra ack frame ini call back ile geri döndürüyor ve bu frame ilk thread olan bağlantıları handle eden thread deki queue ya yazılıyor ve sırayla gönderiliyor.Karşı taraf bağlantıyı kapatınca ya da işinin bittiğine dair bir data gönderince de bağlantıyı kapatıyorum.
Yani yapımda bir sınırlama yok.Wireshark ile izliyorum gerçek bağlantıda bir sorun görmüyorum.Ama 10000 tane gerçek bağlatıyı test etme imkanım şu an yok.O yüzden loopback ten simüle ediyorum.
Alıntı yapılan: peko - 12 Ocak 2016, 15:24:50
bu bağlantıların kaç tanesine bilgisayarından eş zamanlı çıkış izni veriyorsun o önemli. (loopback bunu bypass ediyor ve herşey yolunda gidiyor.)
Hocam bu cümlede neyi kastetdiğiniz tam anlamadım.Açıklayabilir misiniz?
Sİmülasyon için yazdığım program server tarafından gönderilen ack frame'lerini bekliyor.Tüm ack'leri aldığını görüyorum.Ayrıca tüm client'ların gönderdiği frame'ler parse edilip database de gerekli tablolara da yazılyor.Buna rağmen loop back değil de bağlantılar harici pc lerden açılsa başka problemler oluşur mu?