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

 

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

首先,我先上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

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

  1. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...

  2. 为指针分配的内存太小

    为指针分配的内存太小 (1)为指针分配了内存,但是内存大小不够,导致出现越界错误. (2)char *p1 = "abcdefg";       char *p2 = (char ...

  3. 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)

    传递给系统调用的数据区域太小. (异常来自 HRESULT:0x8007007A) 参考文章: (1)传递给系统调用的数据区域太小. (异常来自 HRESULT:0x8007007A) (2)http ...

  4. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    本篇是基于云天之巅博主音视频开发中的一个bug,继而查阅了的一点资料:本篇转载自博客园某博主的随笔,并做极少量的修改,原文地址:https://www.cnblogs.com/haore147/p/3 ...

  5. 小程序服务器内存要求,小程序服务器内存需要多大

    小程序服务器内存需要多大 内容精选 换一换 弹性伸缩服务可根据用户的业务需求,通过策略自动调整其业务的资源.具有自动调整资源.节约成本开支.提高可用性和容错能力的优势.适用以下场景:访问流量较大的论坛 ...

  6. 我的世界服务器物品栏太小咋办,《我的世界》MC背包容量太小?这四个装东西的道具了解一下!...

    原标题:<我的世界>MC背包容量太小?这四个装东西的道具了解一下! <我的世界>除了背包之外,还有四个道具是可以用来装东西的,但是有不少玩家都不知道.虽然背包是默认的储存道具, ...

  7. OS酱:“哎呀内存太小了,人家又缺页了!”

    操作系统--虚页面管理之页面置换算法 系统的内存并不是无限大,操作系统会为每个程序分配内存,当访问的地址块不在内存中,就要从外存(即硬盘,U盘等)调入,这就是所说的缺页异常. 当发生缺页异常时,操作系 ...

  8. 电脑很小,电脑内存太小怎么办?

    设置虚拟内存方法:右击我的电脑/属性/高级/性能中的设置/高级/虚拟内存中的更改/选自定义大小,在初始大小和最大值,同时设为你的物理内存的两倍.如果你的内存是512MB,就将初始大小和最大值同时设为设 ...

  9. 因VPU预留内存太小造成的视频播放太卡

    为什么80%的码农都做不了架构师?>>>    在WINCE上,如果有客户反馈某个视频播放比较卡,我首先会想到的是对方播放的是什么格式的视频. 客户往往都会拿一些诸如1920X108 ...

  10. linux查询tcp异常,linux服务器内存cpu 流量tcp异常信息记录python脚本

    #!/usr/bin/python #coding:utf-8 import commands import os import re import datetime #if mem util > ...

最新文章

  1. 日常工作必备之 linux 常用命令分类归纳
  2. python爬虫采集网站数据
  3. Cortex‐M3-存储器映射
  4. Linux tee的花式用法和pee
  5. 基本汇编语言学习结构
  6. sql统计系统时间那一个月数量_关于BE00007图书借阅管理系统bug修复总结
  7. 谷歌趋势:“比特币”热度远不及2017年高点
  8. 【报告分享】中国移动互联网2021年度大报告.pdf(附下载链接)
  9. linux数据库redis主从配置,redis介绍及主从配置
  10. golang数据库的操作,更新删除增加单行查找与多行查找
  11. android系统锁屏锁怎么解决方法,安卓手机忘记锁屏密码解决方法【图文详解】...
  12. pytorch以图搜图作业
  13. 图解 React 的 diff 算法:核心就两个字 —— 复用
  14. SQL SERVER 2016安装部署
  15. 【Proe】三维模型转二维CAD图
  16. DHT11温湿度传感器(基于树莓派)
  17. 农夫山泉(数据范围是亮点)
  18. WiFi、ZigBee、BLE用哪个?
  19. java tooltip_案例-Swing使用ToolTip
  20. 老男孩数据库学习记录

热门文章

  1. 别再骂中年人了,对他们好点吧~
  2. 面试官常问的线程池,你真的了解吗?
  3. 贫穷是我们变得牛逼的动力
  4. 性能测试--jmeter中使用jsonpath提取响应结果【17】
  5. 如何画c语言箭头鼠标,简单的鼠标绘图程序
  6. 怎么调节手机的刷新率_【W21 5G性能篇】120Hz自适应刷新率,用了再也回不去
  7. PingInfoView,中文,以及ping包+描述的使用。
  8. 示例1---从记事本中读取数值,然后写到数组中
  9. go-mysql数据-查询--输入数据--实战2
  10. centos7.x-firewalld防火墙常用命令收集