服务器内存太小,伤不起![异常与应用程序池引发的连锁命案]

简介:

最近都在写 秋色园技术原理解析 文章,今天就写一篇散文,简述一下服务器内存太小引发的命案。

 

以前写文都排版,这篇就当散文了...写完就这样了,当然加黑加红还是给加了。

 

首先,我先上2张秋色园服务器当前进程及内存的图片:

 

1:进程

 

2:物理内存剩余

 

看完这两张图片,啥感觉?内存穷紧张!!!!

 

穷紧张不打紧,打紧的是比紧张还紧张的情况发生了,什么情况?

 

出事故了,应用程序池要产生回收动作了!!!!

 

先看一下应用程序池什么情况会产生回收动作?

 

复制代码
1 :IIS应用程序池里的“回收”里的配置就不说了,这些是你自己定义的。

2 :你手动执行“回收”,以重启应用程序池。

3 :你升级dll到服务器中,新升的升级会引发应用程序池重启。

4 :web应用程序产生“错误”,进程终止,引发应用程序池重启。

5 :临时想不出来......
复制代码

 

 

出事了,出事了,出啥事了?

 

还不是内存穷紧张那点破事,为了演示一下什么事,我决定回收一下应用程序池给大伙截图!!!

 

这里本机示例回收了,大伙知道咋回事就可以了,哈哈:

 

看到了吧,两个进程,这是什么情况?

IIS启用了新的进程来接收新的请求,同时旧的进程请求会保留继续处理之前的请求队列,直到处理完所有之前的请求才结束。

大体就是这么一回事了,问题就产生在这一瞬间:

本来就没内存了,旧的进程不回收,新的进程又出来,一出来就喊着要内存,可是系统又给不了内存,于是就卡在那里,还造成CPU百分百的情况。

就在这个小间间,网站访问就卡住了,打不开了,给人一种速度超慢的感觉。

 

什么时候你感觉打开了,估计就是旧的进程光荣退休了。

 

好了,升级时候的情况并不多,应用程序池也设置了半夜才回收一次,理论上回收也不多,这种小瞬间产生的机率并不多。

 

可是网站不稳定的情况才出现的挺频繁,似乎超出我设置的时候和升级的频率。

 

就在这些天,我发现我基础有点差:

web应用程序产生“错误”,进程终止,引发应用程序池重启。

以前都没怎么注意,现在发现了,代码写的不好,异常不处理好,应用程序池就会经常性重启,也是引发你网站慢的一个原因。

 

给大伙截一张图:

 

大伙到自己服务器上看这事件,如果看到一堆错误及警告,说明你和我一样基础差。

 

这些日志是怎么产生的?

 

其实就是系统未被捕获的异常的,然后最终一路过五关,最后就跑这来了,跑到这来,基本上你的应用程序池就变的很不稳定的说。

 

下面就随意扯扯异常这事情

首先一点就是:

在.NET 2.0中,主线程或线程的错误,都会导致进程的中止,引发应用程序池回收。

1.1版本的时候,线程的错误是不会引发主进程中止的。

 

PS:还记得我上篇文章“秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)”说到的内置线程吧,

其实隐藏说的就是这问题,线程的访问冲突,经常性的引发了主进程中止,导致应用程序池重启。

 

再说一点的就:

先把日志上的警告和异常给处理了。

 

最后一点的就是:

全局捕获未处理的异常,然后作掉它,不让它跑到这来危害应用程序池重启。[补充:作掉它并不能避免应用程序池重启]

 

基础不好,很多天了,才偶然发现这么点代码:

一:AppDomain.CurrentDomain.UnhandledException 事件

复制代码
         public  Window1() {
            InitializeComponent();
            AppDomain.CurrentDomain.UnhandledException 
+=   new  UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        }

        
void  CurrentDomain_UnhandledException( object  sender, UnhandledExceptionEventArgs e)
        {
            
throw   new  NotImplementedException();
        }
复制代码

PS:在web中发现这家伙似乎不起作用,没深入纠结它,而且它阻止不了异常往上报,只能是收集信息用。

 

二:HttpApplication.Error事件

复制代码
         public   void  Init(HttpApplication context)
        {
            context.BeginRequest 
+=   new  EventHandler(context_BeginRequest);
            context.Error 
+=   new  EventHandler(context_Error);
        }

        
void  context_Error( object  sender, EventArgs e)
        {
            HttpApplication app 
=  (HttpApplication)sender;
            Log.WriteLogToTxt(app.Server.GetLastError());
            app.Server.ClearError();//把错误消灭了,不让它往上抛
        }
复制代码

 

这里其实要说的就是app.Server.ClearError(),为了发现这一行代码,我纠结了好多个小时,最后很偶然才发现它,[虽然发现了它,但是作用似乎不大]。

 

补充:

在楼下网友:长河落魄 的疑问声中,我测试了一下,得到以下结果:

1:主线程中产生的“错误”,只要不是致命的,系统日志中仅是“警告”级别,它不会引发应用程序重启。

2:内置线程中产生的“错误”,系统中产生的“错误”级别,它会中止进程,而且,上面的全局语句并不能捕获到异常。

 

当然,这里还有几个疑惑:

1:应用程序池是不是只遇到“错误”级别的,才会引发终止,重启?

2:主线程中一般的错误都是“警告”级别,那有没有可能会产生“错误”级别的错误呢?如果产生了,是不是一样可拦截?这上面的清除异常的代码,是不是就有效了?

3:多线程中的异常,没有全局捕获的事件了?如果有,你在哪呢?

 

 

好了,现在基本上错误都被记录,一步一步对着日志一个一个消灭了,现在基本上应用程序池很稳定不乱重启了,安稳了许多。

 

其实总结还是一句:内存太小,伤不起啊!

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/archive/2011/07/20/2111628.html

相关文章
|
3天前
|
运维 应用服务中间件 网络安全
自动化运维的利器:Ansible在服务器管理中的应用
【8月更文挑战第28天】本文深入探讨了Ansible在简化和自动化服务器管理工作中的强大功能及其实际应用。通过浅显易懂的语言和具体示例,展示了如何利用Ansible进行批量配置、部署应用以及执行系统管理任务,旨在为读者提供一套完整的解决方案,以便更好地理解和应用Ansible,从而提高工作效率和减轻运维负担。
|
3天前
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
16 2
|
19天前
|
缓存 数据安全/隐私保护 UED
代理服务器在HTTP请求中的应用:Ruby实例
代理服务器在HTTP请求中的应用:Ruby实例
|
28天前
|
监控 物联网 数据挖掘
PHP不仅在Web开发领域有着广泛的应用,其在服务器端的应用也非常重要
【8月更文挑战第4天】PHP不仅在Web开发领域有着广泛的应用,其在服务器端的应用也非常重要
45 8
|
1天前
|
JavaScript 前端开发 UED
服务器端渲染新浪潮:用Vue.js和Nuxt.js构建高性能Web应用
【8月更文挑战第30天】在现代Web开发中,提升应用性能和SEO友好性是前端开发者面临的挑战。服务器端渲染(SSR)能加快页面加载速度并改善搜索引擎优化。Vue.js结合Nuxt.js提供了一个高效框架来创建SSR应用。通过安装`create-nuxt-app`,可以轻松创建新的Nuxt.js项目,并利用其自动路由功能简化页面管理。Nuxt.js默认采用SSR模式,并支持通过`asyncData`方法预取数据,同时提供了静态站点生成和服务器端渲染的部署选项,显著提升用户体验。
|
28天前
|
运维 应用服务中间件 持续交付
自动化运维之宝:Ansible在服务器管理中的应用
【8月更文挑战第4天】本文深入探讨了Ansible这一自动化运维工具的实际应用,通过具体案例展示了其在服务器配置、软件部署和系统管理中的强大功能。文章不仅介绍了Ansible的基本操作,还提供了代码示例和实践技巧,旨在帮助读者有效提升运维效率。
46 6
|
2天前
|
缓存 Linux 调度
Linux服务器如何查看CPU占用率、内存占用、带宽占用
Linux服务器如何查看CPU占用率、内存占用、带宽占用
9 0
|
27天前
|
存储 人工智能 运维
裸金属服务器详解:定义、核心特点与应用
裸金属服务器,又称单租户环境物理服务器,是指由一个或多个独立的服务器组成,提供专属的物理计算资源。它是服务器领域的一个创新产物,结合了虚拟机的弹性和物理机的性能优势,成为云端的一个专用物理服务器。裸金属服务器在硬件层面直接提供计算资源,不经过虚拟化层,从而避免了虚拟化带来的性能损耗,为用户提供了极致的计算性能和资源独占性。
|
2月前
|
弹性计算 Java 应用服务中间件
云服务器 ECS产品使用问题之变更服务器配置时一直显示400异常报错,该怎么办
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
28天前
|
弹性计算 固态存储 ice
阿里云服务器ECS内存型r8i、通用算力u1、r7、AMD内存r8a、高主频内存hfr8i价格和性能差异
2024年阿里云提供2核16G、4核32G及8核64G等多种服务器配置,用户可根据需求选择不同实例规格如内存型r8i、通用算力型u1等。以华北2(北京)为例,2核16G月费从286.2元起,4核32G从572.4元起,8核64G则从1144.8元起。公网带宽1Mbps预付费为23元/月,系统盘如ESSD PL1按量计费0.0021元/小时/GiB。具体价格与折扣请参考阿里云官网。

热门文章

最新文章

下一篇
云函数