将脏页写回磁盘
'SQLServer:Buffer Manager\Page writes/sec' :Number of physical database page writes issued per second
我们可以通过这个性能计数器(下文中简称PW)来观察SQLSERVER何时会将脏页(这里不包含日志)写回磁盘。文中讨论的脏页均为数据页,不包含脏日志(虽然SQLSERVER认为日志也是脏的…)
-
Checkpoint: Checkpoint发生是,SQLSERVER会将脏页(包含了未提交事务脏页和已提交事务的脏页)写回磁盘。 Checkpoint的作用是缩短数据库恢复(recovery)的时间和提升磁盘性能。如果我们禁止了checkpoint(traceflag 3505),会发现PW降低很多,有些时候甚至会变成0,相应的磁盘IO也会减少。 所以如果数据文件的磁盘的IO写操作存在瓶颈(确定这是磁盘的瓶颈而不是其它因素引起的),可以尝试降低Checkpoint发生的频率(recovery interval(min)选项).世界上没有免费的午餐,这样做的后果就是数据库RECOVERY时间会相应的变长。
下面的图例反映了Checkpoint和PW的关系。我在12:00AM将recovery interval(min)设置成了60,可以看到,PW的值有了明显的下降.. 如果查看磁盘写相关的性能计数器,您也会发现这些性能计数器的数值有明显下降,在某些情况下数值甚至会变成0!. 在2:20pm和5:00pm时,PW也随着checkpoint迅速上升
-
Lazywriter:lazywriter运行时,如果检测到freeing memory buffers低于某个值(和buffer pool整体的小有关),会根据LRU算法将符合条件的数据页置换到free buffer,如果这些数据页是脏页,则也会将他们踢回硬盘。 Lazywriter在遇到内存压力时才会出现上述行为,上图中的PW没有归零,就是因为Lazy writer不停将脏页写回磁盘。我们可以通过Soft-NUMA来控制lazy wirter(http://blogs.msdn.com/b/psssql/archive/2010/04/02/how-it-works-soft-numa-i-o-completion-thread-lazy-writer-workers-and-memory-nodes.aspx)
-
Eagerwriter:当数据库的恢复模式处于bulk_logged/simple时,如果执行bulk operations,Eagerwriter会将数据页(脏页)迅速写回磁盘,对应的PW也会急剧上升。
从以下可以看出,checkpoint并没有发生,lazywriter的数值也为0,但是PW的数值很高,这是因为当时发生了bulk operation的操作。
我们也可以通过其它性能计数器的数值来观察SQLSERVER将脏页写回磁盘时的行为
例如
Avg.disk sec/Write
Avg.disk sec/Read
Disk writes/sec