SQL SERVER 内存分配及常见内存问题(1)——简介
原文:SQL SERVER 内存分配及常见内存问题(1)——简介
一、问题:
1、SQL Server 所占用内存数量从启动以后就不断地增加:
首先,作为成熟的产品,内存溢出的机会微乎其微。对此要了解SQL SERVER与windows是如何协调、共享内存。并且SQL SERVER的内部对内存的管理机制。
2、在Windows 2003以上版本运行的SQL Server,内存使用量突然急剧下降:
内存是Sqlserver的生命线。在errorlog中,出现一下情况: 
这类问题往往不是sql server导致的,而是Windows感觉到急迫的内存压力,迫使sql server 释放内存。
3、用户在做操作时,遇到内存申请失败:不是用户想申请多少就有多少
4、内存压力导致的性能下降:内存压力是性能问题最常见的原因之一。
二、操作系统层面看SQL SERVER 内存分配:
操作系统不缺内存不代表sql server不缺内存
专用术语:
Virtual Address Space(虚拟地址空间):一个应用程序能访问的最大地址空间。虚拟地址空间存放的数据信息不一定在物理内存中,可能会放在缓存文件中(Paging file)
Physical Memory(物理内存):要频繁访问的数据对象必须能长时间地缓存在物理内存中,才能达到最优化的效率。
Reserved Memory(保留内存):是虚拟地址空间的一段地址,不是真正物理空间,由某些API提前申请保留。
Committed Memory(提交内存):将保留内存的页面正式提交。最终到物理内存中,
Shared Memory(共享内存):windows提供了在进程和操作系统间共享内存的机制。可理解为在多个进程中可见的内存。
Private Bytes:某个进程提交的地址空间中,非共享部分。
Working Set:某个进程的地址空间中,存放在物理内存的那一部分。
Page Fault(页面访问错误):分为Soft/Hard ,访问一个存在虚拟地址空间,但不存在物理内存中的页面时,就会发生PageFault,如果不是访问越界而导致的,一种目标页面存在于硬盘,会产生硬盘读写,成为Hard Fault。另一种存在物理内存中,但没有直接放在这个进程的working set下。需要windows重定向,这种不会导致硬盘操作,成为soft fault,一般soft带来的性能影响可以忽略,只要关系hard fault。
System Working Set:Windows系统也有Working set 可以通过性能监视器里的memory:cache bytes来监控,发生在系统内存上的page fault可以用过Mmeory:cache faults/sec看到。
System Cache(系统高速缓存):提高磁盘I/O速度,可以用过性能监视器:Memory:cache resident bytes监控。
Non Paged Pool (非页交换区):包含一定范围内的系统虚拟地址的内存交换区,可以保证在任何时候都驻留在物理内存中,可以通过Memory:pool Nonpaged Bytes来监控。这一块缓存可以被所有的经常共享,一个最常见的用途是存放所有对象的指针(Object Handles)
Paged pool(页交换区):系统空间中可以调入或调出系统进程工作集(Working set)的虚拟内存区域。可以通过Memory:pool Paged Bytes和Memory:pool paged resident bytes监控。
Stack(栈):每个线程有两个栈,一个给内核模式(kernel mode),一个给用户模式(user mode)。每个栈是一块内存空间,存放线程运行的过程或函数的调用地址,以及所有参数的值。
In Process:运行在同一个进程的地址空间里。
Out of Process:运行在不同的进程地址空间里。
Memory Leak(内存泄漏):一种是sql server作为进程,不断地向windows申请内存资源知道整个windows内存耗尽。另一种是sql server 内部,某个sql server组件不断地申请内存,知道把能申请到的内存耗尽,使得其他组件不能正常运行。前一种情况非常少见。
32位下windows的地址空间及AWE:
默认情况下,windows进程有4G虚拟地址空间,2G给核心态(kernel mode),剩下的2G给用户态(user mode)。这两部分会严格区分。
任何一个用户进程的地址空间分布图:

方法1:在boot.ini文件中使用/3GB参数,可以在企业版的windows下讲核心态降到1G,讲用户态升到3G。

方法2:使用Address Windowsing Extensions(地址空间扩展,awe),是一种允许32位应用分配64GB物理内存,并把视图或窗口映射到2G虚拟地址空间的机制。不是所有的内存申请都使用awe,只有先reserve,再commit的内存调用才使用awe。
Windows层面上的内存使用检查:
需要检查的内容有:windows系统自身内存使用数量及内存分布。是否有内存压力,压力是否比较严重。甚至每个进程的内存使用情况。最后就是是否互相影响。
可以使用性能监视器实现。
Windows系统使用情况:
1、整体使用分析:
Committed bytes:
整个windows系统的内存总数,包括物理内存的数据和文件缓存中的数据。
Commit Limit:
整个windows系统能够申请的最大内存数,等于物理内存加上文件缓存的大小。如果Commit Limit≈Committed bytes,说明系统内存接近极限。如果缓存文件不能自动增长,系统将不能提供更多的内存空间。
Available MBytes:
现在系统空闲的物理内存,直接反映windows层面有没有内存压力。
Page File:%Usage 和Page File:%Peak Usage:
反映缓存文件使用量的多少,数据在文件缓存中存得越多,说明物理内存数量和实际需求量的差距越大,性能也越差。
Pages/sec:
Hard Page Fault每秒需要从磁盘读取或写入的页面数目。是Memory:pages input/sec + Memory:pages output/sec之和。
Memory:page faults/sec 是soft page fault 和 hard page fault的总和。但由于soft page fault 对性能影响不大,所以用处没pages/sec那么有用。pages/sec不能长时间保持在一个比较高的值。
2、Windows系统自身内存使用情况:
Memory:cache bytes:
系统的working set ,也就是系统使用的物理内存数目。
Memory:System cache resident bytes (system cache):系统告诉缓存消耗的物理内存。
Memory:Pool paged resident bytes:页交换区消耗的物理内存。
Memory:System Driver resident bytes:可调页的设备驱动程序代码消耗的物理内存。
Memory:System Code resident bytes:Ntoskrnl.exe中可调页代码消耗的内存。
3、System pool:Memory :pool Nonpaged bytes(非页交换区)和Memory:pool paged resident bytes(页交换区)
单个Process使用情况:
Process:%processor Time:目标进程消耗的CPU资源数,包括用户态和核心态的时间。
Process:Page Faults/sec 目标进程上发生的PageFaults的数目。
Process:Handle Count 目标进程handle数据,如果进程内部有对象老是创建不及时回收,就会发生Thread Leak
Process:Pool Paged Bytes目标进程所使用的Paged Pool的大小。
Process:Pool Nonpaged Bytes目标进程所使用的Non-Paged pool大小。
Process:working set 某个进程的地址空间中,存放在物理内存的那部分。
Process:Virual Bytes:某个进程所申请的虚拟地址空间大小。
Process:Private bytes:某个进程提交了地址空间中非共享的部分。
内存永远是最重要的系统资源。
SQL SERVER内存使用和Windows之间的关系:
Target Server Memory:理论上能够使用的最多内存数目。
SQL Server 内存使用量陡然下降现象:
合理配置SQL SERVER 内存
三、SQL Server 内部独特的内存管理模式:
SQL SERVER 开放的内存调节接口:
内存使用分类:
按用途分类:
按申请方式分类:
SQL SERVER 内存分配及常见内存问题(1)——简介的更多相关文章
- SQL SERVER 内存分配及常见内存问题(2)——DMV查询
原文:SQL SERVER 内存分配及常见内存问题(2)--DMV查询 内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT [type] , SUM(v ...
- SQL SERVER 内存分配及常见内存问题 简介
一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQ ...
- SQL SERVER 内存分配及常见内存问题 DMV查询
内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT [type] , SUM(virtual_memory_reserved_kb) AS [VM R ...
- 笔记26-徐 SQLSERVER内存分配和常见内存问题
1 --64位SQLSERVER 应用在IA64操作系统 7TB 2TB ...
- [转]SQL Server 性能调优(内存)
存储引擎自调整 sql server 是如何分配内存的 32bit地址空间的限制 用户模式vas分配和virtualalloc 非boffer pool 分配内存(保留内存) VAS调整 AWE ...
- 对于SQL Server,我需要多少内存
经常被问到的一个问题:对于SQL Server,我需要多少内存?这个问题还是有同样的典型的“看情况而定”答案.在今天的文章里,我们来详细看下“看情况而定的”的不同方面. 全新SQL Server安装 ...
- 如何修改SQL Server 2008 R2数据库的内存
本篇经验将和大家介绍如何修改SQL Server 2008 R2数据库的内存,希望对大家的工作和学习有所帮助! 工具/原料 SQL Sever 2008 R2数据库已安装 方法/步骤 1 打开 ...
- malloc内存分配与free内存释放的原理
malloc内存分配与free内存释放的原理 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入理解计算机系统的书,原来上面有讲malloc的原理 ...
- rt-thread中动态内存分配之小内存管理模块方法的一点理解
@2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...
随机推荐
- 一篇哥们自己的写的IBM电话面试感想-@大国
两天没写博了,还是没有养成一个习惯.前天和昨天休息,和哥们几个出去打球,运动一下,放松下脑子.今天就补一篇我哥们自己的写的关于他的IBM电话面试的感想,希望能帮到有需要的人. ------------ ...
- hdu - 4975 - A simple Gaussian elimination problem.(最大流量)
意甲冠军:要在N好M行和列以及列的数字矩阵和,每个元件的尺寸不超过9,询问是否有这样的矩阵,是独一无二的N(1 ≤ N ≤ 500) , M(1 ≤ M ≤ 500). 主题链接:http://acm ...
- 高速幂 POW优化
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- 泛型Binary Search Tree实现,And和STL map比较的经营业绩
问题叙述性说明: 1.binary search tree它是一种二进制树的.对于key值.比当前节点左孩子少大于右子. 2.binary search tree不是自平衡树.所以,当插入数据不是非常 ...
- hdu 4882 ZCC Loves Codefires(数学题+贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...
- android插件化-apkplug框架启动-02
本文章基于apkplug v1.6.7 版本号编写,最新方式以官网最新消息为准 一 apkplug框架所须要的库文件(宿主) 可从http://git.oschina.net/plug/apkplug ...
- python 凸包(经纬度) + 面积[近似]
def cross(A,B): return A[0] * B[1] - A[1] * B[0] def vectorMinus( a , b): return ( (a[0] - b[0] )*10 ...
- Android动画之二:View Animation
作为一个博客<Android其中的动画:Drawable Animation>.android动画主要分为三大部分.上一篇博客已经解说Drawable Animation的使用方法,即逐帧 ...
- 3、Spring4之Bean 配置的细节
1). 若字面值中包括特殊字符,则能够使用 value 节点的 <![CDATA[]]> 把字面值包裹起来. <constructor-arg> ...
- poj Firing(最大重量封闭图)
Firing 题目: 要解雇一些人,而解雇的这些人假设人跟他有上下级的关系,则跟他有关系的人也要一起解雇.每一个人都会创造一定的价值,要求你求出在最大的获利下.解雇的人最小. 算法分析: 在这之前要知 ...