解决服务器上 w3wp.exe 和 sqlservr.exe 的内存占用率居高不下的方案

SQL Server是如何使用内存

最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉。所以一般我们在看statistics io的时候,看到的physics read都是0。其次就是查询的开销,一般地说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销。最后我们来看查询的开销,这个开销显然是越低越好,因为我们不能从中得到好处,相反,使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免中间表和游标的使用,在经常作关联和排序的列上建立索引。

我们先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内存,数据缓存一般是越多越好,甚至有些时候我们会强行把一些数据存储在高速缓存中。服务器如果还有其它应用程序,虽然在需要的时候MS SQL会释放内存,但是线程切换、IO等待这些工作也是需要时间的,所以就会造成性能的降低。sqlservr.exe 是很吃内存的,如果不控制的话,他会占光所有的物理内存,这样我们就必须设置MS SQL的最大内存使用。

降低 sqlservr.exe 内存占用率的解决方案:

1、一般情况下都是SQL语句优化的不够好,或者缓存方案使用不当造成,建议尽可能优化SQL语句以及使用合理的缓存方案。

2、优化网站程序,少用或不用session、cache、application之类的缓存方案,还有就是翻页处理不好也是会占很多内存。

3、设置最大服务器内存:打开SQL Server Management Studio,右键服务器SQL Server -> 属性 -> 内存 -> 设置最大服务器内存,这个可根据服务器配置以及需求而定,本例以2G内存为例,设置为物理内存的60%。

如果内存大于或者等于4G的,我一般这么设置(总内存单位为GB):

初始值=(总内存-(总内存/8)-2)*1024
EXEC sys.sp_configure N‘max server memory (MB)‘, N‘初始值‘
GO
RECONFIGURE WITH OVERRIDE
GO
先预留1GB给OS
4~16GB RAM,则每4GB留1GB,
16GB RAM+,则每8GB留1GB
然后根据Memory\Available Mbytes的值(建议在300MB左右),再逐渐调高MAX Memory Value。

限制服务器内存后报错

程序报错:资源池 ‘default‘ 没有足够的系统内存来运行此查询

可以尝试通过更新数据库的统计表信息解决,执行以下的SQL语句即可:

EXEC sp_updatestats

简单理解IIS应用程序池

w3wp.exe是一个IIS进程,在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。

IIS的程序池默认回收间隔是1740分钟(29小时),在自动回收过程中,应用程序池将会清空,保留在内存中的数据将会被清理(相当于IIS重启)。对于互联网应用程序,为了减少数据库服务器的负担,也许会选择将大量数据暂存在内存中,回收会造成内存数据丢失,如果没有及时保存到数据库中,可能导致应用程序出问题。如果遇到系统使用高峰期,回收将可能导致一段时间应用程序无响应(出现假死状态),给予用户一种很不好的体验。

在优化应用程序池之前,我们应用先了解下程序池的几个配置信息:

发生配置更改时禁止回收:如果为True,应用程序池在发生配置更改时将不会回收。 
固定时间间隔(分钟):超过设置的时间后,应用程序池回收,为0意味着应用程序池不会按固定间隔回收。系统默认设置的时间是1740分钟(29小时)。
禁用重叠回收:如果为true,将发生应用程序池回收,以便在创建另一个工作进程之前退出现有工作进程。 
请求限制:应用程序池在回收之前可以处理的最大请求数。如果值为0,则表示应用程序池可以处理的请求数没有限制。 
生成回收事件日志条目:每发生一次指定的回收事件时便产生一个事件日志条目,里面的明细设置不一一介绍。

问题分析:每1740分钟(29小时)回收一次是否合理?

不太合理,这个周期内,有可能应用程序处于访问高峰期。因为每天的回收时间都是不一样的,很有可能在高峰期回收,就会造成短时间内网站访问出现问题。因此,要避免最大程度的减少对用户的影响,我们需要充分的分析应用程序的访问情况,例如哪个时间段是高峰,

哪个时间段访问人数最少。了解到这些后,应用程序部署人员就应该设定固定的回收时间,例如一个网站凌晨两点访问人数是最少的,那么它可以设置“特定回收时间”在凌晨两点,应用程序池里面的特定时间是支持设定多个的,请注意。

降低 w3wp.exe 内存占用率的解决方案

打开IIS服务管理器 -> 应用程序池 -> 选择网站对应的应用程序池 -> 点击“正在回收”

在弹出的窗口设置特定回收时间(在此之前右键网站应用程序池,选择高级设置,将其固定时间间隔(分钟)设置为0),并设置基于内存的最大值,如下图所示:

解决CPU占用过多

1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、在任务管理器中增加显示PID字段。就可以看到占用内存或者CPU最高的进程PID
3、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到PID对应的应用程序池。(iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script Host”来执行,就可以得到PID与应用程序池的对应关系。)
4、到IIS中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。

5、找出最消耗CPU的SQL语句进行优化

-- 找出前50最耗CPU的SQL语法
SELECT TOP 50
qs.total_worker_time/qs.execution_count as [Avg CPU Time],
SUBSTRING(qt.text,qs.statement_start_offset/2,
(case when qs.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else qs.statement_end_offset end -qs.statement_start_offset)/2)
as query_text,
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Avg CPU Time] DESC

时间: 2024-10-09 09:13:45

解决服务器上 w3wp.exe 和 sqlservr.exe 的内存占用率居高不下的方案的相关文章

IIS解决CPU和内存占用率过高的问题

发现进程中的w3wp占用率过高. 经过查询,发现如下: w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行.这个进程用来分配大量的系统资源.这个进程对于系统的稳定和安全具有重要的意义,不能轻易的结束掉这个进程. 找到解决办法:(Windows2008中可以通过:服务器管理器->角色\web服务器\iis管理器 找到网站下的应用程序池,直接在程序池项的右键中修改) 解决CPU占用过多: 1.在IIS中对

解决服务器上安装不了centos7.4的问题

想必很多人在使用U盘安装CentOS7或者ClearOS7时遇到了dracut-initqueue: Warning: dracut-initqueue timeout - starting timeout scripts 这个问题导致服务器安装不上centos7.4的操作系统 网上查的资料新奇百怪,说什么的都有,最后总结出来了 解决办法有两个 使用DVD安装.(这不是废话么,能用DVD我还用U盘干什么). 用不了DVD就往下看 2.USB安装 解决办法1: 修改U盘的标签! 解决办法2:修改启

解决新装 Win 7 SP1 系统更新高CPU及内存占用率方法

最近重新安装了win7 sp1,系统更新始终无法工作,开始怀疑是驱动安装出现问题.但反复安装新旧驱动也解决不了问题,出现update服务cpu(Svchost.exe)占用居高不下的情况.网上也找了不少办法,什么重启服务,修复Windows更新服务等一系列不靠谱的方法,都是无济于事.几乎翻遍了整个互联网终于功夫不负有心人,找到了最终解决方法,就是需要提前安装一个补丁,但经过反复实验,事实证明需要安装两个补丁. 1.KB3102810 该补丁可以解决更新时CPU满载及大内存占用的情况 2.KB94

zabbix监控windows服务器上进程的内存使用情况

zabbix监控windows服务器上进程的内存使用情况 由于在windows服务器上不能像linux上一样使用top,或者类似于/pro目录下的数据信息,所以在在windows服务器上获得一个进程的内存或者CPU的使用情况不是很容易. 这里通过在windows服务器上使用python脚本获得进程的内存使用值,通过key传递给zabbix客户端,也就是本机上安装的zabbix客户端. windows上安装zabbix客户端网上的文章很多,这里不再记录. 1,首先安装python环境: 点击这里下

线上Java程序导致服务器CPU占用率过高的问题排除过程

博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高. 2.CPU占用过高问题定位 2.1.定位问题进程 使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8% [[

记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

https://blog.csdn.net/u013991521/article/details/52781423 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高. 2.CPU占用过高问题定位 2.1.定位问题进程 使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8% [ylp@ylp-web-01 ~]$ top t

Linux服务器运行一段时间,出现CPU占用率达到100%卡死

没事整了一个1核2G的便宜服务器,虽说便宜吧,但是搞个博客网站啥的也还是够用了:但是呢,最近服务器过几天就会出先CPU占用率达到100%:系统完全卡死,项目请求一个都访问不了,或者就是超级长时间才能得到应答.一开始还没在意,重启一下服务器就好了,可经常出现,重启也难受啊!后来百度好久才知道可能是被黑了,所以就到处找问题,啥子定时任务,脚本,一个个的看,可以说,把服务器文件结构又熟悉了一遍,终于是找到了一堆垃圾文件,确定了是真的被黑了.其实我还是搞不懂,我这么小个服务器咋也被盯上了.最后通过下面这

linux上限制用户进程数、cpu占用率、内存使用率

限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'` 其中用到ps获取进程信息,其实 ps中%CPU一列的意义是进程实际占有CPU时间和它存活时间的比值,这个值能反应进程对CPU的消耗,但不能准确反应进程所占CPU时间占整个系统CPU的百分比. 而top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于

电脑公司win10系统cpu占用高怎么办| win10cpu占用率高解决办法

相信很多用户都安装了电脑公司win10纯净版系统了,因为win10系统对于硬件的要求并不是很高,硬件要求低了,但是为什么win10系统总是会遇到CPU占用率的问题呢?win10系统CPU占用率高怎么解决呢? 电脑公司win10系统CPU占用率高解决步骤: 1.按快捷键"win+R"快捷键,打开"运行"界面,输入"regedit"代码,如图1所示 2.在"注册表编辑器"界面中,依次展开"HKEY_LOCAL_MACHI