关于数据压力测试,内存溢出测试。
现有的OA支撑着全公司(各子公司包括办事处)的日常运行,系统是用C#+SQL Server写的,用户数接近400多,系统每天刚运行的时候服务器大概占用的内存都是100多M200M左右,但随着使用时间的增加,一天运行下来系统会越来越慢,每天下班一查看,数据库服务器物理内存的占用量几乎接近2G(物理内存约1.7个G,虚拟内存约1.8个G),经常因为这样导致短时间的系统“休克”,本人估计是因为系统内存内存溢出导致系统占用内存剧增的,直接造成系统运行缓慢,甚至“休克”,但实在苦于无法对症下药,无从下手。请教一下各位高人,能否推荐一些工具或者一些方法对系统进行跟踪,查找出病原所在,以解决这个困扰偶一年多以来一直存在的问题。 --------------------编程问答--------------------
.NET有垃圾回收,理论上不存在内存泄漏的问题,是不是代码中有非托管的代码或调用了API,导致非托管的资源没有回收,在就是和数据库交互的代码也可能导致。如果有可以先检查下这些地方的代码是不是没有释放内存。
http://rliu0102.blogspot.com/2008/04/zz.html
参考下把
有一些开原的工具客可以监控的,但是.NET下的还没用过,自己搜索下 --------------------编程问答-------------------- 全面检查代码 --------------------编程问答-------------------- 估计是和数据库交互导致的问题较大,这个就没办法了,只有一点点查 --------------------编程问答-------------------- 建议楼主少用全局变量(特别是数组、数据表、SQL查询结果dataset等),多用局部变量;还要少用静态变量。
另外请楼主注意,如果程序里面包含非常多的SQL查询的话,用来保存查询结果的数据表一定要是局部变量才能节省内存,因为一次查询,是要消耗内存的,因为查询到是数据是暂存在内存中的,但如果不需要这些数据的时候一定要及时释放。如果不用全局变量,。net的垃圾回收机制会主动将不需要的数据清理掉,这样可以保持稳定的内存消耗。
根据楼主的描述,我认为楼主应该重点检查SQL查询、SQL写入、SQL读取等部分的代码,将不必要的数据表定义为局部变量。仅供参考。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 谢谢楼上各位高手的关注,小弟在此谢过大家!!!
详细说一下系统的情况吧
现在系统是使用两台性能都比较好的IBM服务器,iis一台,sql server一台
主要是sql server的内存占用量总是高居不下,iis服务器我也开了缓冲池限制,但也经常内存暴增,不过一般都是100-400M的物理内存占用量,自己估算用户数一多,也算正常,但sql server的服务器的确让人担心。
系统是标准的三层结构,所有插入、删除、更新、查询操作都是在数据层实现,也就是说全部都使用储存过程实现,不知道这方面会不会影响到系统的性能,如果因为大量调用储存过程导致内存占用量剧增,又有什么方法可以实现内存回收呢?
还有,就是现有系统的确有很多dataset的使用,但已尽量进行优化,能用datareader的地方都改成datareader,但如果按照这样计算的话,使用大量的dataset造成占用大量系统内存的话,应该是在iis的服务器上出现内存剧增而无法回收的情况,但现在是在db服务器上因为内存剧增而导致系统短暂“休克”,真的百思不得其解,望各位高手能给偶指条道道,彻底把这个顽疾解决。 --------------------编程问答-------------------- 我们做压力测试一般都是考虑数据量,
经验有限.
关注
--------------------编程问答-------------------- 数据量
现在按照信息量的话有一部分表是达到百W级(估计不会超过10张表)
十万级的表应该也有1、2十张
大部分都是W级的数据表。
--------------------编程问答-------------------- 还有一个想说一下
系统查询用到很多临时表,特别是分页的操作,如果真是这个原因造成,这方面又如何解决? --------------------编程问答-------------------- 我这边服务器物理内存4g,只要iis一开,就是2.5g,其中sql占1.8g左右。我做了.net页面级的缓存,甚至xml临时存储数据,但一直居高不下。我是全sql语句,一点存储过程都没用。
但有一条,内存占用从来不超过2.5G。所以我就没管。
你今天这么一说我想是要考虑一下了。 --------------------编程问答-------------------- sqlserver默认会使用全部内存来运行,调整下sqlserver的资源限制就可以了 --------------------编程问答-------------------- 请问楼上兄台,应该如何调整? --------------------编程问答-------------------- --------------------编程问答-------------------- 关注+学习!!
帮你顶!!
--------------------编程问答-------------------- 数据库优化和代码优化, 这两块都要处理下的 --------------------编程问答-------------------- 自己顶一下,希望大家能帮帮偶。 --------------------编程问答-------------------- dbserver配置:
8G的服务器内存
双至强cpu 3.0(四核)
这样的配置有时cpu也会占用很高,但不是经常,一般平均都是40-70左右的cpu占用率
程序我也一直怀疑存在问题,但苦于不知道怎么跟踪。 --------------------编程问答-------------------- 自己再顶一下,希望有高手能关注。
补充:.NET技术 , C#