Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Indy TCP Server-Client Sorularım
#31
[quote pid='36649' dateline='1587651756']
Merhaba test uyuglamanız çok başarılı ben 1 win makinesi ve 2 sanal makine üzerinde işletim sisteminin dynamic port limtini tamamen doldurdum ve hiç bir hata çıkmadı. 
http://prntscr.com/v45v6a 
İşletim sistemi Linux server olsa idi belki daha fazla bağlantı da yapardı. Çünkü işlemci ve ram kullanımı makul seviyede. Sanal makine ile host aynı makinede. Server 386 mb ram kullandı .
http://prntscr.com/v45up9 
Burda Server tarafını 64 bit derledim belki diğer testlerde bağlantı sayısının az olma nedeni bu olabilir.Diğer bir olasılık 2 sanal makinede aynı anda testi başlattım. indy işletim sisteminin ve sunucu kaynaklarının izin verdiği miktarda bağlantıyı yapabiliyor. bir sorun yok.Emeği geçnelere teşekkürler Çok başarılı bir çalışma





Evet sorunun çözümünü Remy(rlebeau) nin dediği gibi yaptım ve Client sayısı arttı. 5000 Client ile kendi bilgisayarımda test ettim ve sorunsuz olarak bağlantıları gerçekleştirdim.
Hatta bir adım daha ileri gidip 10000 Client test ettim 5800+ kilitlendi.

Delphi 10.3 ile test ettim. Windows 10 x64 ve 16GB Ram

Sorunun çözümü şu şekilde oldu. Default Stack Size değerlerindeki Max Stack size değerini düşürdüm. Varsayılan Stack Size değerleri burada yazıyor.
Max Stack Size değerini "65536" olarak değiştirdim.

Bu Max Stack Size değerini değiştirime işlemi proje ayarı yerine Compiler Directive ile yapabiliriz.
{$MaxStackSize 65536}

Fakat ben bulamadım bu Stack Size değerinin birimi nedir? Bilen arkadaşlar yardımcı olursa sevinirim. 65536 Byte mı demiş olduk.

@SimaWB, @mcansız muhtemelen Lazarus tarafında çalışmasının nedeni de Stack Size değerlerinin varsayılan olarak Delphi ve Lazarus da farklı olması.

Lazarus tarafında default Stack Size değerini göremedim çok fazlada araştırmadım.


Test etmek isteyenler için proje kaynak kodlarının tamamı ekliyorum.

[/quote]
Cevapla
#32
Merhaba,
Tek port üzerinden iletişim kurmayı deneyin. Bir düşüş olabilir mi görmüş oluruz.
Cevapla
#33
burada esas sorun eş zamanlı bağlantı sayısı değildir, async soket kullanarak 60k ya kadar çıkarırsınız,
sorun eş zamanlı bağlı 60k client için gelen/giden komutlara ortalama 100ms içinde işlemi bitirip cevap verebilecekmisiniz,
örneğin veri tabanının querlerden ötürü 100ms geç cevap vermesi 60k client için 60.000*100ms = 6.000.000/1000 = 6000ms = 6sn gecikme yaratır, bu tarz bir yapıda sql veritabanı kullanamazsınız, bu esnada veritabanının bir anda tüm cpu ya yükleneceğinide unutmamak gerek, zaten etrafdaki hiç bir sql veritabanı ile sn de 60k query çalıştaramazsınız.. birazda bu konuları tartışmakda neler yapılabilirliğine bakmakda yarar vardır.
Cevapla
#34
(23-04-2020, Saat: 17:22)3ddark Adlı Kullanıcıdan Alıntı: Evet sorunun çözümünü Remy(rlebeau) nin dediği gibi yaptım ve Client sayısı arttı. 5000 Client ile kendi bilgisayarımda test ettim ve sorunsuz olarak bağlantıları gerçekleştirdim.
Hatta bir adım daha ileri gidip 10000 Client test ettim 5800+ kilitlendi.

Delphi 10.3 ile test ettim. Windows 10 x64 ve 16GB Ram

Sorunun çözümü şu şekilde oldu. Default Stack Size değerlerindeki Max Stack size değerini düşürdüm. Varsayılan Stack Size değerleri burada yazıyor.
Max Stack Size değerini "65536" olarak değiştirdim.

Bu Max Stack Size değerini değiştirme işlemi proje ayarı yerine Compiler Directive ile yapabiliriz.
{$MaxStackSize 65536}

Fakat ben bulamadım bu Stack Size değerinin birimi nedir? Bilen arkadaşlar yardımcı olursa sevinirim. 65536 Byte mı demiş olduk.

@SimaWB, @mcansız muhtemelen Lazarus tarafında çalışmasının nedeni de Stack Size değerlerinin varsayılan olarak Delphi ve Lazarus da farklı olması.

Lazarus tarafında default Stack Size değerini göremedim çok fazlada araştırmadım.


Test etmek isteyenler için proje kaynak kodlarının tamamı ekliyorum.

Öncelikle ilk defa bir foruma yorum yazmaya çalışıyorum. Her konuda başlangıcında altında olduğumu bilmenizi isterim. Bir kusurum olursa şimdiden affola. 
Elinize emeğinize sağlık çok öğretici işin açığı sizlerden çok şey öğreniyorum.@SimaWB, @mcansız,@3ddark
Yazdığınız Server kısmını http://www.overbyte.eu/  ICS kütüphanesiyle her bir ClientThread 100 bağlantı alır diyerek  denediğim zaman 15000 bağlantının serverda oluştuğunu gördüm. Web sayfasında Server Thread Demo mevcut.

Asıl sorum şu: Modbus TCP'yi ele alalım.Modbus, Master - Slave yapısında ve Slaveler aslında bağlantı kabul eden TCP Serverlar. Bir tesiste yüzlerce Modbus Slave var bunların IP adresleri 192.168.1.2 başlayıp 192.168.255.255  veya  10.0.0.0 to 10.255.255.255  kadar gidiyor ve hepsi 502 portundalar. 

Durum şu: 10000 adet  farklı IP'lerde 502 portunda bulunan Modbus Slavelere (TCP server)  bağlantıyı(connect) nasıl açmalıyım. Slaveler hiç bir zaman connection yapamayacaklar. Listening portlar açık bekliyor olacaklar. Bir kere bağlantı yapıldıktan sonra Connection sürekli açık olacak application donmadan 10000 adet Slave'i sorgulamaya devam edecek
Indy veya ICS kütüphanelerinde bulunan IdTCPClient sizin vermiş olduğunuz Client örneğindeki gibi Componentleri Runtime dinamik olarak create mi etmeliyim?
Farklı bir servis yazarak veya farklı bir app.exe yazarak.. ve/veya app.exe TFrame kullanarak mı yapmalıyım?   
Bağlantı kuracak olan 10000 adet IdTCPClient veya TWSocket Bileşenini bir Thread içinde mi oluşturmalıyım? 
Bağlantı kuracak olan IdTCPClient veya TWSocket Bileşenini 10000 Thread ile mi oluşturmalıyım?
Indy'den türetilmiş çok keyifli IdModBusServer(Modbus Slavler) ve IdModbusClient(Master) bileşen kütüphanelerinde mevcut,
üsteki sorum bu IdModbusClient(Master) içinde geçerli nede olsa oda bir Indy IdTCPClient?

Engin bilgi paylaşımınız ve fikirleriniz için şimdiden teşekkür ederim.
Cevapla
#35
Slave cihazlarınız Server Modda çalışıyor ise aslında Master dediğiniz cihaz Client olarak çalışacağı için ve her bağlantının açık kalması gerektiğini ve sürekli sorgulaması gerektiğini söylediniz.

Bu nedenlerle her cihaz için bir client olmalı. Bu durumda 10000 client olacağı için bunların dinamik olarak create edilmesi doğrudur.

Benim önerim bu sistem madem TCP Server ve Client gibi çalışıyor. Bu durumda sistemi simüle eden test yazılımı yapın. İlk aşamada ModbusClient(TCP Server) sayınızı 3-5 gibi tutun. Başka bir uygulamada veya aynı uygulama içinde dinamik ModbusMaster(TCP Client) oluşturun. Bağlantı kurarak testlerinizi yapın. Dinamik client tarafı doğru olduğunda gerçek uygulama sahasında test edin.

Kurgunuzu ve kodlamanızı çok iyi tasarlayın. 10000 cihaz dediğinizde periyodik sorgulama olacak ve olabilecek gecikmelere veya donmalara karşı önlem almış olursunuz.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#36
(02-03-2021, Saat: 08:11)3ddark Adlı Kullanıcıdan Alıntı: Slave cihazlarınız Server Modda çalışıyor ise aslında Master dediğiniz cihaz Client olarak çalışacağı için ve her bağlantının açık kalması gerektiğini ve sürekli sorgulaması gerektiğini söylediniz.

Bu nedenlerle her cihaz için bir client olmalı. Bu durumda 10000 client olacağı için bunların dinamik olarak create edilmesi doğrudur.

Benim önerim bu sistem madem TCP Server ve Client gibi çalışıyor. Bu durumda sistemi simüle eden test yazılımı yapın. İlk aşamada ModbusClient(TCP Server) sayınızı 3-5 gibi tutun. Başka bir uygulamada veya aynı uygulama içinde dinamik ModbusMaster(TCP Client) oluşturun. Bağlantı kurarak testlerinizi yapın. Dinamik client tarafı doğru olduğunda gerçek uygulama sahasında test edin.

Kurgunuzu ve kodlamanızı çok iyi tasarlayın. 10000 cihaz dediğinizde periyodik sorgulama olacak ve olabilecek gecikmelere veya donmalara karşı önlem almış olursunuz.

Verdiğiniz bilgi için teşekkür ederim deneyeceğim. MainThread'ti dondurmadan nasıl haberleşeceğiz bir bakalım . Saygılar
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  server programinda hani veritabani dogru olur. sadikacar60 4 437 30-01-2024, Saat: 21:06
Son Yorum: sadikacar60
  Delphi 7 Indy Komponent SKC3948 12 2.891 22-12-2023, Saat: 20:36
Son Yorum: maydin60
  Indy Problemi m_ekici 5 696 24-10-2023, Saat: 23:15
Son Yorum: m_ekici
  OPC Server veri okuma enigma 1 395 13-09-2023, Saat: 11:50
Son Yorum: shooterman
  Server-client üzerinden Web arayüze erişim SercanTEK 12 7.547 23-02-2023, Saat: 16:08
Son Yorum: SercanTEK



Konuyu Okuyanlar: 1 Ziyaretçi