Session_End引发的性能问题

这是这两天刚刚发现的问题,记下来,希望对被web性能困扰的同仁有所帮助!

下面说说网站的环境和状况吧:

环境:win2003 + asp.net + sqlserver2000, 一个在线读书项目,日PV超500万,独立IP超3万

状况:

1)内存占用218M平稳;

2)cpu约占5%,但是每隔20秒会突然冲到30%,有时甚至50%;(这个很重要)

3)每次重新更新发布程序,cpu会稳定占5%一段时间(约30分钟),之后就会如上面第2条(这个也很重要)

我分析了下,认为应该是有定时器这类的东西每隔20秒触发一次,清理程序的缓存之类的东西,由于刚开始缓存并不大,所以更新程序之后前30分钟并没有出现cpu不稳定的问题,30分钟后随着缓存变大,需要清理的缓存越多,所以引起cpu不稳定。

于是我查遍了所有程序,没有定时器之类的东西,连和20相关字也没搜到,真是纳闷了。又仔细想了想,能触发定时器这类的东西,就只有global.asax了,看了下这个文件,只有Session_End这个事件又几行代码,如下

 void Session_End(object sender, EventArgs e)
    {
        // 在会话结束时运行的代码。
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不会引发该事件。
        if (Session.SessionID != "")
        {
            Application.Remove("id" + Session.SessionID);
            Application.Contents.Remove("id" + Session.SessionID);
        }
    }

难道真是这里的问题,尝试把这段代码去掉,更新发布,cpu居然一直保持平稳了。

看来终于找到问题所在了,为了进一步了解这里到底有多少操作,我把代码改成了这样

 void Session_End(object sender, EventArgs e)
    {
        // 在会话结束时运行的代码。
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不会引发该事件。
        if (Session.SessionID != "")
        {
            string sessoinId = Session.SessionID;
            string applicationContent = Application.Contents["id" + Session.SessionID].ToString();
            SessionLog.Insert(sessionId,applicationContent,DateTime.Now); // 这里把数据记录到数据库中

            Application.Remove("id" + Session.SessionID);
            Application.Contents.Remove("id" + Session.SessionID);
        }
    }

更新发布,约半个小时之后,数据库里终于有了数据,发现时间竟然都是 00-01 秒之间,20-21秒之间,40-41秒之间,每段时间约有70-120条数据。

我不是.net专家,不知道这个Session_End到底是怎么样触发的,不过通过测试结果我个人认为Session_End应该是每隔20秒触发一次,发现有过期的Session就执行Session_End里面的代码,比如我的网站就进行了100多次的Application.Remove(),所以每隔20秒中cpu就会跳一次。

有谁能给我详细解释下吗,如果有那太感谢了。

也希望这个对被性能困扰的各位有点帮助。

时间: 2024-10-07 11:13:17

Session_End引发的性能问题的相关文章

RDS for MySQL 字符序(collation)引发的性能问题

在帮客户排查问题的时候,经常会遇到的 RDS 实例性能问题(比如 RDS 实例 CPU 使用率高),而其中有一类是由于字符集的字符排序规则不一致导致的.从处理的过程中可以看出来,这类问题比较容易出现但不容易定位排查,所以今天通过两个实战案例来分析的下"RDS for MySQL 字符序(collation)引发的性能问题". 首先介绍下背景知识: 字符集 和 字符序. 1. 字符集(character set)和字符序(collation) 字符集是一组符号和编码,用来保存和解释 My

和表值函数连接引发的性能问题

原文:和表值函数连接引发的性能问题     最近调优过程中遇到一个问题,就是表值函数作为连接中的一部分时,可能会引起麻烦,本文会简单阐述表值函数是什么,以及为什么使用表值函数进行连接时会引发性能问题. 表值函数     SQL Server中提供了类似其他编程语言的函数,而函数的本质通常是一段代码的封装,并返回值.在SQL Server中,函数除了可以返回简单的数据类型之外(Int.Varchar等),还可以返回一个集合,也就是返回一个表.     而根据是否直接返回集合或是定义后再返回集合,表

和表值函数连接引发的性能问题分析

 表值函数     SQL Server中提供了类似其他编程语言的函数,而函数的本质通常是一段代码的封装,并返回值.在SQL Server中,函数除了可以返回简单的数据类型之外(Int.Varchar等),还可以返回一个集合,也就是返回一个表.     而根据是否直接返回集合或是定义后再返回集合,表值函数又分为内联用户定义表值函数和用户定义表值函数(下文统称为表值函数,省去"用户定义"四个字). 内联表值函数     内联表值函数和普通函数并无不同,唯一的区别是返回结果为集合(表),而

闪回区报警引发的性能问题分析(r11笔记第11天)

自从有了Zabbix+Orabbix,很多监控都有了一种可控的方式,当然对于报警处理来说,报警是表象,很可能通过表象暴露出来的是一些更深层次的问题.这不又来一个,不看不知道,一看让自己着实吓了一跳. 首先是一个报警信息,可以看到是闪回区超过了报警的阈值,为了尽可能提前发现问题,我把阈值设置为了70%,和Oracle默认的80%有一些差别. ZABBIX-监控系统: ------------------------------------ 报警内容: archive_area_usage ----

悠然乱弹:一段SQL引发的性能危机及其背后隐藏的设计缺陷

故事发生的背景是,在文件上传的时候,有时间会有人上传了文件,但是最后没有使用上传的文件,这样就会产生一些垃圾文件. 原来软件作者就想写一个后台定时任务程序,来清除这些垃圾文件? 由于作者坚定的不让我发她的SQL语句(这个我也理解,这么丑陋的SQL),所以这里就不发源代码了,发伪代码. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void deleteMissLinkFile{   List fileList=getFileList();   List delete

由db_cache_size引发的性能问题

测试环境有两个db, TEST01(10gR2),TEST02(11gR2) TEST02是基本上复用了TEST01的参数设置,但是TEST02却报了很多问题,比如查询性能低下.数据库连接不能很快的释放. 今天无意中看到TEST02的sga大小,让我大吃一惊.同样的设置,buffer_cache竟然查了将近20倍.àTEST01 SQL> show sga   Total System Global Area 6442450944 bytes Fixed Size                

libcurl在ipv6被禁止的情况下的性能下降

最近我们的集群业务量增加了3T/天.然后发现集群的cpu使用率和load上升的非常高,load最高达到了60.团队分析了性能原因,发现发送结果数据到另一个集群的逻辑消耗了大部分的cpu,于是对这部分发送逻辑进行了优化. 在优化发送逻辑后,cpu下降了一半,load也下降了.但是效果并不明显.有一个机器,load仍然很高.持续的调查发现,在load较高的机器上出现间隔出现多个modprob -q - net-pf-10进程(其中net-pf-10为ipv6模块的别名),行为上似乎在不断的重新加载i

Android Webview中Vue初始化的性能优化

前言 一般来说,你不需要太关心vue的运行时性能,它在运行时非常快,但付出的代价是初始化时相对较慢.在最近开发的一个Hybrid APP里,Android Webview初始化一个较重的vue页面竟然用了1200ms ~ 1400ms,这让我开始重视vue的初始化性能,并最终优化到200 ~ 300ms,这篇文章分享我的优化思路. 性能瓶颈在哪里? 先看一下常见的vue写法:在html里放一个app组件,app组件里又引用了其他的子组件,形成一棵以app为根节点的组件树. <body>    

鲜为人知的Exadata存储性能秘密

作者介绍 石云华,现就职于北京海天起点,Oracle技术二线专家成员,Exadata部门负责人.拥有十余年电信.保险.税务行业核心系统Oracle数据库运维经验,持有11gOCM.Exadata.Goldengate等证书. 擅长于Oracle/Goldengate/Exadata方面的故障诊断及疑难问题处理.   案例概述   一个X3-2 的Exadata临时客户,Oracle原厂工程师在进行onecommand初始化的过程中,执行到第6步,calibrate检测存储节点磁盘性能时报错,后续