配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations
配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations
目录表->页表->物理内存页
看这篇文章之前可以先看一下下面这篇文章
了解一下虚拟地址空间(VirtualAddressSpace,VAS)的概念
前几天在论坛里遇到一个问题
其中提到一个可能性的原因,开启了Large-Page allocations,看完文章之后就会知道,其实跟Large-Page allocations无多大关系
Large-Page allocations是什么来头??
参考这篇文章:Configuring SQL Server to use Windows Large-Page allocations
今天,一个可改变控制的实现激使我去写这篇文章,这个可改变的控制就是允许运行在Windows200864位服务器上的SQL Server 2005企业版上
使用跟踪标志834,SQLSERVER会利用 Large-Page allocations去构建内存中的Buffer Pool。
下面是我对 Large-Page allocations的理解和这个Large-Page allocations对性能的提升
页面分配
虚拟地址空间(VirtualAddressSpace,VAS)由很多的内存页面组成。这些页面有两种大小,32位系统是小的页面只有4KB大小(IA64位系统上是8KB)
64位系统上是大的页面有2MB大小(IA64位系统上是16MB)。
虚拟地址空间(VirtualAddressSpace,VAS)是由页面描述符表(简称页表)这种结构来维护的,因此,每个虚拟地址空间在页面描述符表里都有对应页面表入口
(个人感觉类似于系统服务描述符表SSDT ,内核描述符表GDT/LDT)。硬件利用这个表将这些入口转译出可读的格式,无论什么时候转译一个虚拟地址,
都必须去这张表找虚拟地址的入口。为了加快查找表上这些入口的速度,CPU维护了一块缓存叫做:Translation Look-Aside Buffer (TLB)
TLB的工作方式类似于SQLSERVER的执行计划缓存,只要一个入口曾经被转译过下次就不需要再次转译,大页的好处是提高TLB命中率,减少内核cpu消耗。
知道这个,就很容易去理解大的页面和小的页面对性能的差别。当一个进程的虚拟地址空间(VirtualAddressSpace,VAS)(每个进程只有一个虚拟地址空间,
虚拟地址空间=一个进程使用的内存)是由小的内存页面构成的,那么在页面描述符表里的入口就需要相应增加,同时TLB缓存的入口数也会相应增加。
举个例子,有几个虚拟地址空间需要被缓存,使用小页面(一个页面4KB)就需要在TLB中缓存更多的入口。更多的入口意味着无论什么时候接收到
一个新的转译请求,TLB的入口缓存就需要更多去循环利用。因此使用大页面去分配虚拟地址空间在性能上会有一定的提升。

大的页面2MB大小,小的页面4KB大小,比如一个进程需要8MB内存,那么需要4个大页面或者2000个小页面
所以使用小页面来分配虚拟地址空间,就需要在TLB缓存更多的入口,但是TLB缓存的大小是有限的!!
页面分配和SQLSERVER
就像我早前提到过的跟踪标志834,834跟踪标志会强迫SQLSERVER进程虚拟地址空间使用大页面去构建Buffer Pool。这个跟踪标志
只能在64位SQLSERVER企业版,并且需要开启 Lock Pages in Memory功能才能使用。
当SQLSERVER使用大页面分配的时候,在SQL服务启动时入口信息会被记录在SQL ERRORLOG里
Large Page Extensions enabled.
Large Page Granularity: 2097152
Large Page Allocated: 32MB
Using large pages for buffer pool.
10208 MB of large page memory allocated.
如果SQLSERVER帐户没有Lock Pages in Memory的权限,就会在SQL ERRORLOG里记录下错误信息
Cannot use Large Page Extensions: lock memory privilege was not granted.
这篇文章非常友好地阐述了大页面分配和阐述了需要使用跟踪标志834 并使用64位SQLSERVER企业版才能使用大页面分配
注意:(1)不能在SQLSERVER运行的过程当中指定跟踪标志834
DBCC TRACEON(834,-1)
正在忽略跟踪标志 834。该跟踪标志无效,或者只能在服务器启动过程中指定。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
只能在SQLSERVER启动的时候加上启动参数:834
(2)如果SQLSERVER的《max server memory》选项被设置为0,当SQLSERVER启动的时候会占用整个服务器的所有物理内存
(3)服务器需要有8GB或以上的物理内存和操作系统并且必须是企业版才能使用大页面分配
(4)可以使用下面SQL语句查看当前大页面分配的内存
SELECT large_page_allocations_kb ,
locked_page_allocations_kb
FROM sys.dm_os_process_memory

(5)如果系统符合大页面分配,并且开启了834跟踪标志,那么当SQLSERVER启动的时候会比较慢,可能需要几分钟时间
2009-06-04 14:20:31.14 Server Large Page Allocated: 32MB
2009-06-04 14:20:40.03 Server Using large pages for buffer pool.
2009-06-04 14:27:56.98 Server 2048 MB of large page memory allocated.
上面的时间显示SQLSERVER用了7分钟时间来分配页面
总结:
为什麽SQLSERVER启动的时候就占用了服务器的所有内存,其中的一个原因有可能是你开启了跟踪标志834符合SQLSERVER使用大页面分配虚拟地址空间的要求,并且设置《max server memory》选项为0
相关文章
SQL Server and Large Pages Explained….
http://www.cnblogs.com/MYSQLZOUQI/p/5335649.html
如有不对的地方,欢迎大家拍砖o(∩_∩)o
2014-5-25补充
SQLSERVER2012新的内存管理器支持分配所有的大小。single page allocator和multi-page allocator都将退出历史舞台
不论分配多大的内存大小,内存管理器都只有三种不同的内存模型:
1、普通页
2、锁定页(locked pages,意思即是说通过设置组策略锁定内存页功能,把页面锁定在内存)
3、大内存页(large pages)
上面3种页面在SQLSERVER启动的时候ERROR LOG里都会打印出来,当前使用的是哪种模式的内存
大内存页的使用只存在于64位版的SQL Server中
1、新的内存管理器是完全支持NUMA的
2、虚拟地址空间的管理是完全动态的,特别是对32位的实例也是如此
3、内存管理器分配出去的内存都受max server memory控制
4、32位实例不再支持AWE
32位的SQLSERVER2012只能使用4GB物理内存,如果你需要使用更多的物理内存,必须要升级到64位版本

实际上,跑在Linux上的Oracle也有这个问题,在Linux上开启huge page/large page的方法
1、/etc/sysctl.cnf 中增加vm.nr_hugepages参数来为大页设定一个合理的值,值的单位为2MB,需要重启Linux
2、echo 一个值到/proc/sys/vm/nr_hugepages中也可以临时性的对大页进行设定
具体参考:http://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=403265328&idx=1&sn=b852e6ba4669c787de352c9823d05139&scene=0#wechat_redirect
本文版权归作者所有,未经作者同意不得转载。
配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations的更多相关文章
- Ubuntu上配置SQL Server Always On Availability Group(Configure Always On Availability Group for SQL Server on Ubuntu)
下面简单介绍一下如何在Ubuntu上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的填充方法. 目前在Linux上可以搭 ...
- Configure Always On Availability Group for SQL Server on RHEL——Red Hat Enterprise Linux上配置SQL Server Always On Availability Group
下面简单介绍一下如何在Red Hat Enterprise Linux上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的 ...
- 配置SQL Server on Linux(2)
1. 前言 前一篇配置SQL Server on Linux(1),地址:http://www.cnblogs.com/fishparadise/p/8125203.html ,是关于更改数据库排序规 ...
- 在Spring中配置SQL server 2000
前言 Lz主要目的是在Spring中配置SQL server 2000数据库,但实现目的的过程中参差着许多SQL server 2000的知识,也包罗在本文记载下来!(Lz为什么要去搞sql serv ...
- Configure Always On Availability Group for SQL Server on Ubuntu——Ubuntu上配置SQL Server Always On Availability Group
下面简单介绍一下如何在Ubuntu上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的填充方法. 目前在Linux上可以搭 ...
- 配置sql server 2000以允许远程访问 及 连接中的四个最常见错误
地址:http://www.cnblogs.com/JoshuaDreaming/archive/2010/12/01/1893242.html 配置sql server 2000以允许远程访问适合故 ...
- 配置SQL Server 2008 R2 Reporting Services
记录如何在本地配置SQL Server 2008 R2 Reporting Services,笔者环境为Windows 7 64位 + SQL Server 2008 R2 一.准备工作 其实准备工作 ...
- 配置SQL Server 2008服务器
怎么配置SQL Server 2008服务器_百度经验 http://jingyan.baidu.com/article/9faa7231a922c1473c28cb23.html 1.验证安装是否成 ...
- 第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护
本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/ ...
随机推荐
- Java面向对象的思想
面向对象的思想 1.面向对象的思想的特点: ①符合人们的日常思考习惯 ②能将复杂的问题简单化 ③将原来的执行者变为了现在的指挥者 面向对象的思想,所谓的对象,其实就是实体.对于实物的描述,通常有两个方 ...
- frame中隐藏横向滚动条
设置frame的scrolling="yes",在右侧页面的body里加入: style="overflow-x:hidden;" 如:<body st ...
- python基础知识---变量
一.变量是什么? python变量是对内存中一个数据结构的引用,用一个变量给另外一个变量赋值,那就有两个变量引用同一个数据结构(数字.字符串.列表.元组.字典.自定义对象等) 当一个数据结构的引用计数 ...
- bootstrap分页插件--Bootstrap Paginator的使用&AJAX版备份(可单独使用)
html部分: <ul class="pagination"></ul> <!--bootstrap3版本用ul包裹--> <div cl ...
- vc++ basic chapt1
______API 和SDK _像c程序可以调用各种函数库一样, windows操作系统提供应用程序编程的接口application programming interface简称API函数. 所以主 ...
- Ubuntu下搭建Android编译环境
Ubuntu一台新机器的一些环境搭建新增一个3TB的硬盘,挂载方法,大于2TB的得parted来进行分区1: sudo parted /dev/sda2: mklabel gpt3: unit TB4 ...
- POJ 1873 - The Fortified Forest 凸包 + 搜索 模板
通过这道题发现了原来写凸包的一些不注意之处和一些错误..有些错误很要命.. 这题 N = 15 1 << 15 = 32768 直接枚举完全可行 卡在异常情况判断上很久,只有 顶点数 &g ...
- 一步一步写平衡二叉树(AVL树)
平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...
- 51单片机ALE引脚的控制(摘录)
ALE/PROG: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节. 在FLASH编程期间,此引脚用于输入编程脉冲. 在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频 ...
- ubuntu 16.04软件源
来源:模板:16.04source deb http://cn.archive.ubuntu.com/ubuntu/ xenial main restricted universe multive ...