1. ESSD云盘
阿里云ESSD(Enterprise SSD)云盘结合25 GE网络和RDMA技术,为您提供单盘高达100万的随机读写能力和单路低时延性能。本文介绍了ESSD云盘的性能级别、适用场景及性能上限,提供了选择不同ESSD云盘性能级别时的参考信息。
ESSD云盘属性 | 性能级别PL | 性能级别PL | 性能级别PL | 性能级别PL |
---|---|---|---|---|
PL3 | PL2 | PL1 | PL0 | |
性能描述 | 并发极限I/O性能极高,读写时延极稳定。 | 并发极限I/O性能较高,读写时延稳定。 | 并发极限I/O性能中等,读写时延较为稳定。 | 并发极限I/O性能中等,读写时延较为稳定。 |
云盘容量范围(GiB) | 1,261~65,536 | 461~65,536 | 20~65,536 | 1~65,536 |
单盘最大IOPS(Input/Output Operations Per Second) | 1,000,000 | 100,000 | 50,000 | 10,000 |
单盘最大吞吐量(MB/s) | 4,000 | 750 | 350 | 180 |
单盘IOPS性能计算公式 | min{1800+50*容量, 1000000} | min{1800+50*容量, 100000} | min{1800+50*容量, 50000} | min{1800+12*容量, 10000} |
单盘吞吐量性能计算公式(MB/s) | min{120+0.5*容量, 4000} | min{120+0.5*容量, 750} | min{120+0.5*容量, 350} | min{100+0.25*容量, 180} |
业务场景示例 | 中大型核心业务关系型数据库及NoSQL数据库,大型SAP和Oracle系统。 | 中等规模的关系型数据库、NoSQL数据库、中等规模的ELK日志集群、SAP和Oracle等企业级商用软件。 | 中小型MySQL和SQLServer等数据库场景,中小规模ELK日志集群,SAP和Oracle等企业级商用软件,容器应用。 | 中小型MySQL和SQLServer等数据库场景,中小规模ELK日志集群,SAP和Oracle等企业级商用软件,容器应用。 |
在推荐业务场景下,这些产品的系统盘或数据盘建议替换为ESSD云盘。 | 16核vCPU以上本地SSD实例规格族(i1、i2、i2g)的数据盘 | SSD云盘,本地SSD实例规格族(i1、i2、i2g)的数据盘 | SSD云盘 | 系统盘 |
1.1 测试性能
测试工具:使用FIO。
FIO(Flexible I/O Tester)是一个开源的、强大的I/O性能测试工具,可以用来对存储设备进行随机读写、顺序读写等负载测试。
1.部署
yum install libaio libaio-devel fio -y
yum install libaio libaio-devel fio -y
2.测试
bash
function RunFio
{
numjobs=$1 # 实例中的测试线程数,例如示例中的10
iodepth=$2 # 同时发出I/O数的上限,例如示例中的64
bs=$3 # 单次I/O的块文件大小,例如示例中的4k
rw=$4 # 测试时的读写策略,例如示例中的randwrite
size=$5
filename=$6 # 指定测试文件的名称,例如示例中的/dev/your_device
nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l`
if [ $nr_cpus -lt $numjobs ];then
echo “Numjobs is more than cpu cores, exit!”
exit -1
fi
let nu=$numjobs+1
cpulist=""
for ((i=1;i<10;i++))
do
list=`cat /sys/block/your_device/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','`
if [ -z $list ];then
break
fi
cpulist=${cpulist}${list}
done
spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}`
echo $spincpu
fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --size=${size} --rw=${rw} --filename=${filename} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split
}
echo 2 > /sys/block/your_device/queue/rq_affinity
sleep 5
RunFio 10 128 4k randwrite 1024g /dev/your_device
function RunFio
{
numjobs=$1 # 实例中的测试线程数,例如示例中的10
iodepth=$2 # 同时发出I/O数的上限,例如示例中的64
bs=$3 # 单次I/O的块文件大小,例如示例中的4k
rw=$4 # 测试时的读写策略,例如示例中的randwrite
size=$5
filename=$6 # 指定测试文件的名称,例如示例中的/dev/your_device
nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l`
if [ $nr_cpus -lt $numjobs ];then
echo “Numjobs is more than cpu cores, exit!”
exit -1
fi
let nu=$numjobs+1
cpulist=""
for ((i=1;i<10;i++))
do
list=`cat /sys/block/your_device/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','`
if [ -z $list ];then
break
fi
cpulist=${cpulist}${list}
done
spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}`
echo $spincpu
fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --size=${size} --rw=${rw} --filename=${filename} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split
}
echo 2 > /sys/block/your_device/queue/rq_affinity
sleep 5
RunFio 10 128 4k randwrite 1024g /dev/your_device
- 请将所有
your_device
设置为ESSD云盘实际的设备名,例如nvme1n1。 - 根据实际情况设置
RunFio 10 64 4k randwrite /dev/your_device
中的10、64、4k、randwrite和*/dev/your_device*。 - 如果云盘上的数据丢失不影响业务,可以设置
filename=[设备名,例如/dev/vdb]
;否则,请设置为filename=[具体的文件路径,例如/mnt/test.image]
。
- 执行
bash
sh st100w.sh
sh st100w.sh
- 参数说明
rq_affinity取值 | 取值说明 |
---|---|
1 | 表示块设备收到I/O完成(I/O Completion)的事件时,这个I/O被发送回处理这个I/O下发流程的vCPU所在Group上处理。在多线程并发的情况下,I/O Completion就可能集中在某一个vCPU上执行,造成瓶颈,导致性能无法提升。 |
2 | 表示块设备收到I/O Completion的事件时,这个I/O会在当初下发的vCPU上执行。在多线程并发的情况下,就可以充分发挥各个vCPU的性能。 |
2. BPS和IOPS
BPS(每秒字节数)和IOPS(每秒输入/输出操作数)
2.1 bps和iops增高
- 高负载应用或服务:
- 如果服务器上运行的应用或服务(如数据库、文件服务器等)突然接收到大量请求,可能会导致BPS和IOPS的增加。检查应用日志和监控数据,确定是否有异常流量或请求模式。
- 内存不足:
- 当服务器内存不足时,系统可能会使用磁盘作为虚拟内存(swap),这会导致磁盘I/O显著增加。检查内存使用情况,考虑增加内存资源或优化内存使用。
- 磁盘空间不足:
- 磁盘空间不足可能导致系统频繁地进行磁盘整理,从而增加IOPS。清理不必要的文件或增加磁盘空间可以解决这个问题。
- 数据库优化问题:
- 数据库查询效率低下或索引问题可能导致高IOPS。检查数据库性能,优化查询语句和索引。
- 系统或应用更新:
- 系统或应用的自动更新可能会在后台进行大量数据读写操作。检查更新日志,确认是否有更新活动。
- 硬件问题:
- 硬件故障(如磁盘损坏)也可能导致IOPS异常。检查硬件状态,必要时更换故障硬件。
- 安全问题:
- 服务器可能遭受攻击,如DDoS攻击,导致资源使用率异常。检查安全日志,采取相应的安全措施。
- 配置问题:
- 错误的系统或应用配置可能导致资源使用效率低下。检查配置文件,进行必要的调整。