小编Nar*_*man的帖子

SQL Azure查询性能 - 即使使用调优查询也非常慢

这是一个依赖于两个非聚集索引的基本查询:

SELECT cc.categoryid, count(*) from company c
INNER JOIN companycategory cc on cc.companyid = c.id
WHERE c.placeid like 'ca_%'
GROUP BY cc.categoryid order by count(*) desc
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2008上托管完全相同的数据库时,几乎在任何硬件上都会返回<500 ms.即使清除了缓存缓冲区:

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)

...在传统的SQL上,这仍然会在~1秒内返回.

在Azure上,每次返回大约需要3.5秒.

有些文章似乎表明人们通常对SQL Azure中的查询性能感到满意.然而,这是一个基本的场景,其中"明显的"调优已经用尽,并且没有网络延迟问题可言.使用大表时工作速度非常慢(companycategroy有1.2M记录,地方有7.5K).

总数据库大小不超过4GB.选择"网络"版和"企业版"似乎也没有太大的区别.

我错过了什么?

这只是一个基本的例子,只有更复杂的查询才会变得更糟,所有这些都经过了审核,调整和内部执行.

这是执行计划:

  |--Sort(ORDER BY:([Expr1004] DESC))
       |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1007],0)))
            |--Hash Match(Aggregate, HASH:([cc].[CategoryId]), RESIDUAL:([XX].[dbo].[CompanyCategory].[CategoryId] as [cc].[CategoryId] = [XX].[dbo].[CompanyCategory].[CategoryId] as [cc].[CategoryId]) DEFINE:([Expr1007]=COUNT(*)))
                 |--Hash Match(Inner Join, HASH:([c].[Id])=([cc].[CompanyId]))
                      |--Index Scan(OBJECT:([XX].[dbo].[Company].[IX_Company_PlaceId] AS [c]),  WHERE:([XX].[dbo].[Company].[PlaceId] as [c].[PlaceId] like N'ca_%'))
                      |--Index …
Run Code Online (Sandbox Code Playgroud)

sql-server azure azure-sql-database

11
推荐指数
1
解决办法
6426
查看次数

Azure Autoscale重新启动运行实例

我一直在使用Autoscale在2到1个云服务实例之间转换,以降低成本.这主要是有效的,除了不时(不确定这里的模式是什么),扩展(1-> 2)的行为导致两个实例都回收,为用户生成服务中断.

假设RoleEntry在响应拓扑更改时没有花哨的东西,为什么从1-> 2扩展会重新启动已经运行的实例?

补充说明:

  • 很明显,通过查看Management Portal中的Instances选项卡,这两个实例都在回收.也可以通过访问公共站点来确认中断.
  • 它不会一直发生,但我不确定模式是什么.感觉就像单实例配置已运行多天,尝试扩大回收两者.但是,如果单实例配置仅运行了几个小时,则可以在不中断的情况下进行扩展和缩小.
  • 第一个实例总是比引入的第二个实例快得多.

azure azure-role-environment

10
推荐指数
1
解决办法
1679
查看次数

如何保护应用程序池免受会话序列化异常的影响?

我们正在为ASP.NET应用程序使用进程外会话提供程序(ScaleOut),我们注意到一个没有正确设置反序列化的对象无意中进入会话时,它最终会导致整个终止的过程.

重现和处理这种情况是它变得更有趣的地方.

AnyStaObjectsInSessionState中引发了终止进程的异常,其实现非常简单:

internal static bool AnyStaObjectsInSessionState(HttpSessionState session)
{
    if (session != null)
    {
        int count = session.Count;
        for (int i = 0; i < count; i++)
        {
            object obj2 = session[i];
            if (((obj2 != null) && (obj2.GetType().FullName == "System.__ComObject"))
                && (UnsafeNativeMethods.AspCompatIsApartmentComponent(obj2) != 0))
            {
                return true;
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪,显示了异常如何终止进程:

An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/1/ROOT

Process ID: 4208

Exception: System.Runtime.Serialization.SerializationException

Message: …
Run Code Online (Sandbox Code Playgroud)

asp.net session serialization restart httpmodule

7
推荐指数
1
解决办法
1944
查看次数

ETags,IIS7,内核缓存策略(enableKernelCache)

两部分问题(部分密切相关):使用IIS7采用的默认OOTB ETag策略,为什么我们在浏览页面时看不到If-None-Match/304交互?

例如,为空缓存请求返回的标头是:

Content-Type    image/png
Last-Modified   Thu, 03 Dec 2009 15:51:56 GMT
Accept-Ranges   bytes
Etag    "a8a0628a3074ca1:0"
Server  Microsoft-IIS/7.0
X-Powered-By    ASP.NET
Date    Tue, 22 Dec 2009 19:47:36 GMT
Content-Length  1780
Run Code Online (Sandbox Code Playgroud)

...然后对页面的后续访问不会为图像生成304往返?

此外,IIS7 的默认applicationHost文件具有以下(1):

   <caching enabled="true" enableKernelCache="true">
   </caching>
Run Code Online (Sandbox Code Playgroud)

enableKernelCache ='true'是否扩展到所有静态文件,使您无需显式注册扩展以将CacheUntilChange授予内核策略(2):

<caching>
  <profiles>
    <add extension=".gif" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".png" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".js" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".css" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".jpg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" /> …
Run Code Online (Sandbox Code Playgroud)

asp.net etag iis-7 caching

6
推荐指数
1
解决办法
4262
查看次数

在Azure Compute Emulator之外运行DiagnosticMonitorTraceListener

我们使用DiagnosticMonitorTraceListener作为通用跟踪侦听器(主要用于ASP.NET运行状况监视)以及用于异常处理的Enterprise Library 5侦听器.这在Azure上运行时效果很好,但重要的是我们能够以最小的更改在Azure之外运行网站.

一种选择是动态注册,如下所示:

protected void Application_Start()
{
    if (Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable)
    {
        System.Diagnostics.Trace.Listeners.Add(new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());
        System.Diagnostics.Trace.AutoFlush = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于ASP.NET Health Monitoring和System.Diagnosics的一般用途,但不适用于我们具有以下硬编码配置的Enterprise Library:

  <categorySources>
    <add switchValue="All" name="General">
      <listeners>
        <add name="Event Log Listener" />
        <add name="Azure Diagnostics Trace Listener" />
      </listeners>
    </add>
  </categorySources>
Run Code Online (Sandbox Code Playgroud)

如果没有解决,调用ExceptionPolicy.HandleException将生成:

未在托管服务或Development Fabric中运行.

要根据应用程序的运行位置有条件地删除它,我们可以使用EL5的流畅配置API,但必须重写我们的配置(它是全部或全部).

我们也可以使用web.config转换,除了已经有3种不同的解决方案配置(例如,dev,staging,production)之外,我们必须引入第4个来区分dev-standalone和dev-azure.

最后一个选择是创建一个自定义侦听器,它将所有消息路由到****(如果在Azure上运行)或什么都不做.

还有其他建议吗?

仅供参考,ASP.NET运行状况监视配置如下:

<healthMonitoring enabled="true">
  <providers>
    <add name="TraceWebProvider" type="System.Web.Management.TraceWebEventProvider" />
  </providers>
  <rules>
    <add name="Application Events"
         eventName="Application Lifetime Events"
         provider="TraceWebProvider"
         profile="Default"
         minInstances="1"
         maxLimit="Infinite"
         minInterval="00:01:00" />
  </rules>
</healthMonitoring>
Run Code Online (Sandbox Code Playgroud)

asp.net enterprise-library azure azure-diagnostics

6
推荐指数
1
解决办法
1613
查看次数

使用Mdbg的ASP.NET基于Web的堆栈转储工具?

MySpace.com的首席系统架构师Dan Farino 发表了精彩的演示,展示了一个基于Web的堆栈转储工具,该工具对在给定流程中运行的所有线程进行编目(他们正在做什么,他们执行了多长时间等等) .)

他们的技术也在highscalability.com上进行了总结:

  • PerfCollector.
    通过UDP集中收集性能数据.比Windows更可靠,允许任何客户端连接和查看统计信息.
  • 基于Web的堆栈转储工具.
    可以右键单击问题服务器并获取.Net托管线程的堆栈转储.用于将RDC导入系统并附加调试器,以后1/2获得答案.缓慢,不稳定,乏味.不仅仅是堆栈转储,还提供了很多关于线程正在做什么的上下文.故障排除更容易,因为您可以看到数据库上有90个线程被阻止,因此数据库可能已关闭.
  • Web Base堆转储工具.
    转储所有内存分配.对开发人员非常有用.节省数小时的手工操作.•Profiler.从头到尾跟踪请求并生成报告.请参阅URL,方法,状态以及有助于您识别慢速请求的所有内容.看看锁争用,抛出很多异常,任何可能有趣的事情.重量很轻.它在生产中的每个VIP(100个服务器组)中的一个盒子上运行.样品每10秒一次.始终在后台跟踪.

问题是:为ASP.NET构建基于Web的堆栈转储工具需要哪些工具?为方便起见,我们假设在目标AppDomain中托管的*.aspx能够输出该进程中的所有托管调用堆栈就足够了.

有一些帖子涵盖了Mdbg的使用(完全用C#/ IL编写的托管代码的调试器,开始随CLR 2 SDK一起提供)和mdbgcore程序集通常位于C:\ Program Files\Microsoft Visual Studio 8\SDK\2.0 \斌:

解决方案是否会简单地引用此组件以产生所需的输出?"列出所有托管调用堆栈"操作对正在为生产流量提供服务的运行进程有什么影响?

asp.net debugging multithreading callstack mdbg

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

如何在 .NET 中将外部类型/方法标记为已弃用/过时?

我们试图ConfigurationManager在构建时标记外部类型(如 )的使用。

自定义代码分析字典可以提供帮助 [1],但仅限于项目中包含源代码的情况。同样,该Obsolete属性适用于项目中包含的类型。

我什至不确定代码分析规则是否能够检查方法体?[2]。

关于如何在构建时标记外部类型/方法的使用有什么建议吗?

[1] - http://msdn.microsoft.com/en-us/library/bb514188.aspx

[2] - http://msdn.microsoft.com/en-us/library/dd172127(v=vs.90).aspx

c# asp.net

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

计划Azure实例

我想按照预定的时间表运行一个Azure实例(例如,美国东部时间晚上9点到周五,周一至周五),以减少计费,我想知道最好的方法是什么.

问题的两个部分:

  • 可以使用Service Management API [1] 在预定的时间表上将InstanceCount设置为0吗?
  • 如果是这样,您是否仍然需要为此服务付费,就像暂停部署一样?

[1] - http://blogs.msdn.com/b/gonzalorc/archive/2010/02/07/auto-scaling-in-azure.aspx

azure azure-web-roles

4
推荐指数
1
解决办法
703
查看次数

在企业应用程序中禁止jQuery的策略是否有意义?

例如,jQuery中是否存在尚未在最新版本中解决的任何漏洞(2)?安全包将标记库不安全的任何其他正当理由?

这个问题与(1)有关,但性质更广泛.

(1) - jQuery漏洞(NVD CVE-2007-2379)

(2) - http://www.networkworld.com/news/2007/040207-javascript-ajax-applications.html

javascript security jquery

4
推荐指数
1
解决办法
530
查看次数

为什么显示SQL语句的进度是不切实际的?

我正在使用大型数据集,有些语句需要30-70分钟才能执行,这是一个令人沮丧的月份!

我只是想知道......有没有一个可靠的原因,SQL实现通常不报告单个执行计划的进展?或者只是对大多数人来说这不够重要?

请赐教我.

sql sql-server

2
推荐指数
1
解决办法
280
查看次数