2010-08-30 91 views
8

Ben bir in-house gigabit ağ üzerinde .NET Remoting kullanan dağıtılmış uygulama var. Tek bir sunucu ve sunucuya bağlanan bir düzineden fazla müşteri var. İstemciler birden çok iş parçacığı çalıştırır ve her bir istemciden en fazla 10 eşzamanlı istek olabilir..NET Remoting'de "Giriş önbelleği beklemede Tcp kanal protokol ihlali" nedenleri nelerdir?

Bu uygulama çoğu zaman çok iyi çalışıyor. Sunucu her seferinde aylarca kalır. Zaman zaman bir müşteri üzerinde bir istisna alıyorum ve istisnaya neyin sebep olduğunu anlayamıyorum. istisna ve yığın izleme şunlardır:

Ben uzak arama yapmak yere geri yığın izleme var
System.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble. 

Server stack trace: 
    at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble() 
    at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders() 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream) 
    at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 

.

Yaptığım aramalarda veya sunucunun döndürdüğü verilerde sıradan bir şey göremedim ve bulabildim.

Bu hatayı Google aramaları çok verimli değildir. Gördüğüm hataların çoğu, HTTP'den TCP'ye dönüştüren ve her şeyi değiştirmeyen bir kişinin etrafında dönüyor, böylece bağlantı kurmaya çalışırken istisna oluyorlar. Benim durumumda, istemci gün sürecek bu hatayı alıyorum önce.

Diğer bir veri noktası: sunucu çok sayıda istek alıyor. İstemcilerin çoğu, her dakika sunucuya 2.000'den fazla istek yapan Web tarayıcılarıdır. Bu nedenle sunucu, saniyede 500 istek, daha yüksek trafik patlamaları ile işliyor. Her durumda, sunucu trafiği hallediyor gibi görünüyor ve sunucu aşırı yüklendiğinde çok farklı bir hata bekliyordum.

bu hataya neyin neden herhangi bir fikir?

+0

Kabul edilebilir kayıplar? P – leppie

cevap

2

Bu hata, genellikle bir ileti yanlış başlıklarla alındığında gerçekleşir. Sunucunuza bir telnet bağlantısı oluşturarak bu hatayı tekrarlayabilir ve bir şeyler yazabilirsiniz. Çoğu durumda bir ağ hatasıdır.

ederim güvenlik duvarınızı kontrol etmenizi öneririz. Bazı güvenlik duvarları, yanlış paket uyarısı nedeniyle ağ paketlerini düşürür.

Yük dengeleme başka bir olası nedenidir. Yük dengeleyici paketleri farklı sunuculara böler.

+0

Güvenlik duvarı çok iyi olabilir. Bunun üzerinden çok fazla trafik çekiyorum ve ortalama trafik hacmini kolayca idare edebilmesine rağmen, belki de tamponlarını ya da bir şeyleri aşan patlamalar var. Bu patlamaların en kötüsünü ortadan kaldırmak için trafiği düzelten kodumda bazı değişiklikler üzerinde çalışıyorum. –

+0

Bir marshallbyref nesnesinde herhangi bir özellik varsa, bunları yöntemlere dönüştürmeyi deneyebilirsiniz. Mülkiyete her eriştiğinizde bir mesaj çağrısı yapar. Bunları yöntemlere dönüştürmek, istemci ve sunucu arasındaki iletileri azaltır. Ayrıca istemci önbellekleme için bazı sınıfları serileştirebilirsiniz. – ertan

+0

Uzak nesne üzerinde erişilebilir özellik yoktur. Anahtar gibi görünüyor. Bu anahtar üzerinden inanılmaz sayıda paketi zorluyorum ve anahtarın bununla başa çıkamamasına benziyor. Her halükarda, hatanın bir yazılım hatası değil, bir donanım sorunu olduğuna ikna oldum. Cevap için teşekkürler. –

0

MS DNS sunucusu çok fazla açık bağlantı noktası kullanıldığında bu sorunu görüyorum, böylece giden bağlantı noktası oluşturulamıyor. Evet, çok komik.