TsgcWSServer_HTTPAPI, TsgcServerHTTPAPI_FineTune türünde FineTune adlı yayımlanmış bir özellik sunar. Windows HTTP Server API'sinin (http.sys) istekleri nasıl kuyruğa aldığını, dağıttığını ve tamamladığını etkileyen düşük seviyeli kernel-mode ayarlarını gruplar.
HttpServerQueueLengthProperty çekirdek ayarını sarmalar. Sunucu bunları kuyruktan çıkarmadan önce http.sys'nin çekirdek modu kuyruğunda tutacağı maksimum bekleyen istek sayısını kontrol eder. Kuyruk dolduğunda, çekirdek yeni bağlantılara, kullanıcı moduna ulaşmadan doğrudan 503 Service Unavailable ile yanıt verir.
Type: ULONG.
Varsayılan: 1000 (Windows çekirdeği varsayılanı).
Range: 65535 isteğe kadar.
Neyi iyileştirir: bu değeri artırmak, çekirdeğin ani iş yüklerinde meşru trafiği reddetmesini önler - bir ağ kesintisinden sonra yeniden bağlanan IoT filoları, bir sağlayıcı sıfırlamasından sonra yeniden bağlanan piyasa verisi yayın istemcileri veya hepsi paylaşılan bir cron tıklamasında bağlanan zamanlanmış iş çalışanları.
True olarak ayarlandığında, sunucu istek kuyruğu tanıtıcısında FILE_SKIP_COMPLETION_PORT_ON_SUCCESS ve FILE_SKIP_SET_EVENT_ON_HANDLE bayraklarıyla SetFileCompletionNotificationModes çağırır. İstek kuyruğunda eşzamanlı olarak tamamlanan örtüşen G/Ç işlemleri artık G/Ç tamamlama portuna ekstra bir tamamlama paketi göndermez.
Type: Boolean.
Varsayılan: False (hiçbir bayrak ayarlanmaz, geçerli davranış korunur).
Neyi iyileştirir: çağrı eşzamanlı olarak NO_ERROR döndürdüğünde sıcak istek yolundaki bir çekirdekten kullanıcı moduna atlamayı ortadan kaldırır - çalışan, bir IOCP paketi beklemek yerine tamamlamayı çağıran iş parçacığında satır içi olarak gönderir. Bu, Microsoft'un referans HTTP Server High Performance örneği tarafından kullanılan modeldir. Bayrak, OperatingMode = ompHighPerf ile eşleştirilmek üzere tasarlanmıştır.
API, çalışma zamanında kernel32'den GetProcAddress aracılığıyla çözülür. Windows XP ve öncesinde (Delphi 7 çalışma zamanı hedefi) giriş noktası mevcut değildir - sarmalayıcı False döndürür ve sunucu bayrak ayarlanmadan çalışır.
İki kabul/gönderme mimarisinden birini seçer.
Type: TsgcHTTPAPIOperatingMode = (ompClassic, ompHighPerf).
Varsayılan: ompClassic.
HttpReceiveHttpRequest öğesini eşzamanlı olarak çağırır ve her isteği PostQueuedCompletionStatus aracılığıyla IOCP çalışan havuzuna elle dağıtır. Bu, geçmiş davranıştır.ThreadPoolSize x HighPerfAcceptsPerWorker async alımı önceden gönderir (varsayılan olarak 32 x 4 = 128 eşzamanlı bekleyen alım). Her worker, tamamlamasını satır içinde işler ve başka bir async alımı yeniden gönderir, böylece kapatmaya kadar kayan bir pencere korunur.
Neyi iyileştirir: ompHighPerf, sunucu derin tek akış pipeline'ları (büyük çerçeveli yüklemeler/indirmeler) veya çok sayıda eşzamanlı istemci (yüzlerce ila binlerce) gördüğünde işe yarar. Önceden gönderilen alma penceresi, bağlantı başına ayırma olmadan ani artışları emer ve satır içi dağıtım, alıcı devir teslim darboğazını ortadan kaldırır. Düşük trafikli API'ler ve geliştirme ortamları için varsayılan ompClassic değerini bırakın. Hafif iş yüklerinde 128 önceden gönderilmiş bağlamı sürdürmenin yükü, sağladığından daha fazlasına mal olur. Mod yalnızca sunucu etkinleştirilmeden önce değiştirilebilir.
OperatingMode = ompHighPerf olduğunda her IOCP worker'ının kaç async alımı önceden gönderdiğini kontrol eder. Değer, ompClassic modunda yok sayılır. Sunucunun sürdürdüğü toplam eşzamanlı bekleyen alım sayısı ThreadPoolSize x HighPerfAcceptsPerWorker'a eşittir.
Type: Integer.
Varsayılan: 4.
Neyi iyileştirir: daha derin bir çalışan başına pencere, sunucunun sıcak yolda yeni bağlamlar ayırmadan gelen isteklerin daha büyük dalgalanmalarını massetmesini sağlar. Yüksek eşzamanlılık dağıtımları (IoT filoları, piyasa verisi dağıtımı, fan-out brokerlar) için bu değeri yükseltin; ödün bellektir, önceden gönderilen her alma, tamamlanana kadar ayrılmış bir istek arabelleği (~16 KB) tutar. Varsayılan değer olan 4, MSDN HP örneğine karşı doğrulanmış, ihtiyatlı bir orta noktadır.
Aşağıdaki snippet, yüksek eşzamanlı bir IoT arka ucu için bir HTTP.sys sunucusunu yapılandırır: yeniden bağlanma fırtınalarını emmek için büyük bir çekirdek kuyruğu, genişletilmiş bir önceden gönderilmiş alma penceresiyle HighPerf dağıtımı ve inline-completion dağıtımı etkin.
uses
sgcWebSocket_Server_HTTPAPI,
sgcWebSocket_HTTPAPI_Server; // TsgcHTTPAPIOperatingMode
var
oServer: TsgcWSServer_HTTPAPI;
begin
oServer := TsgcWSServer_HTTPAPI.Create(nil);
oServer.Host := '0.0.0.0';
oServer.Port := 8080;
// absorb 10,000-device reconnect bursts before kernel-level 503
oServer.FineTune.QueueLength := 10000;
// switch from single-acceptor to pre-posted IOCP workers
oServer.FineTune.OperatingMode := ompHighPerf;
// widen the per-worker pre-posted receive window (32 threads * 8 = 256)
oServer.FineTune.HighPerfAcceptsPerWorker := 8;
// dispatch inline on sync-success completions; skip the IOCP round-trip
oServer.FineTune.SkipIOCPOnSuccess := True;
oServer.Active := True;
end;
Tipik bir dahili veya düşük trafikli API için, her FineTune özelliğini varsayılanında bırakın:
oServer := TsgcWSServer_HTTPAPI.Create(nil);
oServer.Host := 'localhost';
oServer.Port := 8080;
// FineTune defaults: QueueLength=1000, SkipIOCPOnSuccess=False,
// OperatingMode=ompClassic, HighPerfAcceptsPerWorker=4
oServer.Active := True;