我们的Web应用程序已经无缘无故地崩溃了,而且我现在还不知道它可能是什么。
我们正在为主Web应用程序运行SOAP服务的基本身份验证和ADFS。 崩溃可以在白天的任何时间发生。它是一个测试环境,流量相当低。 当检测到崩溃时,我已经提取了下面的一些日志。
<Event>
<System>
<Provider Name="ASP.NET 4.0.30319.0"/>
<EventID>1309</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>Keywords</Keywords>
<TimeCreated SystemTime="2015-06-12T11:23:21Z"/>
<EventRecordID>274964734</EventRecordID>
<Channel>Application</Channel>
<Computer>RD0003FF410F64</Computer>
<Security/>
</System>
<EventData>
<Data>3001</Data>
<Data>The request has been aborted.</Data>
<Data>6/12/2015 11:23:21 AM</Data>
<Data>6/12/2015 11:23:21 AM</Data>
<Data>b1c5d35e8a26444ba38a8c6a0af0236f</Data>
<Data>1305</Data>
<Data>4</Data>
<Data>0</Data>
<Data>/LM/W3SVC/698610343/ROOT-1-130784515189471125</Data>
<Data>Full</Data>
<Data>/</Data>
<Data>D:\home\site\wwwroot\</Data>
<Data>RD0003FF410F64</Data>
<Data></Data>
<Data>6384</Data>
<Data>w3wp.exe</Data>
<Data>IIS APPPOOL\xxxx-test</Data>
<Data>HttpException</Data>
<Data>
Request timed out.
</Data>
<Data>https://xxx.yy:443/</Data>
<Data>/</Data>
<Data>111.11.11.11</Data>
<Data></Data>
<Data>False</Data>
<Data></Data>
<Data>IIS APPPOOL\xxxx</Data>
<Data>963</Data>
<Data>IIS APPPOOL\xxxx</Data>
<Data>False</Data>
<Data>
</Data>
</EventData>
</Event>
</Events>
<EventData>
<Data>3005</Data>
<Data>An unhandled exception has occurred.</Data>
<Data>6/18/2015 5:43:35 AM</Data>
<Data>6/18/2015 5:43:35 AM</Data>
<Data>ff2588624f0f47bc86f14cb636d4ca12</Data>
<Data>1759</Data>
<Data>3</Data>
<Data>0</Data>
<Data>/LM/W3SVC/1001219836/ROOT-1-130789123624036190</Data>
<Data>Full</Data>
<Data>/</Data>
<Data>D:\home\site\wwwroot\</Data>
<Data>RD0003FF410F64</Data>
<Data></Data>
<Data>6988</Data>
<Data>w3wp.exe</Data>
<Data>IIS APPPOOL\xxx__70d6</Data>
<Data>WebException</Data>
<Data>
Unable to connect to the remote server
at System.Net.HttpWebRequest.GetResponse()
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
An attempt was made to access a socket in a way forbidden by its access permissions 111.11.11.111:443
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
</Data>
<Data>https://111.111.11.11:443/</Data>
<Data>/</Data>
<Data>111.111.11.11</Data>
<Data></Data>
<Data>False</Data>
<Data></Data>
<Data>IIS APPPOOL\xxx__70d6</Data>
<Data>1116</Data>
<Data>IIS APPPOOL\xxx__70d6</Data>
<Data>False</Data>
<Data>
at System.Net.HttpWebRequest.GetResponse()
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
</Data>
</EventData>
</Event>
答案 0 :(得分:8)
Azure webapps对在给定时间点可以同时进行的最大TCP连接数有限制,并且您正在获取的错误“试图以禁止的方式访问套接字......”通常会发生当达到此限制时。大型实例中此限制较高而小实例较少(我认为小型实际为4000但我可能错了)....如果您没有正确关闭TCP连接到外部服务或打开数千个连接,您可能会遇到这种情况几分钟的间隔。大多数情况下,问题不在于正确关闭连接。如果您在同一个应用程序托管计划中托管了许多站点,但是如果您在一个托管计划中只有几个站点,那么隔离哪个站点正在打开连接可能会变得有点挑战,那么您可以使用DAAS收集转储(诊断即服务)当问题发生时你必须在本地下载转储并在WinDBG等工具中打开它们,看看有多少个System.Net.Sockets.Socket对象。如果可以,您可能希望通过在不同的应用程序托管计划中拆分站点来隔离负责打开过多连接的站点,或者只是将它们扩展为更大的实例以允许Moore TCP连接....
对此进行故障排除有点棘手,因此您可以与Microsoft支持人员进行协商,但希望这可以为您提供一个起点......如果您需要进一步的帮助,请发送电子邮件给我puneetg [at] Microsoft.com,我们可以尝试一些事情和帖子,我们可以在这里与社区分享我们的发现。我试图了解如何在将来更轻松地对此方案进行故障排除
编辑 - 2017年12月4日
截至目前,您可以通过转至“诊断并解决”刀片并单击“TCP连接”来监控WebApp的TCP连接。 @ https://twitter.com/puneetguptams/status/936669451931459584
提供快速屏幕截图答案 1 :(得分:1)
我尝试使用崩溃转储并通过WinDBG运行各种结果。很难从WinDBG中获取任何真实信息,因为我很难正确加载所有符号。所以我构建了一个Windows控制台应用程序,并将我的应用程序和我的控制台应用程序部署到同一个Azure云服务,并收集了有关打开的TCP端口的信息。结果很清楚,因为我看到我的Redis-Cache从来没有(或很少)关闭它的tcp-ports而且我很快就讨厌超过3000个连接并且服务器崩溃了。我重构了我的代码以使用表存储,现在它似乎工作。我为任何有兴趣测试他们自己的应用程序泄漏tcp-ports的人附加我的小控制台应用程序。
using System;
using System.Collections.Generic;
using System.Linq;
namespace tcp_ports
{
using System.Net.NetworkInformation;
using System.Threading;
class Program
{
static void Main(string[] args)
{
do
{
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
Dictionary<String, int> ips = new Dictionary<string, int>();
Dictionary<String, String> ipsLocal = new Dictionary<String, String>();
Console.Clear();
Console.WriteLine("Number of open TCP Connections = {0}", connections.Count());
Console.WriteLine("=========================================");
foreach (TcpConnectionInformation c in connections)
{
String ip = c.RemoteEndPoint.Address.ToString();
if (ips.ContainsKey(ip))
{
ips[ip]++;
ipsLocal[ip] = c.LocalEndPoint.Address.ToString();
}
else
{
ips.Add(ip, 1);
ipsLocal.Add(ip, c.LocalEndPoint.Address.ToString());
}
}
var sortedIPs = from entry in ips orderby entry.Value descending select entry;
int no = 20;
foreach (var ip in sortedIPs)
{
Console.WriteLine("{0} <==> {1} = {2}", ip.Key, ipsLocal[ip.Key], ip.Value);
if (--no < 0) break;
}
Thread.Sleep(1000);
} while (true);
}
}
}