问题场景
今天收到一台数据库服务器的磁盘空间告警邮件,如下所示,C盘总共60G,只剩下3.13G大小空间,Free Rate 为5.22%。
因为msdb、tempdb等系统数据库都不在系统盘(C盘),对于突然出现的系统盘磁盘空间不足,感觉有点奇怪,想了解一下到底是什么原因导致这种情况出现。于是用TreeSize 工具扫描了一下C盘,除了目录C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLLog下将近600M的错误日志文件,罪魁祸首居然是虚拟内存页面文件pagefile.sys,居然有36G大小,而整个系统盘只分配了60G大小的空间。如下图所示:
其实,关于虚拟内存页面文件的设置,公司的文档是有明确规定的:
When a SQL Server is configured correctly, it doesn’t use the page file for memory. In theory, we don’t need a page file at
all. Properly configure the Page File settings
a. Ensure the sum of all page files is equal to the amount of memory in server.
b. Do not let the system manager your page file.
c. Ensure the Initial Size and Maximum Size have the same settings.
只是我一直忽略了这个,不大关心服务器的虚拟内存配置,因为公司DBA与系统管理员是职责分明的,只是突然发现这台服务器设置有些异常,原因在于这台服务器RAM 为32G,但是关于虚拟内存的配置是自动管理驱动器的分页文件大小。如下所示
可以看到虚拟内存页面文件pagefile.sys全部位于C盘,让系统自动管理其大小,所以才会出现pagefile.sys增长到36G大小,同事给予的建议是将虚拟内存设置为32G,C、D、E、F四个盘设置4个虚拟内存页面文件,每个文件初始大小为8G,最大大小也为8G。这样可以达到最佳优化配置。
网上关于虚拟内存的优化方法,其实是上面关于虚拟内存配置的详细解释:
1、分割存于多个硬盘
将虚拟内存设在较快的硬盘上,的确可使虚拟内存的运作更有效率。但是若电脑上两个硬盘速度一样快,则应将虚拟内存平均分配在两个不同的硬盘上(并非同一硬盘的不同分区)。因为同步进行读写操作会更有效地提高系统整体的虚拟内存性能。例如,我将上面位于C盘的32G大小的虚拟内存文件,分为4份,每份8G大小置于C、D、E、F四个盘。理论上这样做会加快虚拟内存整体的读写操作.但是我没有一个好的测试案例来验证结果。
2、硬盘需有足够空间
如果你不是很有经验的电脑用户,又或者没有特殊的使用要求,在Windows XP中选择“系统管理的大小”的方法来自动处理虚拟内存,一般情况下应该会比选择“自定义大小”的方法来得安全和稳定。不过,有一点大家必须注意,由于虚拟内存的“页面文件”(pagefile.sys)会随着电脑使用过程进行收缩和扩展,为使系统管理虚拟内存能够进行得顺利和更具弹性,必须保证分页文件所在的硬盘拥有足够的可用空间。
3、最小值等于最大值
选择“自定义大小”的方法来处理虚拟内存,并将最大值和最小值都设为同一数值。有很多人都相信用这种方法来处理虚拟内存有助于提高系统的性能。他们所持的理由是,当最大值和最小值都相等时,系统无需时刻进行收缩和扩展页面文件的动作。省去了这些工作,相应地就是提高系统效率。
这种方法,很多人坚信有效,但同样地,也有人指出其实并没有效果。但不管怎样也好,如要将最大值和最小值设为相等,必须坚守一个原则,那就是虚拟内存的大小必须足够,否则系统轻则会出现效率下降(要进行更多复写动作来腾出空间),严重的更会造成系统不稳定。
参考资料:
http://blog.sina.com.cn/s/blog_4b47ed250100edpd.html
http://baike.baidu.com/view/724336.htm