服务覆盖:昆明·曲靖·玉溪·保山·昭通·丽江·普洱·临沧·楚雄·红河·文山·西双版纳·大理·德宏·怒江·迪庆

Windows Server磁盘IO性能榨取:从HDD到NVMe的优化全攻略

eycit 2026-04-19 -3 次阅读 系统安装
---

theme: default themeName: "默认主题" title: "Windows Server磁盘IO性能榨取:从HDD到NVMe的优化全攻略"


Windows Server磁盘IO性能榨取:从HDD到NVMe的优化全攻略

干运维这些年,见过太多因为磁盘IO瓶颈拖垮整个业务的案例。一台配置不错的服务器,CPU利用率只有30%,内存还剩一半,可数据库就是卡成狗——问题出在哪?磁盘没调优。

今天不谈虚的,直接上干货。从HDD机械盘到NVMe固态盘,把Windows Server的磁盘性能榨干。

先搞清楚你手上的盘是什么货色

打开任务管理器看磁盘响应时间,这个数字能说明很多问题:

  • HDD机械盘:5-20ms是正常范围,超过50ms就开始明显卡顿,飙到100ms以上基本可以判定磁盘扛不住了
  • SATA SSD:正常响应时间在0.1-1ms,超过5ms就不太对劲
  • NVMe SSD:正常情况下应该在0.05-0.5ms,超过2ms就要排查了

别光看响应时间,还得结合队列长度。Windows的PerfMon里`Avg. Disk Queue Length`这个计数器,数值超过磁盘数量的2倍就说明IO请求在排队等待。

还有个更直观的办法——直接测。CrystalDiskMark这工具用了好多年,参数设置上有讲究:

顺序读写测试:1GiB大小,队列深度1

随机读写测试:4KiB块大小,队列深度32(模拟高并发场景)

测试结果别只看最大速度,`4K随机读写`才是真实业务场景的反映。一块号称读写2000MB/s的NVMe,4K随机可能只有50MB/s,这才是日常性能天花板。

分区对齐——最容易忽略的性能杀手

这事儿说起来挺丢人,但确实见过不少生产环境的盘分区没对齐。什么叫对齐?简单说就是让分区的起始扇区是物理扇区大小的整数倍。现代硬盘基本都是4K物理扇区,你的分区起始偏移量也应该是4K对齐的。

怎么查?PowerShell一行命令:

Get-Partition | Select-Object DiskNumber, PartitionNumber, Offset, Size | Format-Table

看`Offset`这一列,拿这个值除以4096,能整除就是对齐了。比如Offset是1048576,除以4096等于256,整除——没问题。要是Offset是63个扇区开始的老分区,32256除以4096等于7.875,不对齐。

不对齐的后果是什么?每次读写操作可能跨越两个物理扇区,性能直接打个七八折。解决方法?重新分区呗,数据备份好,用Windows安装程序或diskpart重新来:

# diskpart命令

select disk 0 clean create partition primary align=1024 format fs=ntfs quick

那个`align=1024`就是指定1MB(1024KB)对齐,完全兼容4K扇区。

关掉那些吃磁盘的后台服务

Windows Server默认开的索引服务(Windows Search)在桌面版还有点用,在服务器上纯属多余。数据库服务器尤其讨厌这个——索引服务会频繁扫描数据库文件,造成不必要的IO。

关闭方法:

Stop-Service WSearch

Set-Service WSearch -StartupType Disabled

还有个容易忽略的:系统还原点。虽然Windows Server默认关闭,但有些从桌面版"升级"上来的系统可能还开着:

# 检查状态

vssadmin list shadows

禁用(C盘为例)

vssadmin delete shadows /for=C: /all

磁盘碎片整理计划任务也得看看,SSD上跑碎片整理纯属瞎折腾。Windows 10/Server 2016以后系统会自动识别SSD并改用TRIM优化,但计划任务还在,每周定时跑一次"优化"——虽说SSD上实际是TRIM操作,但也没必要这么频繁。改成每月一次或者手动触发就行。

虚拟内存放哪门学问

这事儿争议挺大,我的建议是:如果你的服务器有足够内存(64GB以上),虚拟内存设个2-4GB固定值就行,放系统盘没问题。

但如果内存紧张,或者跑内存大户(SQL Server、Exchange),虚拟内存位置就有讲究了。千万别放系统盘——系统盘本来就忙,再被页面文件频繁读写,雪上加霜。

调整方法:

控制面板 → 系统 → 高级系统设置 → 性能 → 高级 → 虚拟内存

或者用PowerShell(需要重启生效):

# 禁用C盘页面文件

$computerSystem = Get-WmiObject -Class Win32_ComputerSystem $computerSystem.AutomaticManagedPagefile = $false $computerSystem.Put()

删除C盘页面文件

$pageFile = Get-WmiObject -Class Win32_PageFileSetting -Filter "SettingID='pagefile.sys @ C:'" if ($pageFile) { $pageFile.Delete() }

在D盘创建固定大小的页面文件

Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{Name="D:\pagefile.sys"; InitialSize=4096; MaximumSize=4096}

实际操作中,我会把页面文件放在单独的物理磁盘上,最好别跟数据库文件、日志文件抢盘。

SSD的TRIM和GC——别让固态盘变"固态"

机械盘用久了会碎片化,SSD用久了会"脏"——删除数据不是真删,只是标记为无效。这些无效数据块积累多了,写入性能就会掉。

TRIM命令就是告诉SSD哪些数据块可以擦除了。Windows从7开始就支持TRIM,Server 2012以后默认开启。验证一下:

# 检查TRIM状态

fsutil behavior query DisableDeleteNotify

返回0表示TRIM已启用

如果返回1,手动开启:

fsutil behavior set DisableDeleteNotify 0

手动触发TRIM(会释放所有无效块):

# 方法1:通过优化驱动器工具

Optimize-Volume -DriveLetter C -Trim -Verbose

方法2:通过计划任务触发

Get-ScheduledTask -TaskName "Microsoft\Windows\Defrag\ScheduledDefrag"Start-ScheduledTask

有些企业级SSD支持"强制GC"功能,在空闲时主动回收无效块。这个功能通常在SSD厂商的管理工具里开启,比如Intel的SSD Toolbox、Samsung Magician等。

RAID选型——别被速度忽悠了

RAID选型看三个指标:容量利用率、读性能、写性能。

RAID 0:快是真快,死也是真死。一块盘挂了全盘完蛋,生产环境别用。 RAID 1:两块盘做镜像,读性能翻倍(能并发读),写性能不变。容量利用率50%。适合操作系统盘、关键业务的小规模数据库。 RAID 5:至少3块盘,一块盘的容量做校验。读性能好(N-1倍并发读),写性能有校验计算开销。一块盘挂了能重建,但重建期间性能暴跌,第二块再挂就完了。 RAID 10:RAID 1+0,先镜像再条带。读性能N/2倍,写性能N/2倍,容量利用率50%。成本高但性能和安全性都靠谱,数据库首选。 RAID 6:双校验,能同时挂两块盘。写性能比RAID 5还差(双重校验计算),适合"写入少、存储久"的场景,比如备份归档。

我的经验:数据库用RAID 10,文件服务器用RAID 5或RAID 6,系统盘RAID 1就够了。

存储池——Windows自带的软RAID

Windows Server 2012开始有了存储池(Storage Spaces),类似Linux的LVM+RAID组合。好处是灵活,坏处是性能比硬件RAID卡差一截。

简单配置示例:

# 查看可用磁盘

Get-PhysicalDisk

创建存储池(用所有可用磁盘)

$disks = Get-PhysicalDiskWhere-Object CanPool -eq $true

New-StoragePool -FriendlyName "DataPool" -StorageSubSystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $disks

在存储池上创建虚拟磁盘(RAID 1镜像)

New-VirtualDisk -FriendlyName "DataVolume" -StoragePoolFriendlyName "DataPool" -ResiliencySettingName Mirror -Size 500GB -ProvisioningType Fixed

初始化并格式化

Get-VirtualDisk -FriendlyName "DataVolume"Get-DiskInitialize-Disk -PartitionStyle GPT

New-Volume -FriendlyName "Data" -FileSystem NTFS -ResizeFileSystem

存储池支持分层存储——把SSD和HDD放一个池里,系统自动把热点数据放到SSD层。配置时加个`-MediaType`参数指定即可:

# SSD做缓存层,HDD做容量层

New-StorageTier -FriendlyName "SSDTier" -MediaType SSD New-StorageTier -FriendlyName "HDDTier" -MediaType HDD

这功能看着很美,实际用下来感觉一般——缓存算法不如专业存储阵列智能,而且出了问题排查起来头大。小规模应用还行,重要业务还是老实用硬件RAID吧。

性能测试工具实战

光说不练假把式,最后说两个测试工具。

CrystalDiskMark:图形界面,适合快速验证。重点看4K随机和队列深度测试结果。

测试参数建议:

  • 测试次数:5次取平均
  • 测试大小:1GiB(太小会被缓存干扰)
  • 测试项目:全选,但重点关注4K Q32和顺序读写

fio:业界标准,灵活但门槛高。Windows版本需要从官网下载。

一个模拟数据库负载的fio配置:

[global]

name=random-rw-test filename=testfile size=10G time_based runtime=300 ioengine=windowsaio

[random-read] stonewall rw=randread bs=4k iodepth=32 numjobs=4

[random-write] stonewall rw=randwrite bs=4k iodepth=32 numjobs=4

运行命令:

fio --output-format=json --output=result.json config.ini

fio的结果报告很详细,重点看这几个指标:

  • IOPS:每秒IO操作数,数值越高越好
  • latency:延迟,看`clat`(完成延迟)的百分位数
  • 95th/99th percentile latency:最慢的5%和1%请求的延迟,这个比平均值更有参考价值

写在最后

磁盘性能优化不是一锤子买卖,需要持续监控。定期跑个基准测试对比历史数据,发现问题早处理。PerfMon抓数据、CrystalDiskMark跑测试,这套组合拳打得熟,磁盘性能问题基本能拿捏。

对了,优化别过头。见过有人把所有缓存、预读都关了,结果性能不升反降。Windows的IO调度算法调了这么多年,大部分情况下默认参数就挺合适。先把明显的问题解决了(分区对齐、索引服务、虚拟内存位置),再考虑精细调优。

【放心,我们兜底】

不管你是自己尝试修复,还是需要专业人员上门,易云城IT服务都给你托底。修不好不收费,修好了质保期内随时找我。

📞 服务热线:13708730161 💬 微信:eyc1689 📧 邮箱:service@eycit.com 🌐 https://www.eycit.com

您身边的IT专家。

上一篇
Linux内核参数调优:让Nginx并发能力从5千到5万...
下一篇
勒索病毒来了怎么办?中小企业应急响应完全手册...