Skip to content

Commit 8d5a72a

Browse files
committed
new doc
1 parent 729facf commit 8d5a72a

File tree

5 files changed

+355
-0
lines changed

5 files changed

+355
-0
lines changed

201912/20191228_02.md

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
## fio io测试阿里云ecs 本地ssd, essd性能 - 1
2+
3+
### 作者
4+
digoal
5+
6+
### 日期
7+
2019-12-28
8+
9+
### 标签
10+
PostgreSQL , fio , 阿里云 , local ssd , essd
11+
12+
----
13+
14+
## 背景
15+
https://help.aliyun.com/document_detail/147897.html
16+
17+
不同工具测试的硬盘基准性能会有差异,如dd、sysbench、iometer等工具可能会受到测试参数配置和文件系统影响,难以反映真实性能。本示例的性能参数,均为Linux系统下采用FIO工具的测试结果,以此作为块存储产品性能指标参考。Linux实例和Windows实例都推荐使用FIO工具测试块存储性能。
18+
19+
1、测试前,保障文件系统是4k对齐
20+
21+
```
22+
parted -a optimal -s /dev/vdj mklabel gpt mkpart primary 1MiB 100%FREE
23+
24+
mkfs.ext4 /dev/vdj1 -m 0 -O extent,uninit_bg -E lazy_itable_init=1 -b 4096 -T largefile -L vdj1
25+
26+
vi /etc/fstab
27+
LABEL=vdj1 /data02 ext4 defaults,noatime,nodiratime,nodelalloc,barrier=0,data=writeback 0 0
28+
29+
mkdir /data02
30+
31+
mount -a
32+
```
33+
34+
2、依次运行以下命令安装libaio和FIO。
35+
36+
```
37+
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
38+
39+
sudo yum install libaio –y
40+
sudo yum install libaio-devel –y
41+
sudo yum install fio -y
42+
```
43+
44+
## 普通云盘性能测试命令
45+
建议使用数据库的page size,或wal size来测。
46+
47+
1、随机写IOPS(单次io 4K):
48+
49+
```
50+
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Write_Testing
51+
```
52+
53+
2、随机读IOPS(单次io 4K):
54+
55+
```
56+
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing
57+
```
58+
59+
3、顺序写吞吐量(写带宽)(单次io 1024K):
60+
61+
```
62+
fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Write_PPS_Testing
63+
```
64+
65+
4、顺序读吞吐量(读带宽)(单次io 1024K):
66+
67+
```
68+
fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Read_PPS_Testing
69+
```
70+
71+
5、随机写时延(单次io 4K):
72+
73+
```
74+
fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=iotest -name=Rand_Write_Latency_Testing
75+
```
76+
77+
6、随机读时延(单次io 4K):
78+
79+
```
80+
fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=iotest -name=Rand_Read_Latency_Testingrandwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=iotest -name=Rand_Write_Latency_Testing
81+
```
82+
83+
## 本地盘性能测试命令
84+
以下测试命令仅适用于NVMe SSD本地盘。
85+
86+
1、随机写IOPS(单次io 4K):
87+
88+
```
89+
fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
90+
```
91+
92+
2、随机读IOPS(单次io 4K):
93+
94+
```
95+
fio -direct=1 -iodepth=32 -rw=randread -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
96+
```
97+
98+
3、顺序写吞吐量(写带宽)(单次io 128K):
99+
100+
```
101+
fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
102+
```
103+
104+
4、顺序读吞吐量(读带宽)(单次io 128K):
105+
106+
```
107+
fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
108+
```
109+
110+
5、随机写延迟(单次io 4K):
111+
112+
```
113+
fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
114+
```
115+
116+
6、随机读延迟(单次io 4K):
117+
118+
```
119+
fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
120+
```
121+
122+
7、顺序写延迟(单次io 4K):
123+
124+
```
125+
fio -direct=1 -iodepth=1 -rw=write -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
126+
```
127+
128+
8、顺序读延迟(单次io 4K):
129+
130+
```
131+
fio -direct=1 -iodepth=1 -rw=read -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/vdx -name=test
132+
```
133+
134+
## FIO参数取值说明
135+
136+
下表以测试云盘随机写IOPS(randwrite)的命令为例,说明各种参数的含义。
137+
138+
参数 |说明
139+
---|---
140+
-direct=1 |表示测试时忽略I/O缓存,数据直写。
141+
-iodepth=128 |表示使用异步I/O(AIO)时,同时发出I/O数的上限为128。
142+
-rw=randwrite |表示测试时的读写策略为随机写(random writes)。其它测试可以设置为:</br> randread(随机读random reads)</br> read(顺序读sequential reads)</br> write(顺序写sequential writes)</br> randrw(混合随机读写mixed random reads and writes)
143+
-ioengine=libaio |表示测试方式为libaio(Linux AIO,异步I/O)。应用程序使用I/O通常有两种方式:</br> 同步 </br> 同步的I/O一次只能发出一个I/O请求,等待内核完成才返回。这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决。通常会用16−32根线程同时工作将iodepth塞满。</br> 异步 </br> 异步的I/O通常使用libaio这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。
144+
-bs=4k |表示单次I/O的块文件大小为4KB。默认大小也是4KB。</br> 测试IOPS时,建议将bs设置为一个较小的值,如4k。</br> 测试吞吐量时,建议将bs设置为一个较大的值,如1024k。
145+
-size=1G |表示测试文件大小为1GiB。
146+
-numjobs=1 |表示测试线程数为1。
147+
-runtime=1000 |表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写完。
148+
-group_reporting |表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。
149+
-filename=iotest |指定测试文件的名称,例如iotest。
150+
-name=Rand_Write_Testing |表示测试任务名称为Rand_Write_Testing,可以随意设定。
151+
152+
## 参考
153+
yum install -y fio
154+
155+
man fio
156+
157+
https://help.aliyun.com/document_detail/25382.html
158+
159+
https://help.aliyun.com/document_detail/147897.html
160+
161+
https://help.aliyun.com/knowledge_detail/65077.html
162+
163+
164+
165+
#### [免费领取阿里云RDS PostgreSQL实例、ECS虚拟机](https://www.aliyun.com/database/postgresqlactivity "57258f76c37864c6e6d23383d05714ea")
166+
167+
168+
#### [digoal's PostgreSQL文章入口](https://github.com/digoal/blog/blob/master/README.md "22709685feb7cab07d30f30387f0a9ae")
169+
170+
171+
![digoal's weixin](../pic/digoal_weixin.jpg "f7ad92eeba24523fd47a6e1a0e691b59")
172+

201912/20191228_03.md

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
## fio io测试阿里云ecs 本地ssd, essd性能 - 2
2+
3+
### 作者
4+
digoal
5+
6+
### 日期
7+
2019-12-28
8+
9+
### 标签
10+
PostgreSQL , fio , 阿里云 , local ssd , essd
11+
12+
----
13+
14+
## 背景
15+
https://help.aliyun.com/knowledge_detail/65077.html
16+
17+
压测ESSD云盘性能时,云盘本身以及压测条件都起着重要的作用。您可以按照本示例配置ESSD云盘性能的压测条件,充分发挥出多核多并发的系统性能,压测出100万IOPS的性能指标。
18+
19+
## 压测条件
20+
21+
- 示例操作:随机写(randwrite)。
22+
- 镜像:使用公共镜像中高版本的Linux镜像。例如,CentOS 7.4/7.3/7.2 64位和Aliyun Linux 2.1903 64位操作系统。
23+
- 工具:使用FIO。
24+
- 实例规格:推荐使用ecs.g5se.18xlarge。
25+
- ESSD云盘:推荐使用ESSD PL3云盘,设备名假设为/dev/vdb。更多详情,请参见ESSD云盘。如果使用文件系统,则使用文件系统下的文件名代替
26+
27+
警告: 测试裸盘可以获得真实的块存储盘性能,但会破坏文件系统结构,请在测试前提前创建快照做好数据备份。具体操作,请参见创建快照。建议您只在新购无数据的ECS实例上使用工具测试块存储性能,避免造成数据丢失。
28+
29+
## 操作步骤
30+
1、依次运行以下命令安装libaio和FIO。
31+
32+
```
33+
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
34+
35+
sudo yum install libaio –y
36+
sudo yum install libaio-devel –y
37+
sudo yum install fio -y
38+
```
39+
40+
2、切换路径。
41+
42+
```
43+
cd /tmp
44+
```
45+
46+
3、新建test100w.sh脚本。
47+
48+
```
49+
vi test100w.sh
50+
```
51+
52+
4、在test100w.sh中粘贴以下内容。
53+
54+
假设有9个essd盘vd[b-j]
55+
56+
```
57+
function RunFio
58+
{
59+
numjobs=$1 # 实例中的测试线程数,如示例中的8
60+
iodepth=$2 # 同时发出I/O数的上限,如示例中的64
61+
bs=$3 # 单次I/O的块文件大小,如示例中的4K
62+
rw=$4 # 测试时的读写策略,如示例中的randwrite
63+
filename=$5 # 指定测试文件的名称,如示例中的/data01/test
64+
ioengine=$6 # io engine : libaio, sync等,参考man fio
65+
direct=$7 # 是否跳过page cache ,参考man fio
66+
67+
nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l`
68+
if [ $nr_cpus -lt $numjobs ];then
69+
echo “Numjobs is more than cpu cores, exit!”
70+
exit -1
71+
fi
72+
let nu=$numjobs+1
73+
cpulist=""
74+
for ((i=1;i<10;i++))
75+
do
76+
list=`cat /sys/block/vdb/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','`
77+
if [ -z $list ];then
78+
break
79+
fi
80+
cpulist=${cpulist}${list}
81+
done
82+
spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}`
83+
echo $spincpu
84+
fio --ioengine=${ioengine} --runtime=60s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --rw=${rw} --filename=${filename} --time_based=1 --direct=${direct} --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split
85+
}
86+
87+
# 设置essd块设备 queue rq affinity,假设有9个essd盘,并且他们在vd[b-j]
88+
echo 2 > /sys/block/vdb/queue/rq_affinity
89+
echo 2 > /sys/block/vdc/queue/rq_affinity
90+
echo 2 > /sys/block/vdd/queue/rq_affinity
91+
echo 2 > /sys/block/vde/queue/rq_affinity
92+
echo 2 > /sys/block/vdf/queue/rq_affinity
93+
echo 2 > /sys/block/vdg/queue/rq_affinity
94+
echo 2 > /sys/block/vdh/queue/rq_affinity
95+
echo 2 > /sys/block/vdi/queue/rq_affinity
96+
echo 2 > /sys/block/vdj/queue/rq_affinity
97+
98+
sleep 5
99+
RunFio $1 $2 $3 $4 $5 $6 $7
100+
# RunFio 16 64 8k randwrite /data01/test libaio 1
101+
```
102+
103+
104+
因测试环境而异,根据实际情况修改test100w.sh脚本。
105+
106+
- 所有vdb,该值请设置成ESSD云盘实际的设备名。
107+
- ```RunFio 10 64 4k randwrite /dev/vdb```中的```10、64、4k、randwrite``````/dev/vdb```
108+
- 如果云盘上的数据丢失不影响业务,可以设置filename=[设备名,如本示例中的/dev/vdb],否则,请设置为filename=[具体的文件路径,如/mnt/test.image]
109+
测试ESSD云盘性能。
110+
111+
```
112+
. ./test100w.sh 16 64 8k randwrite /data01/test libaio 1
113+
. ./test100w.sh 16 64 8k randread /data01/test libaio 1
114+
. ./test100w.sh 16 64 8k write /data01/test libaio 1
115+
. ./test100w.sh 16 64 8k read /data01/test libaio 1
116+
```
117+
118+
出现IOPS=***的结果时,表示ESSD云盘性能测试结束。
119+
120+
```
121+
write: IOPS=131k, BW=1024MiB/s (1074MB/s)(29.0GiB/30003msec)
122+
```
123+
124+
![pic](20191228_03_pic_001.png)
125+
126+
## test100w.sh脚本解读
127+
以下命令将块设备的系统参数rq_affinity取值修改为2。
128+
129+
```
130+
echo 2 > /sys/block/vdb/queue/rq_affinity
131+
```
132+
133+
rq_affinity取值 | 取值说明
134+
---|---
135+
1 |表示块设备收到I/O完成(I/O Completion)的事件时,这个I/O被发送回处理这个I/O下发流程的vCPU所在Group上处理。在多线程并发的情况下,I/O Completion就可能集中在某一个vCPU上执行,造成瓶颈,导致性能无法提升。
136+
2 |表示块设备收到I/O Completion的事件时,这个I/O会在当初下发的vCPU上执行。在多线程并发的情况下,就可以完全充分发挥各个vCPU的性能。
137+
138+
139+
以下命令分别将几个jobs绑定不同的CPU Core上。
140+
141+
```
142+
fio -ioengine=libaio -runtime=30s -numjobs=${numjobs} -iodepth=${iodepth} -bs=${bs} -rw=${rw} -filename=${filename} -time_based=1 -direct=1 -name=test -group_reporting -cpus_allowed=$spincpu -cpus_allowed_policy=split
143+
```
144+
145+
说明
146+
147+
普通模式下,一个设备(Device)只有一个请求队列(Request-Queue),在多线程并发处理I/O的情况下,这个唯一的Request-Queue就是一个性能瓶颈点。多队列(Multi-Queue)模式下,一个设备(Device)可以拥有多个处理I/O的Request-Queue,充分发挥后端存储的性能。假设您有4个I/O线程,您需要将4个I/O线程分别绑定在不同的Request-Queue对应的CPU Core上,这样就可以充分利用Multi-Queue提升性能。
148+
149+
参数 |说明 |取值示例
150+
---|---|---
151+
numjobs |I/O线程。 |10
152+
/dev/vdb |ESSD云盘设备名。 |/dev/vdb
153+
cpus_allowed_policy |FIO提供了参数cpus_allowed_policy以及cpus_allowed来绑定vCPU。 |split
154+
155+
以上命令一共运行了几个jobs,分别绑定在几个CPU Core上,分别对应着不同的Queue_Id。关于如何查看Queue_Id绑定的cpu_core_id,您可以:
156+
运行```ls /sys/block/vd*/mq/```查看设备名为```vd*```云盘的Queue_Id。
157+
运行```cat /sys/block/vd*/mq//cpu_list```查看对应设备名为```vd*```云盘的```Queue*```绑定到的cpu_core_id。
158+
159+
## 参考
160+
yum install -y fio
161+
162+
man fio
163+
164+
https://help.aliyun.com/document_detail/25382.html
165+
166+
https://help.aliyun.com/document_detail/147897.html
167+
168+
https://help.aliyun.com/knowledge_detail/65077.html
169+
170+
171+
172+
#### [免费领取阿里云RDS PostgreSQL实例、ECS虚拟机](https://www.aliyun.com/database/postgresqlactivity "57258f76c37864c6e6d23383d05714ea")
173+
174+
175+
#### [digoal's PostgreSQL文章入口](https://github.com/digoal/blog/blob/master/README.md "22709685feb7cab07d30f30387f0a9ae")
176+
177+
178+
![digoal's weixin](../pic/digoal_weixin.jpg "f7ad92eeba24523fd47a6e1a0e691b59")
179+

201912/20191228_03_pic_001.png

223 KB
Loading

201912/readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
### 文章列表
44
----
5+
##### 20191228_03.md [《fio io测试阿里云ecs 本地ssd, essd性能 - 2》](20191228_03.md)
6+
##### 20191228_02.md [《fio io测试阿里云ecs 本地ssd, essd性能 - 1》](20191228_02.md)
57
##### 20191228_01.md [[转载] fio io测试软件介绍》](20191228_01.md)
68
##### 20191219_02.md [《PostgreSQL 阿里云rds pg发布高维向量索引,支持图像识别、人脸识别 - pase 插件》](20191219_02.md)
79
##### 20191219_01.md [《PostgreSQL log_fdw 阿里云rds pg如何查看、配置实时数据库日志》](20191219_01.md)

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ digoal's|PostgreSQL|文章|归类
5757

5858
### 所有文档如下
5959
----
60+
##### 201912/20191228_03.md [《fio io测试阿里云ecs 本地ssd, essd性能 - 2》](201912/20191228_03.md)
61+
##### 201912/20191228_02.md [《fio io测试阿里云ecs 本地ssd, essd性能 - 1》](201912/20191228_02.md)
6062
##### 201912/20191228_01.md [[转载] fio io测试软件介绍》](201912/20191228_01.md)
6163
##### 201912/20191219_02.md [《PostgreSQL 阿里云rds pg发布高维向量索引,支持图像识别、人脸识别 - pase 插件》](201912/20191219_02.md)
6264
##### 201912/20191219_01.md [《PostgreSQL log_fdw 阿里云rds pg如何查看、配置实时数据库日志》](201912/20191219_01.md)

0 commit comments

Comments
 (0)