3. 服务器硬件与存储规划

SQL Server 的性能上限,往往在操作系统安装之前就已经被硬件决定了。CPU 决定并发计算与查询编译能力,内存决定数据缓存命中率与计划缓存稳定性,磁盘与 IO 子系统决定数据读写、日志写入和 TempDB 的响应速度。本节围绕“如何选、如何算、如何验证”展开,给出可落地的选型思路与容量估算方法。

一、CPU 选型:看核数,更要看主频与授权成本

SQL Server 是典型的“多核受益、但单线程敏感”的数据库。OLTP 场景中大量短事务、小结果集查询依赖单核主频,核数过多而主频过低反而会让单条语句变慢;OLAP 或批量处理场景则更依赖并行度,核数越多并行扫描越快。因此选型第一步是判断业务负载类型。

实际选型时建议关注三个参数:物理核心数、基础主频、L3 缓存。以一台双路服务器为例,若选择 2 颗 16 核 2.8GHz 的 CPU,则物理核心 32 个,SQL Server 默认可用的逻辑处理器为 32(关闭超线程)或 64(开启超线程)。对于 OLTP 系统,建议关闭超线程或仅使用物理核,避免逻辑核争抢导致上下文切换开销;对于以并行查询为主的数仓,可保留超线程以提升吞吐。

授权成本是另一个关键约束。SQL Server 企业版按核心授权,最低 4 核起售。若业务峰值仅需 16 核,却采购 64 核,授权费用会成倍增加。因此推荐做法是:先按业务并发与 TPS 估算所需核心数,再预留 30% 左右余量,而不是盲目堆核。

二、内存规划:把“数据缓存”和“计划缓存”算清楚

SQL Server 的内存主要分为 Buffer Pool(数据页缓存)、Plan Cache(执行计划缓存)、Workspace Memory(排序/哈希等操作内存)以及操作系统保留内存。Buffer Pool 是最大头,直接决定物理读次数。容量估算的核心是:让热数据尽量常驻内存。

估算公式可简化为:建议内存 = 热数据量 × 1.2 + 计划缓存预留 + 操作系统保留。例如某订单库总数据量 800GB,但近 90 天热数据约 200GB,则 Buffer Pool 至少需要 240GB;计划缓存按并发语句数量预留 8~16GB;操作系统保留 8~16GB。合计建议配置 256GB~288GB 内存。若服务器最大内存为 256GB,则需通过归档冷数据或分区切换降低热数据量。

配置时还需注意:SQL Server 默认会尽可能占用内存,应通过“最大服务器内存”限制,为操作系统和其他进程留出空间。一般建议保留 10%~15% 或至少 8GB。同时开启“锁定内存页”可避免 Buffer Pool 被换出到页面文件。

三、磁盘与 IO 子系统:按数据文件、日志文件、TempDB 分离设计

磁盘规划的第一原则是“分离”:数据文件、日志文件、TempDB 应放在不同的物理卷或 LUN 上,避免顺序写日志与随机读数据互相干扰。第二原则是“按 IO 特征选介质”:数据文件以随机读为主,适合 SSD 或高性能 SAS;日志文件以顺序写为主,对延迟敏感,适合低延迟 SSD;TempDB 写入频繁,建议独立 SSD 并做多文件。

容量估算需同时考虑当前数据量、增长率和备份空间。以某业务库为例:当前数据 500GB,年增长 40%,保留 3 年,则数据文件需预留 500×1.4³≈1372GB,加上索引和碎片空间,建议数据卷 1.8TB。日志文件按最大事务量估算,若单批导入产生 20GB 日志,则日志卷至少 60GB 并开启自动增长。TempDB 建议按 CPU 核数配置 4~8 个等大文件,每个文件初始 8GB,避免自动增长争抢。

SQL Server 硬件与 IO 子系统规划关系图 CPU 子系统 物理核数 / 主频 / L3 OLTP:高主频优先 OLAP:多核并行优先 内存子系统 Buffer Pool 热数据缓存 Plan Cache 计划缓存 OS 保留 10%~15% 磁盘与 IO 子系统 数据文件:随机读 SSD 日志文件:顺序写低延迟 TempDB:独立多文件 存储连接 SAN / iSCSI / NVMe 多路径 MPIO 队列深度与延迟 容量估算示例(假设业务库:当前数据 500GB,年增长 40%,保留 3 年) 数据文件容量 500 × 1.4³ ≈ 1372GB 建议卷容量 1.8TB 日志文件容量 按最大事务量估算 示例:单批 20GB → 卷 60GB TempDB 容量 按 CPU 核数配 4~8 个文件 每文件初始 8GB 等大 上线后关键验证指标 Page Life Expectancy 建议 > 300 秒 磁盘读延迟 数据盘 < 10ms 日志写延迟 建议 < 5ms CPU 使用率 持续 < 70%

四、IO 子系统:延迟比吞吐更值得关注

很多团队只关注磁盘吞吐(MB/s),却忽略了延迟。SQL Server 对随机读延迟非常敏感:数据盘读延迟超过 20ms,查询就会明显变慢;日志盘写延迟超过 5ms,事务提交就会排队。因此选型时应优先看 IOPS 和延迟指标,而不是单纯看容量。

以 32 核服务器为例,若 TempDB 需要支撑 5000 IOPS、数据盘需要 8000 IOPS、日志盘需要 3000 IOPS,则总 IOPS 需求约 16000。一块企业级 SAS SSD 约 20000 IOPS,两块做 RAID 1 后约 20000 IOPS,可满足需求;若使用 NVMe SSD,单块即可达到 500000 IOPS,但需注意 PCIe 通道数和散热。对于 SAN 存储,应确认 LUN 的队列深度和缓存命中率,避免多台数据库服务器争抢同一存储控制器。

五、配置样例与验证方法

以下是一台 32 核、256GB 内存、双路服务器的参考配置片段,用于说明关键参数如何落地:

-- 限制最大服务器内存为 220GB,保留 36GB 给操作系统
EXEC sp_configure 'max server memory (MB)', 225280;
RECONFIGURE;

-- 开启锁定内存页(需在 OS 策略中授予 Lock Pages in Memory 权限)
EXEC sp_configure 'locked pages', 1;
RECONFIGURE;

-- 查看当前 Buffer Pool 与计划缓存使用情况
SELECT
    counter_name,
    cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Page life expectancy', 'Buffer cache hit ratio')
   OR counter_name LIKE '%Plan Cache%';

上线后应重点观察四个指标:Page Life Expectancy 持续低于 300 秒说明 Buffer Pool 不足;Buffer Cache Hit Ratio 低于 95% 说明物理读偏多;磁盘读延迟超过 10ms 或日志写延迟超过 5ms 说明 IO 子系统存在瓶颈;CPU 使用率持续超过 70% 且伴随 SOS_SCHEDULER_YIELD 等待,说明核心数或主频不足。根据这些信号,再决定是加内存、换 SSD 还是调整索引与查询。

容量估算不是一次性的,建议每季度根据数据增长率和性能计数器重新评估一次,并在虚拟化或云环境中特别关注“超分”带来的 IO 争抢。