部署环境是win2003(内存 8G) server mssqlserver2005
C#桌面应用程序与数据库部署同一机器上。
在程序中使用sqlserver2005频繁的连接数据库,过大约80小时后,出现下述情况:
1450 在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 系统资源不足,无法完成请求的服务。)
有时间打开本地数据库连接出现,提示 系统内存不足,无法完成请求。
我的程序就是服务器端的程序,频繁的操作数据库,插入或更新,检查程序打开的连接使用完后关闭。
自己觉得是sqlserver2005将内存占满了,所以出现上述情况。具体的原因不是很清楚,请高手指教,谢谢。 
 

解决方案 »

  1.   

    参考:sqlserver限制内存大小
      

  2.   

    1、 主要设置min server memory  和 max server memory  ,如果同台服务器有多台吃内存大户服务, max server memory 给设置一个值稍大的值出来,别让SQL server把WINDOWS内存都吃完了也别让其他的服务把WINDOWS内存吃完了,这样才会相安无事
    2.设置方法可以通过命令方式的,楼上的挺好,还有就是通过SQL SERVER企业管理器进行:鼠标右键服务器\属性\内存 可以看多最大内存和最小内存设置选项。
      

  3.   

    控制最大内存是必要的,但是其实即使你不控制,还是会预留256M给os,可以使用性能计数器去看看是否真的内存有压力
      

  4.   

    参考一下我的文章http://blog.csdn.net/dba_huangzj/article/details/8627000
      

  5.   

    一开始 没有设置数据库最大内存值,应用程序打开数据库连接提示系统内存不足,无法完成请求。
    后来服务器再加了8G,总共16G内存,操作系统BOOT.INI添加/PAE 设置数据库最大内存值为大约6G,开启AWE。
    一周内软件出现两次假死状态。
      

  6.   

    是的32位。 Microsoft Windows Server 2003 R2 Enterprise Edition Service Pack 1  
    另外 参考你的文章 http://blog.csdn.net/dba_huangzj/article/details/8627000发现  Memory: Available Mbytes,范围15402~15407  平均值15405 MB
    其他性能计数器如下 
    1.Page/sec               范围 0~704         平均7
    2.Uaage                  范围 9~9           平均9
    3.Buffer cache hit radio 范围 100-100       平均100
    4.Page life expectancy   范围 15847-15946   平均15897
    5.Memoory grants pending 范围 0-0           平均 0 在此再次感谢。
      

  7.   

    32位系统虽然开启了AWE/PE啥啥,忘了,但是对内存的使用依旧没那么优秀,如果硬件方面你已经没法改进,比如改64位,那么你就要优化查询,有可能你的查询缺少索引,每次都查询出大量数据,使得需要加载很多数据页到内存中,也有可能一些ad hoc过多,占用了内存的缓存部分。
      

  8.   

    我不是十分确定你现在的问题是什么?
    你刚开始说“系统资源不足,无法完成请求的服务”,“提示 系统内存不足,无法完成请求。
    ” 那很明显是AWE吃内存太厉害,后来“ 设置数据库最大内存值”后问题解决了是吧?
    现在的问题是“一周内软件出现两次假死状态。 ” 从描述上来看,跟SQL SERVER没有直接的联系了,你说的假死应该是hang吧,然后呢?你怎么处理的?
    另外,你软件是用什么做的?.NET吗?  
    hang可以通过DUMP内存debug来解决。
      

  9.   

    另外你在出现hang的时候,你也要监控CPU的利用率,如果是CPU的利用率很低,那你很可能是LOCK或者等待外部的资源,比如SQL server ,web service之类。如果CPU的利用率很高,那很可能是软件本身的问题,比如Infinite loop ,或许GC天频繁,总之要找出root reason,最好就是DUMP内存来分析。
      

  10.   

     设置数据库最大内存值后,没有出现系统资源不足,无法完成请求。“一周内软件出现两次假死状态。 ”就是软件非常卡,无法进行操作,如查询按钮点不了等。
    软件是.net开发的,另外CPU使用率基本平稳波动不大,主要是程序后台频繁的操作数据库,插入或更新操作。
      

  11.   

    卡的时候profile一下,看看数据库跑什么
      

  12.   

    长夜漫漫,无心睡眠,只因公司加工资太低无法养家糊口度日。反正横竖都是饿死,我还是把你的问题回答完了再死吧。首先不知道你的这个C#桌面应用程序是做什么用的。把它起起来会占用多少系统资源。但是首先一点系统选择上有点问题。32的最大寻址空间2的32次方也就是4个G。它又把这4G分成两部分其中一部分用于进程本身使用,另一部分供系统使用。咱们分别叫他俩用户模式和内核模式。那你用64位的系统2的64次方那就比这个数值大多了。你的内存就得到了充分的利用。分配起来也更合理。3GB不说了因为上面没有看到你用。他就是把内核模式减少1G,把用户模式添加1G. 看到你上面开启了PAE,windows server 2003 sp1 不是系统自动开启PAE,你为什么还要手动去配置呀?PAE就是讲系统页表项从4kb增加到8kb,利用多余的空间来将虚拟地址映射到物理内存中多于4GB的部分。虽然windows能识别和管理128GB内存了。但是他的内核模式也翻倍了。AWE也很容易被人误解,他只代表缓冲池中的最大最小内存哦。而不是sqlserver占用的所有内存。比如一个16GB的内存我感觉最大最小内存这只在11GB或12GB比较合适。这样我感觉他才不会应为多页分配,分页(也是系统级别的哦。不是数据库级别的哦,不信你begin tran insert into tbname rollback tran你会问rollback了大量内存却被裁剪。因为分页了。系统向你的数据库要内存了),备份,你的C#桌面应用程序,系统。如果你设置了最大内粗比较大。有开启了AWE,锁定了内存页。我想你的系统,多页分配,分页,备份,C#桌面应用程序,内存就会紧张而且裁剪不掉你的AWE内存。这样系统就因压力过大而出现假死现象。如果我今晚饿不死。祝福我明天找到好工作吧?谢谢。
      

  13.   

    14楼的没有说错,SQLSERVER会自动释放连接对象,你的程序如果没有关闭连接,就会造成内存紧张的情况
      

  14.   

    看情况,内存能受控的是Data Buffer
      

  15.   

    一般给操作系统留2G,假如32G内存,通过max server memory设置给sql server 30G,2G保留个操作系统。如果服务器上还有其他程序,那还得多留点内存出来。
      

  16.   


    检查程序结果,程序并非连接(远程连接,记录集)没有关闭释放。程序使用短连接,每次打开本地连接后,主动关闭并释放。个人感觉.net回收机制回收有点慢,然后修改为常连接,情况没明显改观,内存使用依然居高。
    后来做个测试,后台开启一个线程从另台机器抽取数据和开启50个线程抽取数据,内存使用一样的。所以,个人认为是数据库一开始就把内存占用。难道像上面的仁兄讲的,需要换操作系统64位的?服务器上没有其他什么应用程序,360杀毒除外。
      

  17.   

    不对,你的思路有问题,
    首先3G内存设置,存在一个问题,windows 2003用的是32位系统,那么服务器的虚拟寻址空间只有2G,开启3G设置后,虚拟寻址空间会达到3G,但是这个时候系统的可用内存就变成1G了,这样服务器会面临很大的问题,内存不足。内存不足时,服务器会强制实行工作集剪切。即使你的内存大于4G,那么增加的部分也只是数据库的数据缓存部分。
    建议:
    1、程序服务器和数据库服务器分离。
    2、安装64位系统。
      

  18.   

    谢谢大家,后来使用64位操作系统得到显著改善,另外连接字符串里面加了maxpool=20,minpool=0后 服务器运行平稳。
      

  19.   

    那是因为你限制连接池最大连接,这样会有问题,如果并发高,最大连接被限制的话,很多请求连接数据库的会话会因为等待而超时。
    还有数据库不会一开始就占用内存,实际上数据库在任务管理器中显示的内存都不会超过,1.8G,大部分的内存用作数据缓存,还有,数据库给每个连接会话2MB的内存,会话多了也可能占用过多内存。
      

  20.   

    数据库有没有DUMP文件?另外数据库错误日志具体的错误代码是什么?701?
      

  21.   

    感觉应用的问题可能性比较大
    win2003企业版32位,使用4G以上内存(最多64G)没遇到什么问题
      

  22.   

    据我遇到过的情况,其实是代码不够优化,大量的scan、join等导致的