小编Dhw*_*hah的帖子

如何在IIS 7.5上预热ASP.NET MVC应用程序?

我们想热身IIS 7.5服务器上托管的ASP.NET MVC应用程序.以前在http://forums.iis.net/t/1176740.aspx上提供的预热模块已被删除.

每当IIS或ASP.NET工作进程因任何原因重新启动时,应该预热应用程序.在预热期间,IIS应返回一些HTTP状态代码,表示其预热状态或无法为任何客户端提供服务.

创建一个可执行文件,通过HttpRequests浏览网站中的必要页面是一个好主意吗?可执行文件可以从IProcessHostPreloadClient实现中触发.是否可以配置IIS以便它只接受来自localhost的请求,一旦可执行文件完成,它就可以切换到所有客户端 - 但是该交换机不应该触发IIS重启(显然).

是否可以使用Visual Studio 2010 - Web性能测试来预热应用程序而不是创建手动可执行文件?还有其他选择吗?

PS:应用程序使用表单身份验证并使用会话 - 因此维护状态cookie和其他cookie非常重要.

更新1 - 我们在我们的应用程序中使用.NET Framework 4.0和Entity Framework(数据库优先).首次点击EF查询的速度很慢.热身背后的原因是让这些第一次击中.我们已经在大多数地方使用了编译查询,并且已经为EF实现了预编译视图.模型和应用程序的大小非常大且复杂.预热需要遍历许多页面,以确保在任何最终用户访问应用程序之前至少执行一次编译和非编译的EF查询.

asp.net iis entity-framework warm-up asp.net-mvc-3

17
推荐指数
3
解决办法
2万
查看次数

EF 4.0中看似无限的堆栈跟踪和负载下的查询性能差

在大型EF 4.0模型(700多个实体)上,我们的性能表现不佳System.Data.Objects.ObjectContext.CreateObjectSet(string).对此的调用由类似的查询触发context.Users.FirstOrDefault(u => u.userId = 100).

查询一般表现良好,但在加载时查询效果不佳.我们针对使用此查询的页面运行20个并发用户负载.此页面的应用程序处于分析模式,即我们在运行此小负载测试时使用Visual Studio 2010性能分析器.分析器使用"采样"模式.

该应用程序使用ASP.NET 4.0/ASP.NET MVC 3.0构建,并在运行负载测试时托管在Windows 7服务器上的IIS 7.5上.

分析报告显示一个似乎"无限"的调用堆栈,即一遍又一遍地对下面的行进行了大量调用.

System.Data.Mapping.DefaultObjectMappingItemCollection.LoadObjectMapping
    System.Data.Mapping.DefaultObjectMappingItemCollection.LoadAssociationTypeMapping
        System.Data.Mapping.DefaultObjectMappingItemCollection.LoadObjectMapping
            System.Data.Mapping.DefaultObjectMappingItemCollection.LoadAssociationTypeMapping
Run Code Online (Sandbox Code Playgroud)

可能导致性能不佳以及无限外观调用堆栈的原因是什么?

c# asp.net linq-to-entities entity-framework-4

14
推荐指数
1
解决办法
509
查看次数

什么在ASP.NET应用程序中消耗超过65%的时间?

我有一个托管在Windows 7/IIS 7.5上的.Net Framework 4.0,ASP.NET,ASP.NET MVC 3 Web应用程序.在此计算机上启用IIS日志记录并设置为以W3C模式登录.

应用程序使用Release配置进行编译,并已使用<compilation debug='false'显式属性设置部署到IIS .Web.config指定使用基于SQL Server的会话状态.

我分别在BeginRequest和EndRequest事件中的Global.asax中添加了以下语句.结果即"sw.Elapsed.TotalMilliseconds"将存储在应用程序级别的值列表中.我通过调试页面转储这些值并获得相同的平均值.

// in BeginRequest
HttpContext.Current.Items.Add("RequestStartEnd", System.Diagnostics.Stopwatch.StartNew());

// in EndRequest
var sw = (System.Diagnostics.Stopwatch)HttpContext.Current.Items["RequestStartEnd"];
sw.Stop();
Run Code Online (Sandbox Code Playgroud)

我创建了一个负载测试,它针对此应用程序运行单个请求,并发用20个用户的用户负载.该测试在Visual Studio 2010 Ultimate Edition中运行.

在运行负载测试之后,我得到了秒表记录的平均时间为681毫秒.这些请求的每个IIS的平均时间(我在运行负载测试之前清除了所有日志)是2121毫秒.IIS的平均时间与Visual Studio负载测试报告中显示的值相符.

秒表时间仅占IIS日志/ Visual Studio报告的时间的32%.其他68%的时间去哪儿了?

更新1: 我将会话状态设置为InProc并重新运行负载测试.在这种情况下,秒表报告的平均时间与IIS日志报告的平均时间之间的差异增长到70%以上!那段时间一直在哪里?

更新2: @Peter - 我通过设置跟踪规则来登录状态代码200来尝试失败的请求跟踪.接下来,我使用20个并发用户运行负载测试大约1.5分钟.经过最后50个跟踪文件,发现该报告中的"Time Taken"字段的范围为750ms到1300ms.Visual Studio报告显示平均值.时间为2300ms.在报告中,使用紧凑视图,我看到所需的时间在以下转换之间发生变化(1)AspNetStart - > AspNetAppDomainEnter(2)ManagedPipelineHandler-启动ManagedPipelineHandler-end.(2)项可能是我的应用程序代码.根据失败的请求日志(即1300毫秒)与平均值之间的最大时间间隔仍然存在很大差异.时间如Visual Studio 2300ms所示.如何找到会计?谢谢你这个伟大的提示!

asp.net asp.net-mvc performance visual-studio-2010 iis-7.5

9
推荐指数
1
解决办法
2236
查看次数

在WinDbg中使用.ForEach时出错

为什么我Invalid parameter poi(adr+4)在调试转储文件时在WinDbg中运行以下命令?

.foreach ( adr { !dumpheap -mt 66df13d4 -short } ) { !do poi(adr+4); }
Run Code Online (Sandbox Code Playgroud)

以下显示adr正在填充的值很好.

.foreach ( adr { !dumpheap -mt 66df13d4 -short } ) { .echo adr; }
Run Code Online (Sandbox Code Playgroud)

我想获取存储在System.Web.Caching.CacheEntry对象的第4个偏移处的.NET字符串变量的内容.

windbg

5
推荐指数
1
解决办法
1374
查看次数

在接口签名相同的接口之间进行转换

当两个接口的签名相同时,是否可以从一个接口转换为另一个接口?以下来源给出Unable to cast object of type 'ConsoleApplication1.First' to type 'ConsoleApplication1.ISecond'.例外情况.

class Program
{
    static void Main(string[] args)
    {
        IFirst x = new First();
        ISecond y = (ISecond)x;
        y.DoSomething();
    }
}

public interface IFirst
{
    string DoSomething();
}

public class First : IFirst
{
    public string DoSomething()
    {
        return "done";
    }
}

public interface ISecond
{
    string DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

.net c# casting

4
推荐指数
2
解决办法
1573
查看次数