рдЬрд┐рдВрджрд╛ рд░рдЦрдиреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рд░реЗрдХ

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЕрдХреНрд╕рд░ рдЖрдзреБрдирд┐рдХ рдЖрдИрдЯреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЕрдзрд┐рдХрддрдо рдХреЛ рдирд┐рдЪреЛрдбрд╝реЗрдВ рдФрд░ рд╣рд░ рдХреАрдордд рдкрд░ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдВ - рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдВрднреАрд░ рдЪреБрдиреМрддреАред рдЗрд╕рд▓рд┐рдП, рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЦреЛрдЬ рдПрдХ рдЧреИрд░-рд░реЛрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрддреНрдпрдзрд┐рдХ рднрд░реА рд╣реБрдИ http рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


рдпрд╣ рдХрд╣рд╛рдиреА рдПрдХ рдЧрд▓рддреА рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рд╣рдордиреЗ рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рддрддреНрд╡ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рдШреБ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдерд╛ред рдиреЗрдЯрдХреЛрд░ 2.2 рдХреЗ рддрд╣рдд рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ , рдЬреЛ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ System.Net.Sockets.SocketException рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ : рдЙрдкрдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ ред рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рдирдпрд╛ рдЦреЛрд▓рдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм, рдпрджрд┐ рд╣рдо рдХреЛрдб рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ HttpWebRequest рд╡рд░реНрдЧ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдереА :


var request = WebRequest.CreateHttp(uri);
using(var resp = request.GetResponse()){ тАж }

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдмрдВрджрд░рдЧрд╛рд╣ рдХреЛ рд╕рдордп рдкрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреЗрдЯрд╕реНрдЯреИрдЯ рдиреЗ TIME_WAIT рд░рд╛рдЬреНрдп рдореЗрдВ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╡реГрджреНрдзрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред рдЗрд╕ рд░рд╛рдЬреНрдп рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ (рдФрд░ рд╕рдВрднрд╡рддрдГ рдЦреЛрдП рд╣реБрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛)ред рдирддреАрдЬрддрди, рдкреЛрд░реНрдЯ 1-2 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрдИ рд▓реЗрдЦ (рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ TIME_WAIT рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ , TIME_WAIT рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрд┐рд╣рд╛рд╕ )ред рдлрд┐рд░ рднреА, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЙрдЯрдиреЗрдЯ "рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ" рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдЧреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЧрд▓рддреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред


рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ


рдореИрдВ рдЬрд┐рдВрджрд╛ рд░рдЦрдиреЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ ред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрдж рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд░реЗрдХ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╣реИ, рдзреНрдпрд╛рди рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдорд╛рд░реНрдЧ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред Msdn рдХреЗ рдЕрдиреБрд╕рд╛рд░ , HttpWebRequest рд╡рд░реНрдЧ рдХреА KeepAlive рд╕рдВрдкрддреНрддрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рддреНрдп рд╣реИ ред рдпрд╣реА рд╣реИ, рдпрд╣ рд╕рдм рд╕рдордп, HttpWebRequest рдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ "рдзреЛрдЦрд╛" рджрд┐рдпрд╛, рдЙрд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдЦреБрдж рдЗрд╕реЗ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде HttpWebRequest рдиреЗ "рдХрдиреЗрдХреНрд╢рди: рд░рдЦрдиреЗ-рдЬреАрд╡рд┐рдд" рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдирд╣реАрдВ рднреЗрдЬрд╛, рдмрд╕ рдпрд╣ рдореЛрдб HTTP / 1.1 рдорд╛рдирдХ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдкрд╣рд▓реА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП KeepAlive рдХреЛ рдЬрдмрд░рджрд╕реНрддреА рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдерд╛ред рдпрджрд┐ рдЖрдк HttpWebRequest.KeepAlive = false рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╣реЗрдбрд░ "рдХрдиреЗрдХреНрд╢рди: рдХрд░реАрдм" рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдмреЗрдВрдЪ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ, nginx рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


while (true)
{
  var request = WebRequest.CreateHttp(uri);
  request.KeepAlive = false;
  var resp = await request.GetResponseAsync();
  using (var sr = new StreamReader(resp.GetResponseStream()))
  {
    var content = sr.ReadToEnd();
  }
}

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рд╕рд░реНрд╡рд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рддреЛ рднрд╛рд░реА рд▓реЛрдб (рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 рд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдз) рдХреЗ рддрд╣рдд, рдпрд╣ рдХреЛрдб рдлрд┐рд░ рд╕реЗ рдЙрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рд▓рдЧрд╛ред рдХреЗрд╡рд▓ рдЕрдм рдкреЛрд░реНрдЯ CLOSE_WAIT, LAST_ACK рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдереЗред рдпреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреВрд░реНрд╡-рдЕрдВрддрд┐рдо рд╕рдорд╛рдкрди рд░рд╛рдЬреНрдп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд░реНрдЬрдХ рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдирдП рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде "рдЪреЛрдХ" рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред


рдмрдВрдж рди рдХрд░реЗрдВ, рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


, , . keep-alive HttpClient. .


, , ? keep-alive nginx:


  • keepalive_timeout тАУ ( 15)
  • keepalive_requests тАУ ( 100)

netstat wireshark, . keepalive_requests (> 1000) , .



http , . . , , keep-alive. keep-alive , .


:


  • RunHttpClient тАУ HttpClient "Connection: keep-alive"
  • RunHttpClientClosed тАУ HttpClient "Connection: closed"
  • RunWebRequestClosed - рд╡рд░реНрдЧ HttpWebRequest рдореЛрдб "рдХрдиреЗрдХреНрд╢рди: рдмрдВрдж" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

Nginx рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


  • Keepalive_timeout 60s;
  • Keepalive_requests 100000;

рддрд░реАрдХрд╛рдПрдирдкреНрд░рдЪрд╛рд░рдореАрди
Runhttpclient10001963.3 рдорд┐
RunWebRequestClosed100013,857.4 рдПрдордПрд╕
RunHttpClientClosed100011,612.4 рдПрдордПрд╕
Runhttpclient10,00019,573.9 рдПрдордПрд╕
RunWebRequestClosed10,000137,947.4 рдПрдордПрд╕
RunHttpClientClosed10,000116,112.9 рдПрдордПрд╕

All Articles