selamu aleyküm...
soket programa üzerine arastirma yapiyorum. TServerSocket ve TClientSocket ile ise yarar islemler yapilabiliniyor fakat okudugum makalelerde bu soket lerin profesyonel olmadigini, eger ki profesyonel bir islem yapmak istiyorsaniz (cok cok cok kullanicili) o zaman indy soketlere basvurmaniz gerekiyor, cünkü onlar multithread deniliyor...
bende basladim thread olayini arastirmaya. indy server her bir socket icin bi thread olusturuyor mus. fakat thread konusunu inceledigimde birbiri ile alakali olmayan cok cesitli rakamlar gördüm. örnegin max 10 adet thread olusturabiliriz, biri yazmis max 16 digeri yazmis 200 bir digeri NT isletim sistemlerinden itibaren 1024 thread, bir digeri ise 2000 thread ayni anda calisir ve isterseniz 20 bin thread yazin geri kalani da aktif olabilmek icin threadpool a atilip orada beklemeye alirlar.
peki indy her connection basina bir thread üretiyor ise, atiyorum 100 bin client baglanti istegi yapar ise, bu 100 bin thread demek tir. indy bu isi nasil yapiyor?
kücük bir info: indy her bir client baglantisini dinleyebilmek ve sorgusuna cevap verebilmek icin bir thread olusturuyor mus.
diger bir soru ise: ben TServerSocket'e TClientSocket ile 9973 adet baglanti kurabiliyorum. 9974 olmuyor. bunun sinirini belirleyen ne dir? indy kac adet baglantiya izin veriyor? (msn, icq yada skype bu kadar cok baglantiyi nasil saglayabiliyor?)
multithread socket (max thread ve connection)
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
multithread socket (max thread ve connection)
kıdemsiz üye
Re: multithread socket (max thread ve connection)
Bu konuyu bende araştırdım.
Indy'i yazanlar öyle iddia etsede, indy o kadar ölçeklenebilir değil özellikle multi-core sistemler için.
Indy blocking socket kullanıyor o yüzden her bağlantı için bir thread oluşturuluyor. Ver read/write işlemleri gerçekleşene kadar bu threadlerin çoğu suspend şekilde duruyor. Suspend oluyorsa sisteme zararı olmaz diye düşünülebilir. (indyciler de bu argümanı savunuyorlar) Fakat bu sayının çokluğu, threadler çalışmasa bile okuduklarımdan edindiğim izlenime göre 1000'e yaklaştığı zaman windows thread schedulerı, bunları zamanlamada problem yaşadığı için sistemde çok büyük yavaşlama oluyormuş. Bu problemi çözmek için kullanılan yöntem OVERLAPPED socket I/O + I/O completion ports. (IOCP)
Indy'nin 10. versiyonunda IOCP desteğini içeren supercore'u geliştirmişler fakat deneme aşamasından çıkamadı. Ve birdahaki unicode sürümünde tamamen paketten çıkabilir gibi gözüküyor.
Delphi için hatta diğer diller için bile overlapped IO + IOCP örnekleri fazla yok internette. Delphi için 2 tane implementasyon bulmuştum fakata şimdi dosyalarımda bulamadım onları araştırırsan sende ulaşabilirsin.
İşletim sisteminin socket sınırı var bu değeri değiştirmek için programlar var.
Msn, Skype tek merkez çalışmıyorlardır, muhtemelen 100 lerce farklı yerlerde serverları vardır.
Indy'i yazanlar öyle iddia etsede, indy o kadar ölçeklenebilir değil özellikle multi-core sistemler için.
Indy blocking socket kullanıyor o yüzden her bağlantı için bir thread oluşturuluyor. Ver read/write işlemleri gerçekleşene kadar bu threadlerin çoğu suspend şekilde duruyor. Suspend oluyorsa sisteme zararı olmaz diye düşünülebilir. (indyciler de bu argümanı savunuyorlar) Fakat bu sayının çokluğu, threadler çalışmasa bile okuduklarımdan edindiğim izlenime göre 1000'e yaklaştığı zaman windows thread schedulerı, bunları zamanlamada problem yaşadığı için sistemde çok büyük yavaşlama oluyormuş. Bu problemi çözmek için kullanılan yöntem OVERLAPPED socket I/O + I/O completion ports. (IOCP)
Indy'nin 10. versiyonunda IOCP desteğini içeren supercore'u geliştirmişler fakat deneme aşamasından çıkamadı. Ve birdahaki unicode sürümünde tamamen paketten çıkabilir gibi gözüküyor.
Delphi için hatta diğer diller için bile overlapped IO + IOCP örnekleri fazla yok internette. Delphi için 2 tane implementasyon bulmuştum fakata şimdi dosyalarımda bulamadım onları araştırırsan sende ulaşabilirsin.
İşletim sisteminin socket sınırı var bu değeri değiştirmek için programlar var.
Msn, Skype tek merkez çalışmıyorlardır, muhtemelen 100 lerce farklı yerlerde serverları vardır.
Re: multithread socket (max thread ve connection)
hocam öncelikle konuya olan ilginizden dolayi tesekkür ederim.
yazinizdan anlasiliyor ki, aslinda profesyonel bir yazilim icin indy cözüm gibi görünmüyor. epey bi arastirdim indyi.. icerisinde cok fazla hata barindirdigini ve bunlar cözülmez ise ileriki dönemlerde büyük sorunlar ile karsilasacagi yaziyor.
indy de bu isi beceremiyor ise eger, artik bu sevda dan vaz gececegiz galiba...
istedigim msn tarzi bir server client olusturmak. forumda arama yaptim, bir cok arkadas benim gibi bu konuya egilmisler fakat henüz elde tutulur bir cözüm bulunamamis.
aslinda bi bilesen yazilabilinir. fakat bunun test asamasina kafam basmiyor. bunu test etmek icin publish etmek gerekiyor. kullanicilar yazacaklar, veri gönderecekler vs. fakat tam bu esnada soket ler bu yükü kaldiramayacak olur ise, programin adi kötüye cikar ve bir daha bu programi kullanacak birilerini bulamayabilirim.
simdi soruyu su sekilde formüle edeyim: Ben bir soket bileseni yazsam, bu bilesenler ile de client server olustursam, son kullaniciya dagitmadan önce bu programin verimliligini nasil deneyebilirim?
degerli fikirleriniz den yararlanabilmek ümidi ile tekrar tesekkür ediyorum...
yazinizdan anlasiliyor ki, aslinda profesyonel bir yazilim icin indy cözüm gibi görünmüyor. epey bi arastirdim indyi.. icerisinde cok fazla hata barindirdigini ve bunlar cözülmez ise ileriki dönemlerde büyük sorunlar ile karsilasacagi yaziyor.
indy de bu isi beceremiyor ise eger, artik bu sevda dan vaz gececegiz galiba...
istedigim msn tarzi bir server client olusturmak. forumda arama yaptim, bir cok arkadas benim gibi bu konuya egilmisler fakat henüz elde tutulur bir cözüm bulunamamis.
aslinda bi bilesen yazilabilinir. fakat bunun test asamasina kafam basmiyor. bunu test etmek icin publish etmek gerekiyor. kullanicilar yazacaklar, veri gönderecekler vs. fakat tam bu esnada soket ler bu yükü kaldiramayacak olur ise, programin adi kötüye cikar ve bir daha bu programi kullanacak birilerini bulamayabilirim.
simdi soruyu su sekilde formüle edeyim: Ben bir soket bileseni yazsam, bu bilesenler ile de client server olustursam, son kullaniciya dagitmadan önce bu programin verimliligini nasil deneyebilirim?
degerli fikirleriniz den yararlanabilmek ümidi ile tekrar tesekkür ediyorum...
kıdemsiz üye
Re: multithread socket (max thread ve connection)
indy'i o kadar da küçümsememek lazım birçok kişinin işini görüyor. Ben çok hata olduğu gibi birşeye rastlamadım araştırmalarımda.
Test clientı yazıp, çok sayıda bağlantı ve işlemle servera stres testi yaptırabilirsin.
Bende Msn tarzı anında mesajlaşma programı yazıyorum, bayağ aşama kaydettim şu an test ediyoruz. Projede çok fazla client bağlanmayacağı için indy kullandım fakat projeyi tümden indy'yede bağlanmadım. Şu an indyden kaynaklanan problem olmadı fakat yüksek sayıda clientla test yapmadık.
Kullanacağın socket yönteminden daha büyük problemlerde var önünde. Nasıl bir protokol kullancaksın mesela ? Bir kişiye aynı anda veri giderse ne olur ? İki kişi aynı anda bir kaynağa ulaşırsa birini bekletmen gerekecek. Çok kanallı çalışman gerekecek.
Test clientı yazıp, çok sayıda bağlantı ve işlemle servera stres testi yaptırabilirsin.
Bende Msn tarzı anında mesajlaşma programı yazıyorum, bayağ aşama kaydettim şu an test ediyoruz. Projede çok fazla client bağlanmayacağı için indy kullandım fakat projeyi tümden indy'yede bağlanmadım. Şu an indyden kaynaklanan problem olmadı fakat yüksek sayıda clientla test yapmadık.
Kullanacağın socket yönteminden daha büyük problemlerde var önünde. Nasıl bir protokol kullancaksın mesela ? Bir kişiye aynı anda veri giderse ne olur ? İki kişi aynı anda bir kaynağa ulaşırsa birini bekletmen gerekecek. Çok kanallı çalışman gerekecek.
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
Re: multithread socket (max thread ve connection)
Real Thin Client VCL bileşenleri var. Oldukça başarılı. Hatta kendi sitelerini bile bu bileşenlerle yazılmış WEB sunucusu ile çalıştırıyorlar. Tamamen ücretsizdir. Sadece destek vs. konularında ücret talep ediyorlar.
Ana sayfada RTC SDK VISUAL LESSONS başlığıyla görüntülü dersler var. Ne kadar kolay kullanıldığını gösteriyorlar.
Test sonuçları için: http://www.realthinclient.org/tests.htm
Ayrıca MSN gibi örnek programlarıda var. Tabi bu örneklerin kodlarını bilahare satıyorlar. Fakat çekirdek bileşenler ücretsiz. İncemelenizi tavsiye ederim.
Link: http://www.realthinclient.org/
Saygılar.
Ana sayfada RTC SDK VISUAL LESSONS başlığıyla görüntülü dersler var. Ne kadar kolay kullanıldığını gösteriyorlar.
Test sonuçları için: http://www.realthinclient.org/tests.htm
Ayrıca MSN gibi örnek programlarıda var. Tabi bu örneklerin kodlarını bilahare satıyorlar. Fakat çekirdek bileşenler ücretsiz. İncemelenizi tavsiye ederim.
Link: http://www.realthinclient.org/
Saygılar.
Re: multithread socket (max thread ve connection)
hocam ilgilerinizden ötürü tesekkür ederim...
verdiginiz link teki bilesenlerin test lerini inceledim. adamlar oldukca iddiali lar bu konuda anladigim kadari ile... 3900 client ik bir deneme yapmislar ve hic bir sorun ile karsilasmamis lar... Bilesenleri kullanarak ben de bi strestest uygulamasi yapacagim en kisa zamanda insaAllah... bakalim isin altindan kalkabilecek miyiz...
bu arada msn bu isi nasil yapiyor diye düsünürken bi mantik üretmeye calistim.
kurgu söyle olabilir dedim kendi kendime: bir tane ön server tüm baglanti isteklerini kabul edip, o an müsait olan server adreslerini ve portlarini baglanti istegi yapan client lere gönderiyor, client ön server dan disconnect olup, gelen müsait server a baglanti kuruyor. 1000 baglanti istegi geldi diyelim ve 10 aktif server var. server basina 100 baglanti seklinde esit paylasim yaptiriyor dur...
umarim dogru bir kurgu dur, cünkü ben bu yöntem ile x adet server uyumlu bir proje gelistirmeyi düsünüyorum...
Allah tan hayirlisi...
selam ve dua ile...
ikra...
verdiginiz link teki bilesenlerin test lerini inceledim. adamlar oldukca iddiali lar bu konuda anladigim kadari ile... 3900 client ik bir deneme yapmislar ve hic bir sorun ile karsilasmamis lar... Bilesenleri kullanarak ben de bi strestest uygulamasi yapacagim en kisa zamanda insaAllah... bakalim isin altindan kalkabilecek miyiz...
bu arada msn bu isi nasil yapiyor diye düsünürken bi mantik üretmeye calistim.
kurgu söyle olabilir dedim kendi kendime: bir tane ön server tüm baglanti isteklerini kabul edip, o an müsait olan server adreslerini ve portlarini baglanti istegi yapan client lere gönderiyor, client ön server dan disconnect olup, gelen müsait server a baglanti kuruyor. 1000 baglanti istegi geldi diyelim ve 10 aktif server var. server basina 100 baglanti seklinde esit paylasim yaptiriyor dur...
umarim dogru bir kurgu dur, cünkü ben bu yöntem ile x adet server uyumlu bir proje gelistirmeyi düsünüyorum...
Allah tan hayirlisi...
selam ve dua ile...
ikra...
kıdemsiz üye
Re: multithread socket (max thread ve connection)
güzel bir bilgi
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog