一、目的
验证针对同一文件的同一位置的写入操作,是否会存在磁盘的同一位置。磁盘同一位置的频繁写入,是否影响磁盘的寿命?固态硬盘的磨损均衡(wear leveling)是否有效?
二、实验方法
1. 利用fseek(fd, 0 , SEEK_SET)在同一位置写入;
2. 利用 echo 1 >/proc/sys/vm/block_dump 记录系统I/O;
3. 利用 dmesg -c –s 50000 >> IO.log 记录运行状态
三、代码实现
1. 写文件代码
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
int main()
{
FILE* fd;
int offset = -1;
char buf[20]; //it is enough size
int size = -1;
unsigned int writeTimes = 1;
char ret[20] = {"Success!"};
clock_t start, end;
FILE* out;
start = clock();
//write until wrong
while(1)
{
fd = fopen("test","w+");
if(fd==NULL)
{
sprintf(ret,"%s\n","open filed!");
goto End;
}
//write on the same position
offset = fseek(fd,0,SEEK_SET);
if(offset)
{
sprintf(ret,"%s\n","offset filed!");
goto End;
}
else
{
sprintf(buf,"%d\n",writeTimes);
size = fwrite(buf,sizeof(buf),1,fd);
if(size!=1)
{
sprintf(ret,"%s\n","write error!");
goto End;
}
//sync to hard disk
if(fflush(fd))
{
sprintf(ret,"%s\n","fflush error!");
goto End;
}
fsync(fileno(fd));
//sync();
++writeTimes;
}
End:
fclose(fd);
//dmesg after the error happened
if(strcmp(ret,"Success!"))
{
//output message
end = clock();
double hours = (double)(end - start)/CLOCKS_PER_SEC/(3600);
out = fopen("mytest.log","a");
fprintf(out,"%s\n","------------------------");
fprintf(out,"%s\n",ret);
fprintf(out,"%d\n",writeTimes);
fprintf(out,"%f h \n",hours);
fclose(out);
}
}
return 0;
}
2. 记录日志
#!/bin/bash
while (true)
do
if [ ! -e mytest.log ]
then
dmesg -c -s 50000 |grep write > IO.log
else
dmesg -c -s 50000 |grep write >> IO.log
fi
sleep 2
done
注意:
echo 1 >/proc/sys/vm/block_dump 开启内核I/O记录功能。
三、实验结果
A. 测试无sleep直接写入,测试数据1000条,仅统计写入sda情况。
第一次测试,总写入sda7次数152次。
写入位置 |
次数 |
占比 |
0 |
21 |
13.82% |
8 |
32 |
21.05% |
524288 |
32 |
21.05% |
524704 |
22 |
14.47% |
524712 |
30 |
19.74% |
690496 |
11 |
7.24% |
573496 |
2 |
1.32% |
524296 |
2 |
1.32% |
第二次测试,总写入sda7次数727次。
写入位置 |
写入次数 |
占比 |
8 |
145 |
19.94% |
524712 |
143 |
19.67% |
524288 |
141 |
19.39% |
0 |
133 |
18.29% |
524704 |
129 |
17.74% |
547848 |
13 |
1.79% |
524304 |
4 |
0.55% |
606216 |
4 |
0.55% |
524296 |
3 |
0.41% |
524720 |
3 |
0.41% |
1572872 |
2 |
0.28% |
1572880 |
2 |
0.28% |
1572912 |
2 |
0.28% |
1741480 |
2 |
0.28% |
573496 |
1 |
0.14% |
写入次数最频繁的位置:
8 |
524712 |
524288 |
0 |
524704 |
B. 每次写入后sleep 10,然后关闭文件。测试数据1000条
第一次测试,总写入sda7次数 120
写入位置 |
写入次数 |
占比 |
0 |
19 |
15.83% |
8 |
19 |
15.83% |
524288 |
19 |
15.83% |
524704 |
19 |
15.83% |
524712 |
19 |
15.83% |
748992 |
13 |
10.83% |
1572912 |
2 |
1.67% |
1741480 |
2 |
1.67% |
606216 |
4 |
3.33% |
524304 |
2 |
1.67% |
524296 |
2 |
1.67% |
第二次测试,总写入sda7次数 1587
写入位置 |
写入次数 |
占比 |
524712 |
288 |
18.15% |
524704 |
276 |
17.39% |
524288 |
264 |
16.64% |
8 |
246 |
15.50% |
0 |
227 |
14.30% |
573600 |
102 |
6.43% |
1741480 |
44 |
2.77% |
1572912 |
42 |
2.65% |
1572880 |
33 |
2.08% |
1572872 |
25 |
1.58% |
606216 |
22 |
1.39% |
524304 |
10 |
0.63% |
524296 |
7 |
0.44% |
573496 |
1 |
0.06% |
写入最频繁的位置:
524712 |
524704 |
524288 |
8 |
0 |
C. 每次写入后关闭文件,然后sleep10 。测试数据1000条。
第一次测试,总写入sda7 次数4909 次
写入位置 |
写入次数 |
占比 |
524712 |
936 |
19.07% |
524704 |
919 |
18.72% |
524288 |
909 |
18.52% |
8 |
895 |
18.23% |
0 |
880 |
17.93% |
748992 |
116 |
2.36% |
1741480 |
36 |
0.73% |
1572912 |
35 |
0.71% |
524296 |
35 |
0.71% |
524304 |
35 |
0.71% |
606216 |
35 |
0.71% |
1572880 |
32 |
0.65% |
1572872 |
30 |
0.61% |
590024 |
14 |
0.29% |
2097168 |
1 |
0.02% |
2097176 |
1 |
0.02% |
第二次测试,硬盘总写入次数4175
写入位置 |
写入次数 |
占比 |
0 |
730 |
17.49% |
524288 |
730 |
17.49% |
524704 |
730 |
17.49% |
524712 |
730 |
17.49% |
8 |
730 |
17.49% |
690520 |
149 |
3.57% |
606216 |
65 |
1.56% |
524296 |
64 |
1.53% |
524304 |
64 |
1.53% |
573600 |
47 |
1.13% |
1572872 |
33 |
0.79% |
1572880 |
33 |
0.79% |
1572912 |
33 |
0.79% |
1741480 |
33 |
0.79% |
2097168 |
2 |
0.05% |
2097176 |
2 |
0.05% |
第三次测试,在同一位置分别写入0-9个字节,各执行100次write,硬盘共写入5644次,
写入位置 |
写入次数 |
占比 |
8 |
979 |
17.35% |
524288 |
978 |
17.33% |
0 |
977 |
17.31% |
524704 |
977 |
17.31% |
524712 |
880 |
15.59% |
524720 |
471 |
8.35% |
590632 |
316 |
5.60% |
1572912 |
11 |
0.19% |
1572880 |
10 |
0.18% |
1572872 |
9 |
0.16% |
1741480 |
6 |
0.11% |
1572864 |
5 |
0.09% |
2097168 |
4 |
0.07% |
2097176 |
4 |
0.07% |
1741488 |
3 |
0.05% |
1742264 |
3 |
0.05% |
573496 |
3 |
0.05% |
524296 |
2 |
0.04% |
786448 |
2 |
0.04% |
1572928 |
1 |
0.02% |
1572976 |
1 |
0.02% |
1760336 |
1 |
0.02% |
1760432 |
1 |
0.02% |
写入最频繁位置:
0 |
524288 |
524704 |
524712 |
8 |
四、初步结论
在同一文件的同一位置的写入过程中,存在一些频繁写入磁盘的位置。根据记录的无线写入次数,如下图,可知wear leveling 具有一定的作用。