把标准三层应用部署到Azure虚拟机时,D系列经常被当作默认规格。它挂着“通用型”的标签,价格适中,vCPU和内存比例均衡。但“通用”这个词很容易掩盖细节问题:vCPU到底是物理核还是超线程?临时盘能用来放数据库吗?磁盘缓存策略对随机写有多大影响?不实际压测一遍,很难判断手上的D系列实例是否真的适合当前业务。

本次评测选择一台D4s v3实例,规格为4 vCPU、16 GiB内存,系统盘使用P30 Premium SSD,数据盘使用P20 Premium SSD,操作系统为Windows Server 2022 Datacenter。测试脚本和工具全部放在C:\PerfLogs目录下,原始结果文件输出到C:\PerfLogs\Results,方便复现。
一、D系列实例规格与测试环境准备
D系列在Azure产品线中定位为通用计算,当前主流代际包括D v3、D v4以及最新的D v5。以D4s v3为例,其4个vCPU对应的是Intel Xeon Platinum 8272CL的超线程逻辑核心,并不是独立物理核。这意味着单核跑分时,vCPU只能拿到物理核大约一半的浮点资源,而在多线程场景下,超线程带来的提升通常不超过30%。内存方面,D系列保持每vCPU 4 GiB的比例,适合Web服务器、小型数据库、开发测试等负载。
准备测试环境时,先通过Azure CLI确认实例实际规格。下面这条命令可以输出当前虚拟机的vCPU数量和内存大小,避免因为自动缩放或迁移导致实际规格与预期不符。运行前需要把C:\PerfLogs目录创建好,日志文件会写入C:\PerfLogs\instance_check.log。
# 检查Azure VM规格 $vm = Get-AzVM -ResourceGroupName "rg-perf-test" -Name "d4sv3-node01" $size = $vm.HardwareProfile.VmSize Write-Output "Instance size: $size" # 输出CPU和内存信息到日志 Get-ComputerInfo | Select-Object CsProcessors, CsTotalPhysicalMemory | Out-File C:\PerfLogs\instance_check.log -Append
磁盘方面,D4s v3挂载了一块P30系统盘和一块P20数据盘。系统盘默认开启了ReadOnly缓存,数据盘默认无缓存。由于D系列支持本地临时盘,我们还会单独测试临时盘D:的裸性能,注意临时盘在重启后数据会丢失,不能存放持久化数据。网络层面开启了加速网络,这会让延迟从微秒级进一步降低,对SQL Server等短连接负载有明显帮助。
系统准备完成后,需要关闭Windows Defender实时扫描对测试目录的干扰。可以通过组策略或注册表临时调整,但更简单的方法是在测试期间使用PowerShell排除目录:
Add-MpPreference -ExclusionPath "C:\PerfLogs" Add-MpPreference -ExclusionPath "D:\Temp"
注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender下面的Exclusions键值不建议手动修改,用PowerShell命令更安全。
二、CPU与内存性能实测
CPU测试我们直接使用Cinebench R23作为综合基准,并配合Prime95做持续满载观察频率稳定性。D4s v3在Cinebench多核跑分中可以得到约4200分,单核约980分。对比同规格的本地物理服务器,多核成绩大约低15%左右。这是因为Azure对vCPU进行了时间片调度,当宿主机上其他租户负载较高时,单核性能会出现2%到5%的波动。这种波动在Web请求这类短任务中不明显,但在持续视频转码场景会累积。
内存带宽方面,D4s v3配备16 GiB内存,理论带宽约21 GB/s。使用AIDA64 Cache & Memory Benchmark测得实际读带宽18.7 GB/s,写带宽17.2 GB/s,复制带宽大约16.5 GB/s。这个成绩对通用负载完全够用,但如果跑内存数据库或大型数据分析,建议考虑E系列或M系列,它们的内存带宽更高。
为了贴近实际业务,我们还编写了一个PowerShell多线程脚本,模拟100个并发任务分别进行JSON序列化和字符串拼接,每个任务循环5000次。结果D4s v3完成总耗时约38秒,而一台同规格的本地虚拟机耗时约41秒,差距不大。这说明D系列在CPU密集但非持续满载的场景下,性能是可靠的。
# 模拟多线程CPU负载
$start = Get-Date
1..100 | ForEach-Object -Parallel {
$obj = [PSCustomObject]@{ Id = $_; Name = "user$_"; Data = (Get-Random) }
for ($i = 0; $i -lt 5000; $i++) {
$json = $obj | ConvertTo-Json
$text = $json + "suffix" + $i
}
} -ThrottleLimit 10
$end = Get-Date
Write-Output ("Total seconds: " + ($end - $start).TotalSeconds)
需要注意,PowerShell 7的ForEach-Object -Parallel默认最多5个运行空间,-ThrottleLimit设置为10可以增加并行度。测试结果会写入C:\PerfLogs\cpu_test.txt,如果目录不存在,脚本会报错,应先手动创建。
三、磁盘I/O与网络吞吐表现
磁盘性能是D系列容易被忽视的短板。系统盘P30提供5000 IOPS和200 MB/s的吞吐,数据盘P20提供2300 IOPS和150 MB/s。我们在Windows下使用diskspd工具,对D:临时盘、C:系统盘和数据盘E:分别进行4KB随机读写测试。命令如下:
diskspd.exe -c50G -d120 -w50 -b4K -o8 -t4 -h -L C:\PerfLogs\sysbench.dat > C:\PerfLogs\sysbench_results.txt
这里-c50G表示创建50GB测试文件,-w50表示50%写比例,-o8和-t4通过8个异步IO和4个线程加压。从结果看,临时盘D:的4KB随机写IOPS可以达到12000以上,但系统盘C:的4KB随机写只有约4800 IOPS,数据盘E:则在2300 IOPS上下波动。临时盘虽然性能高,但它是本地SSD,数据不持久,适合放页面文件或临时排序数据。
如果把系统盘缓存策略改为ReadWrite,随机写性能会明显提升。我们通过Azure门户把系统盘的Host Caching从ReadOnly改为ReadWrite,重新跑同样的测试,4KB随机写IOPS从4800提升到约7800,延迟也下降了35%。这是因为写入会先落到宿主机缓存,但代价是如果发生宿主机故障,未刷入磁盘的数据可能丢失。对于数据库日志盘不建议开启写缓存,除非业务允许极短时间的数据丢失。
网络吞吐测试使用ntttcp,在同一个虚拟网络内的另一台D4s v3上运行接收端。D4s v3的加速网络提供最高约4 Gbps的带宽。实测TCP单向吞吐达到3.7 Gbps,双向同时传输约6.5 Gbps。这个数据足以支撑中型Web应用和数据库复制流量。如果业务需要更高带宽,可以选择网络优化型实例或添加多块网卡,但要注意加速网络只在支持SR-IOV的规格上生效。
四、实际应用负载模拟与调优建议
我们把D4s v3部署为SQL Server 2019数据库服务器,使用sqlbench模拟100个并发OLTP连接,每个连接执行2000次事务。在系统盘缓存为ReadOnly时,平均事务响应时间约28毫秒,吞吐量约3600 TPS。把数据文件迁移到临时盘D:后,响应时间降到19毫秒,TPS提升到5100。但临时盘重启后数据会丢失,所以只能用来做测试或临时数据分析。
对于正式业务,建议数据文件放在Premium SSD数据盘上,并考虑使用存储池将多块数据盘条带化,以突破单盘IOPS上限。比如把三块P20数据盘组成简单存储池,随机写IOPS可以从2300线性扩展到约6800。下面PowerShell命令展示如何创建存储池:
$disks = Get-PhysicalDisk | Where-Object MediaType -eq "SSD" | Select-Object -First 3 New-StoragePool -FriendlyName "AzureDataPool" -PhysicalDisks $disks -StorageSubSystemFriendlyName "Windows Storage*" | Out-Null New-VirtualDisk -StoragePoolFriendlyName "AzureDataPool" -FriendlyName "DataVHD" -ResiliencySettingName Simple -UseMaximumSize | Out-Null Initialize-Disk -Number (Get-Disk | Where-Object FriendlyName -eq "DataVHD").Number -PartitionStyle GPT New-Partition -DiskNumber (Get-Disk | Where-Object FriendlyName -eq "DataVHD").Number -UseMaximumSize -AssignDriveLetter F | Out-Null Format-Volume -DriveLetter F -FileSystem NTFS -NewFileSystemLabel "DataPool" -Confirm:$false
如果应用层对延迟敏感,建议关闭Windows写缓存刷新,在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management下调整DisablePagingExecutive为1,并保持系统页面文件在临时盘。这些调整能减少不必要的磁盘写操作,提升整体响应速度。
综合来看,D系列实例适合运行Web前端、中小型API服务、开发测试环境和轻量数据库。它的CPU和内存表现稳定,网络性能在加速网络加持下也足够优秀,但磁盘I/O需要根据缓存策略和条带化方案仔细规划。如果业务以高IOPS为核心,E系列或带本地NVMe的L系列会是更好的选择。对于预算有限的中小型业务,D系列仍然是性价比非常高的通用计算底座。