在SQLSERVER运行过程中,事务日志的写入性能直接影响整体吞吐。使用Procmon.exe可以很方便地观察到sqlservr.exe对日志文件的写行为,并获取每次logwrite操作的大小。下面介绍具体做法。

一、准备Procmon工具
首先从微软官方获取Procmon.exe(Process Monitor),以管理员身份运行。启动后会自动开始捕获,先点击工具栏的放大镜图标暂停捕获,清理已有数据。
二、设置过滤条件
点击菜单 Filter - Filter,添加以下规则,只保留SQLSERVER进程相关的日志写操作:
- Process Name is sqlservr.exe
- Operation is WriteFile
- Path contains LDF
将这三个条件用AND连接,然后点击 Apply。这样Procmon就只会显示sqlservr.exe对日志文件(LDF)的写动作。
三、开始监视并查看logwrite大小
点击放大镜恢复捕获,在数据库里执行一些写入操作,例如插入或更新数据。随后在Procmon列表里就能看到对应的WriteFile事件。
在列表的 Detail 列中,会显示类似下面的信息:
Offset: 123456, Length: 8192, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O
其中的 Length 就是这一次 logwrite 的大小,单位字节。你可以根据 Length 列排序,观察是否存在特别大或特别小的写入。
四、用脚本辅助统计
如果捕获数据较多,可导出为CSV后用脚本统计。例如用Python读取并输出大小分布:
import csv
from collections import Counter
sizes = []
with open('procmon_export.csv', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
# Detail示例中Length: 8192
detail = row.get('Detail', '')
if 'Length: ' in detail:
try:
length = int(detail.split('Length: ')[1].split(',')[0])
sizes.append(length)
except:
pass
counter = Counter(sizes)
for size, count in sorted(counter.items()):
print('logwrite大小:', size, '次数:', count)
五、注意事项
生产环境使用Procmon会有一定性能开销,建议短时抓取。另外,SQLSERVER的日志写可能经过系统缓存,若需看物理写,可将过滤中的 I/O Flags 也纳入判断。通过上述方法,就能清楚地用Procmon.exe监视SQLSERVER的logwrite大小。