4.5 netServer — dinleyiciler ve sınırlar

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > Netsim System Agent Kurulum ve Yönetim Kılavuzu > 4. Yapılandırma >

4.5 netServer — dinleyiciler ve sınırlar

netServer.listenerList altındaki her girdi bir ip/port çiftine bağlanır. Sanal sunucular bindListeners ile dinleyicinin adına başvurur.

AyarÖndeğerAçıklama
ip / port0.0.0.0 / —Dinlenecek adres ve port. Linux'ta 1024 altı port ayrıcalık ister.
workerModelmultiProcessmultiProcess: her istek ayrı süreçte (yalıtım). multiThread: aynı süreçte iş parçacığı.
useSSL / SSLCertificatefalseTLS ve kullanılacak sertifikanın certificateList içindeki adı.
limits.maxConnections400Aynı anda işlenen bağlantı. Aşılırsa yeni bağlantı 503 ile reddedilir; 0 = sınırsız.
limits.maxConnectionsPerClient200Aynı istemciden (aynı IP) aynı anda işlenen bağlantı. Aşılırsa yeni bağlantı 503 ile reddedilir; 0 = sınırsız.
allowedNetworksyokBu dinleyiciye bağlanabilen istemci ağları (IPv4 CIDR listesi, en fazla 16; örnek ["10.0.0.0/8", "192.168.1.20"]). Verilmezse süzgeç yoktur. Listede olmayan istemcinin bağlantısı kabul anında, hiçbir yanıt yazılmadan kapatılır ve günlüğe yazılır. Geçersiz bir girdi ajanın açılışını durdurur.
limits.keepAliveTimeout600 saniye (10 dk)Sonraki isteği beklerken boşta duran bağlantının ömrü; süre dolunca sunucu bağlantıyı kapatır. 0 = sınırsız.
limits.maxContentSize200000000 baytEn büyük istek gövdesi. Bu dinleyicideki bütün HTTP istekleri için geçerlidir — aşağıya bakın.
limits.maxContentInMemory1000000 baytGövdenin bellekte tutulacağı üst sınır; aşan gövde geçici bir dosyaya alınır. 0 = sınır yok (her gövde bellekte).
limits.maxHeaderLines255İstek başlığında kabul edilen satır sayısı.
limits.requestTimeoutMS30000 (30 sn)Bir isteğin başlık + gövde okumasının tamamı için duvar saati sınırı. Süre dolarsa istek 408 alır ve bağlantı kapanır. 0 = sınırsız. İstekler arasındaki boşluğu bu değil keepAliveTimeout bağlar.
limits.maxHeaderLineSize / maxHeaderTotalSize16384 / 65536 baytTek başlık satırının ve bütün başlıkların toplam boyutu; aşan istek 400 alır. 0 = sınırsız.
limits.sendTimeoutMS / recvTimeoutMS6000Gönderme / alma zaman aşımı; sokete uygulanır. Ad sonundaki MS bilerek — bkz. aşağıdaki birim tablosu.
limits.poolTimeoutMS600000 (10 dk)Havuzdaki bir işçinin yeni görev beklerken ayakta kalma süresi. Havuzlamanın tek düğmesi budur: 0 verilirse işçi süreç havuza hiç alınmaz, her istek yeni bir süreçle karşılanır.

4.5.1 Hangi limits ayarı gerçekten çalışıyor

Bu blok, uygulanan ve okunup yok sayılan ayarları bir arada taşır:

AyarBirimDurum
maxContentSizebaytEtkin (bkz. yukarısı).
maxContentInMemorybaytEtkin — bunu aşan gövde <TEMP>/netsim-body-<pid>-<rastgele>.tmp dosyasına alınır. Dosya açılışta silinmek üzere işaretlenir, yani süreç çökse bile geride kalmaz; kurulamazsa belleğe düşülür ve istek reddedilmez. chunked gövdede boyut önceden bilinmediği için bellekte başlanır ve eşik aşılınca dosyaya taşınır.
maxHeaderLinessatırEtkin.
requestTimeoutMSmsEtkin — istek başına toplam okuma süresi; başlık ve gövde aynı deadline'ı paylaşır (chunked gövde dâhil). recvTimeoutMS'in yerini almaz: o okuma başınadır ve her okumaya zamanında tek bir bayt yetiştiren bir istemcide hiç tetiklenmez. Süre okumalar arasında denetlendiği için sürede küçük bir aşma olabilir — en çok bir okuma, yani recvTimeoutMS kadar. Giden isteklerde (istemci tarafı) deadline yoktur, yoksa büyük bir indirme yarıda kesilirdi.
maxHeaderLineSize / maxHeaderTotalSizebaytEtkin — satır okunduğu anda denetlenir, yani sınırı aşan başlık biriktirilmeden reddedilir. İstek ve yanıt okumasında birden geçerlidir.
sendTimeoutMS / recvTimeoutMSmsEtkin — kabul edilen soketin gönderme/alma zaman aşımına yazılır. Birim ILTcpSocket::isReady'de tv_sec = değer / 1000 ile doğrulandı.
poolTimeoutMSmsEtkin — işçi süreç havuzda bu süre kadar yeni görev bekler; değer doğrudan ILTimeout(ms)'e geçer, öndeğer 10 × 60000.
keepAliveTimeoutsaniyeEtkin — öndeğer 600 (10 dk). Keep-alive iki işçi modelinde iki ayrı yerde yürüdüğü için sınır da iki yerde uygulanır — bkz. bir alttaki başlık.
maxConnectionsadetEtkin — accept sonrası, işçiye dağıtmadan önce denetlenir. Canlı sayı multiProcess'te havuzda beklemeyen “TCP Net Worker” süreçlerinden okunur, multiThread'te dinleyicinin kendi sayacından. Aşılırsa HTTP dinleyicisinde 503 + Retry-After: 5 yazılıp bağlantı kapatılır (HTTP dışı dinleyicide sadece kapatılır). Dinlemek durmaz, yer açılınca yeniden kabul edilir.
maxConnectionsPerClientadetEtkin — IP kabul anında ham soket tutamacından okunur (getpeername), sayım multiProcess'te paylaşılan süreç listesindeki istemci IP alanından, multiThread'te dinleyicinin kendi defterinden yapılır. Adres öğrenilemezse sınır uygulanmaz — bilinmeyen bir şey yüzünden bağlantı reddedilmez.
Dikkat

Bu bloğun zaman aşımlarında birim ada yazılıdır: MS ile bitenler milisaniye, bitmeyenler saniyedir.

4.5.2 keep-alive ve WebSocket: bağlantı ne zaman açık kalır

Bir yanıt gönderildikten sonra bağlantının sürdürülmesine tek bir yerde karar verilir (yanıtın “bağlantıyı kapat” işareti yoksa sürdürülür), ama sonrası işçi modeline göre tamamen farklı çalışır:

workerModelSonraki isteği ne bekler
multiProcess
(öndeğer)
Bağlantıyı işleyen alt sürecin kendi döngüsü: aynı soket aynı süreçte tutulur ve sonraki istek orada karşılanır. Dinleyicinin bekleyenler listesi bu modelde hiç devreye girmez.
multiThread Dinleyicinin bekleyenler listesi: bağlantı park eder, kabul döngüsü her turda listeyi yoklar ve veri geldiğinde yeni bir işçi kurar.

4.5.3 Yavaş istemci (slowloris) sınırları

Üç ayar birlikte, bir isteğin işçi yuvasını süresiz tutmasını engeller. İzole bir örnekte (requestTimeoutMS 4000, maxHeaderLineSize 512, maxHeaderTotalSize 2048) davranış şöyledir:

SenaryoSınır açıkSınır kapalı (requestTimeoutMS: 0)
Başlıklar bitirilmeden saniyede bir satır damlatılıyor408, 5,7 snYanıt gelmez — bağlantı istemci bırakana kadar (ör. 45 sn) açık kalır
Bildirilen Content-Length'in yalnızca bir kısmı gönderiliyor408, 4,0 sn400, 6,0 sn (okuma başına recvTimeoutMS)
Tek başlık satırı 900 bayt400—
Toplam başlık ~3,7 KB400—
Sıradan istek200200

İkinci satır ayrımı iyi gösteriyor: tamamen susan bir istemciyi okuma başına recvTimeoutMS zaten keser; onun kesemediği, her okumaya zamanında bir bayt yetiştiren istemcidir — birinci satır. Bu yüzden sınırı toplam süre koyar.

keepAliveTimeout her iki yolda da uygulanır. Örneğin 3 saniyeye ayarlı bir sunucu, yanıtı tamamen okuyup sessiz kalan bir istemcinin bağlantısını ~3 saniye sonra düzgün biçimde (FIN) kapatır ve günlüğe keep-alive zaman asimi (3 sn) satırını yazar.

Not

WebSocket bunun dışındadır. Yükseltmeden sonra bağlantı kendi çerçeve döngüsüne girer ve keep-alive park yoluna hiç uğramaz; dolayısıyla keepAliveTimeout bir WebSocket bağlantısına hiçbir modelde dokunmaz (maxContentSize de çerçeveleri kapsamaz — bir alttaki başlık). Bir WebSocket bağlantısının ömrünü istemcinin kapatması, oturumun kapanması ve oturum yöneticisinin idleTimeout/lifeTime ayarları (saniye) belirler. Bir isteği işlenmekte olan oturum (uzun bir UPGRADE LEVEL gibi) bu sürelerle kapatılmaz; boşta kalma süresi istek bitince yeniden başlar.

4.5.4 maxContentSize neyi kapsar

Bu sınır uygulamaya değil dinleyiciye aittir. Gövde, isteği hangi uygulamanın karşılayacağı belirlenip ona dağıtılmadan önce okunur, dolayısıyla aynı dinleyicideki StaticFile, CRUD, MessageQueue, ClientREST, AdminREST, WebDAV ve IoTGateway isteklerinin hepsi aynı sınıra tabidir — WebDAV'a özgü bir ayar değildir. WebSocket çerçeveleri bu sınırın dışındadır; IVEDI işlemcisinin çerçevelerini uygulamanın kendi maxFrameSize alanı sınırlar. Farklı bir sınır isteyen bir yüzeyi ayrı bir dinleyiciye almak gerekir; her listenerList girdisinin kendi limits bloğu vardır. Uygulama başına sınır diye bir ayar yoktur.

KapsamDurum
Gelen HTTP istek gövdesi (Content-Length'li ve chunked) Kapsamda. Aşan istek chunked olmayan yolda 414, chunked yolda gövde büyüdükçe reddedilir.
WebSocket çerçeveleri (yükseltmeden sonra) Kapsam dışı. Çerçeveler ayrı bir yoldan okunur ve orada bir üst sınır uygulanmaz.
Ajanın kendi yaptığı giden HTTP çağrıları Kapsam dışı. İstemci tarafı yanıt gövdesini sınırsız okur.
Dikkat

Tampon istemcinin bildirdiği Content-Length değerine göre önceden ayrılır — yani tek bir istek, tek bayt gövde göndermeden bu kadar yer ayırtabilir. Bunun bellekteki payı maxContentInMemory ile sınırlıdır: eşiği aşan gövde geçici bir dosyaya alınır. Dolayısıyla en kötü durum belleği maxConnections × maxContentInMemory (öndeğerlerle 400 × 1 MB = 400 MB), kalanı ise disktir — maxConnections × maxContentSize kadar geçici dosya yeri gerekebileceğini hesaba katın (öndeğerlerle 80 GB). İnternet'e açık bir kurulumda eşzamanlılığı ayrıca ağ düzeyinde de (güvenlik duvarı, ters vekil) sınırlayın.