ASP.NET服务器经常发生“Server is Too Busy”及响应很慢一般怎么解决?附:招聘.NET开发人员[北京海淀区]
工作职责   
  1. 能够独立完成项目、产品规划与设计。   
  2. 按照项目要求保质保量的完成开发任务。   
  3. 能够独立完成技术相关文档(如项目计划文档、需求文档、设计文档、测试文 档等)。 
     
  应聘要求   
  1、熟悉dotNet(visual studio.net 2003/2005)开发平台,精通ASP.NET(C#) WEB开发。 
  2、本科及以上学历,三年及以上工作经验,能力达到职位要求可适当放宽条件。 
  3、为人诚信,勤奋,工作责任心强,能承受紧张的工作压力。 
  4、有产品开发经验的优先有意请发Email:[email protected]

解决方案 »

  1.   

    看看程序代码,有没有死循环。
    看看程序中有关非托管资源(比如文件操作、数据库操作)有没有及时释放。
    看看程序中有没有滥用某些特性(比如什么东西都向Application中保存)。
    检查服务器性能是不是太低。
      

  2.   

    是否过多使用cache,session等服务器资源?数据库资源释放是否及时?
      

  3.   

    负载群集就是win2003自带的组件
      

  4.   

    服务器功能分开
    1,web 1台或多台。
    2,图片1台
    3,文件1台
    4,数据库1台我们现在就是这样做的,设置服务器之间可写的web权限,代码见:
    http://topic.csdn.net/u/20080320/16/3e89e70d-e929-44ed-ac93-83c94d75d0f7.html
      

  5.   

    提高ASPX服务器性能的几大狠招  ∆ 第0招依靠测试工具,以下根据ACT test测试结果,整理。【全部招数凶狠度的依据】所谓性能优化,必须是建立在测试的基础之上的,ACT Test是比较爽的测试工具,比Load Runner方便,比Web Stress直观,支持脚本编程和录制登陆到注销全过程。
    所有优化都要进行对比测试,才是评判的数字依据。
    所以,个人认为:不做压力测试,优化是可以做,但是没数据支持,是不严谨的。
     ∆ 第一招生成静态。【凶狠度排名第一:性能RPS提升两个数量级(提高速度百倍)】以下是截取Response的Stream生成文件的代码
     protected override void Render(HtmlTextWriter writer)
        {
            StringWriter stringWriter = new StringWriter();
            HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter); 
            base.Render(htmlTextWriter);        if (本页允许生成静态HTML)
            {
       //根据aspx的get参数构造出的HTML文件名,如:aaa.aspx?id=1 转化成 aaa_id_1.html
                string filePath = Server.MapPath(htmlFileName);            StreamWriter streamWriter = new StreamWriter(filePath , false, Encoding.UTF8);            streamWriter.Write(HTML);            streamWriter.Close();            htmlTextWriter.Close();
    }
    }
    生成后,以后先判断是否有这个文件,如果有就跳过去。
    本页允许生成静态HTML,可以在后台做一个钩选和更新,并且在内容发生变化后删除静态HTML。 ∆ 第二招,图片文件分流服务器。【凶狠度排名第二:性能RPS提升1个数量级(提高速度十倍)】 
    1,web 1台或多台。
    2,图片1台或多台。
    3,文件1台或多台。
    4,数据库1台或多台。
    不同机房要采用Remoting分发文件是个不错的主义,就是工作量大。
    以下是同机房多服务器之间可以通过web读写分发文件的关键代码。
    using System; 
    using System.Collections; 
    using System.Configuration; 
    using System.Data; 
    using System.IO; 
    using System.Web; 
    using System.Web.Security; 
    using System.Web.UI; 
    using System.Web.UI.HtmlControls; 
    using System.Web.UI.WebControls; 
    using System.Web.UI.WebControls.WebParts; 
    using System.Security.Principal; 
    using System.Runtime.InteropServices; namespace WebApplication1 

        public partial class _Default : System.Web.UI.Page 
        { 
            public const int LOGON32_LOGON_INTERACTIVE = 2; 
            public const int LOGON32_PROVIDER_DEFAULT = 0;         WindowsImpersonationContext impersonationContext;         [DllImport("advapi32.dll", CharSet = CharSet.Auto)] 
            public static extern int LogonUser(String lpszUserName, 
                                      String lpszDomain, 
                                      String lpszPassword, 
                                      int dwLogonType, 
                                      int dwLogonProvider, 
                                      ref IntPtr phToken); 
            [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
            public extern static int DuplicateToken(IntPtr hToken, 
                                     int impersonationLevel, 
                                     ref IntPtr hNewToken); 
            private bool impersonateValidUser(String userName, String domain, String password) 
            {             IntPtr token = IntPtr.Zero; 
                IntPtr tokenDuplicate = IntPtr.Zero;             if (LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
                { 
                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
                    { 
                        WindowsIdentity tempWindowsIdentity; 
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
                        impersonationContext = tempWindowsIdentity.Impersonate(); 
                        if (impersonationContext != null) 
                            return true; 
                        else 
                            return false; 
                    } 
                    else 
                        return false; 
                } 
                else 
                    return false; 
            } 
            private void undoImpersonation() 
            { 
                impersonationContext.Undo();//回退为未更改前账户 
            } 
            protected void Page_Load(object sender, EventArgs e) 
            { 
                //临时更改为 跟 网络硬盘相同用户名密码的账户(此账户必须在网络盘有写入权限)本机也需要同样帐号密码的帐户 
                if (impersonateValidUser("administrator", "192.168.1.102", "kuqu123456")) 
                {              
                    Response.Write(System.IO.File.Exists(@"\\192.168.1.102\share\C#高级编程\C#高级编程(第四版).pdf"));                
                    undoImpersonation(); 
                } 
                else 
                { 
                    Response.Write("登陆失败");                 
                }         } 
        } 
    }  ∆ 第三招,各种缓存。【凶狠度排名第三:性能RPS提升1个数量级(提高速度十倍级别)】 缓存代码好找,就不写了,道理不用多讲。
     ∆ 第四招,减少数据库往返。【凶狠度排名第四:性能RPS提升和往返次数有关】
    能一次取的数据,就不要多次,尤其在绑定的行里多次执行存储过程。 ∆ 第五招,少用对象。【凶狠度排名第五:性能RPS提升取决于对象数量】 用Static函数执行SQL,绑定数据或者增删查改,来代替 new一堆对象去绑定List或者设置属性。∆ 第六招,多用Ajax和客户端HTML代码,少用服务器控件,减少刷新和ViewState。【凶狠度排名第六:性能RPS提升取决于具体界面功能】
     
    道理不用多讲,服务器控件垃圾比较多。∆ 第七招,采用好的数据结构容器和算法。。【凶狠度排名第七:性能提升取决于算法复杂度,普通Web开发这种情况不多见,但是特殊开发要重视!~~】
    哈希类性能最好,查找复杂度是O(1),例如:Dictionnary<T,T>,
    二叉树查找复杂度是O(Log n),排序O(n*Log n),List和ArraList自带的排序速度是接近(n*Log n),
    数组类的线性查找O(n),如果你用冒泡排序O(n*n),那么你不是优秀程序员。
    StringBuilder 性能好于 string+=,不过提升的有限,不是本质的数量级别的提升。其他招数,欢迎补充排名。