RocketMQ生产实践全解析:从部署到调优的避坑指南
2026/10/14 11:19:52
-- ============================================= -- 参数配置区(修改这里即可) -- ============================================= DECLARE @thresholdPercent INT = 55; -- 缓冲池占进程内存的百分比阈值 DECLARE @lowMemoryMB INT = 10240; -- 临时调低的最大内存 (MB),10GB DECLARE @highMemoryMB INT = 18432; -- 最终恢复的最大内存 (MB),18GB DECLARE @waitSeconds INT = 60; -- 调低内存后等待的秒数(让SQL Server有时间释放内存) SET NOCOUNT ON; -- ============================================= -- 1. 获取当前内存指标 -- ============================================= -- 当前 max server memory 配置值 DECLARE @currentMaxMemory INT; SELECT @currentMaxMemory = CAST(value AS INT) FROM sys.configurations WHERE name = 'max server memory (MB)'; -- 缓冲池大小 (MB) DECLARE @bufferPoolMB INT; SELECT @bufferPoolMB = (COUNT(*) * 8) / 1024 FROM sys.dm_os_buffer_descriptors; -- SQL Server 进程占用物理内存 (MB) DECLARE @processMemoryMB INT; SELECT @processMemoryMB = physical_memory_in_use_kb / 1024 FROM sys.dm_os_process_memory; -- 计算缓冲池占比 DECLARE @ratio DECIMAL(5,2); IF @processMemoryMB > 0 SET @ratio = (@bufferPoolMB * 100.0) / @processMemoryMB; ELSE SET @ratio = 0; -- 输出当前状态(便于调试) PRINT '当前缓冲池大小: ' + CAST(@bufferPoolMB AS VARCHAR(20)) + ' MB'; PRINT '当前进程占用内存: ' + CAST(@processMemoryMB AS VARCHAR(20)) + ' MB'; PRINT '当前占比: ' + CAST(@ratio AS VARCHAR(10)) + '%'; PRINT '当前最大内存设置: ' + CAST(@currentMaxMemory AS VARCHAR(20)) + ' MB'; PRINT '配置参数 - 阈值: ' + CAST(@thresholdPercent AS VARCHAR(10)) + '%, 低内存: ' + CAST(@lowMemoryMB AS VARCHAR(20)) + ' MB, 高内存: ' + CAST(@highMemoryMB AS VARCHAR(20)) + ' MB'; -- ============================================= -- 2. 根据占比执行操作 -- ============================================= IF @ratio > @thresholdPercent BEGIN PRINT '占比超过 ' + CAST(@thresholdPercent AS VARCHAR(10)) + '%,执行清理并临时调低最大内存...'; -- 写入脏页并清空干净缓存 CHECKPOINT; DBCC DROPCLEANBUFFERS; -- 临时调低最大内存到最低值 IF @currentMaxMemory <> @lowMemoryMB BEGIN EXEC sp_configure 'max server memory (MB)', @lowMemoryMB; RECONFIGURE; PRINT '已将最大内存临时调整为 ' + CAST(@lowMemoryMB AS VARCHAR(20)) + ' MB。'; END ELSE BEGIN PRINT '最大内存已经是 ' + CAST(@lowMemoryMB AS VARCHAR(20)) + ' MB,无需调整。'; END -- 等待一段时间,让 SQL Server 有机会释放内存 -- 用 DATEADD + CONVERT 生成合法的 HH:MM:SS 格式,支持任意秒数(不再受 59 秒限制) DECLARE @delayStr NVARCHAR(20) = CONVERT(NVARCHAR(8), DATEADD(SECOND, @waitSeconds, CAST('00:00:00' AS TIME)), 108); DECLARE @delaySql NVARCHAR(100) = N'WAITFOR DELAY ''' + @delayStr + ''''; PRINT '等待 ' + CAST(@waitSeconds AS VARCHAR(10)) + ' 秒(' + @delayStr + '),让 SQL Server 释放内存...'; EXEC(@delaySql); -- 最终将最大内存恢复到高内存值 IF @highMemoryMB <> @lowMemoryMB BEGIN EXEC sp_configure 'max server memory (MB)', @highMemoryMB; RECONFIGURE; PRINT '已将最大内存恢复为 ' + CAST(@highMemoryMB AS VARCHAR(20)) + ' MB。'; END END ELSE BEGIN -- 占比小于等于阈值,确保最大内存为高内存 IF @currentMaxMemory <> @highMemoryMB BEGIN PRINT '占比小于等于 ' + CAST(@thresholdPercent AS VARCHAR(10)) + '%,将最大内存设置为 ' + CAST(@highMemoryMB AS VARCHAR(20)) + ' MB...'; EXEC sp_configure 'max server memory (MB)', @highMemoryMB; RECONFIGURE; PRINT '最大内存已设置为 ' + CAST(@highMemoryMB AS VARCHAR(20)) + ' MB。'; END ELSE BEGIN PRINT '占比小于等于 ' + CAST(@thresholdPercent AS VARCHAR(10)) + '%,最大内存已是 ' + CAST(@highMemoryMB AS VARCHAR(20)) + ' MB,无需调整。'; END END注意:
权限要求:需要sysadmin角色,因为涉及DBCC DROPCLEANBUFFERS和sp_configure。
部署方式:放入 SQL Server 代理作业,定点或者每多久运行一次(当占比超阈值时自动清理并降内存,占比回落后自动恢复高内存)。
性能提醒:DBCC DROPCLEANBUFFERS会清空数据缓存,可能导致后续查询短暂变慢,需根据业务情况评估执行频率。