制作一个读写分离文件夹
目标
为了更好的加大系统的读取效率与此功能的通用性,制作一个读写分离的文件夹。

原理
读取数据时是从内存中读取,写入数据时是则写入磁盘。

使用方式
指定一个文件夹,此文件夹下的文件都具有读写分离效果。这样任何基于Linux运行的程序都可以使用,而不须要单独提供API调用,不用专用开发这种特性。

名称
读写文件夹:最终将目标生成有读写分离效果的文件夹称为“读写分离文件夹”,简称“读写文件夹”。

磁盘文件夹:对应常规的文件存储的文件夹称为磁盘文件夹,与读写文件夹之对应。

内存文件夹:通过将内存虚拟成磁盘的方式输出的文件夹。

开始预备构建与测试
计算机
所有测试都在同一台电脑,共用同一个磁盘。

CPU:Intel i7-6700k

内存:16G

磁盘:SSD 512G

内存模拟磁盘
构建工作文件夹

#mkdir ~/rwwork

进入工作文件夹

#cd rwwork

关闭交换分区

因为避免操作系统将部份内存放入交换分区,影响测试结果,先关闭交换分区

#sudo swapoff -a

创建内存虚拟磁盘文件夹ramdisk

#mkdir ramdisk

挂载内存虚拟磁盘,设定12G的空间

#sudo mount -t tmpfs -o size=12G tmpfs ramdisk

准备测试内存文件夹是否生效:

测试磁盘文件夹,读出12g的文件

time cat file12g > /dev/null

real 0m22.583s

user 0m0.241s

sys 0m8.865s

测试内存文件夹,读出12g的文件

#time cat ramdisk/file12g > /dev/null

real 0m1.757s

user 0m0.091s

sys 0m1.666s

统计:

磁盘文件夹用时:22.58s

内存文件夹用时:1.75s

测试结论

读取数据性能接近20倍提升。

现在虚拟磁盘文件夹已经做好,开始下一步。

读写分离实现
生成一个12G的文件diskimg,分别存于磁盘与内存盘,用于做文件映像

#dd if=/dev/zero of=diskimg bs=1M count=12000

#dd if=/dev/zero of=ramdisk/diskimg bs=1M count=12000

建立两个块设备,分别对应刚建立的两个diskimg文件

#sudo mknod /dev/virDisk1 b 7 80

#sudo mknod /dev/virDisk2 b 7 81

#sudo losetup /dev/virDisk1 diskimg #关联磁盘文件

#sudo losetup /dev/virDisk2 ramdisk/diskimg #关联内存盘文件

开始建立软raid1阵列

#sudo mdadm -C /dev/md5 -a yes -l 1 -n 2 /dev/virDisk2 –write-mostly /dev/virDisk1 -c 256

输入yes确认

建立文件系统

#mkfs.ext4 /dev/md5

建立可以使用文件夹usedDir,挂载阵列

#sudo mount -t ext4 /dev/md5 usedDir

制作已经完成,后续进行性能测试

现在usedDir就是一个读写分离文件夹

测试读写文件夹读性能
测试写入11g的文件,输出file11g文件

写入磁盘文件:

#time dd if=/dev/zero of=file11g bs=1M count=11000

11000+0 records in

11000+0 records out

11534336000 bytes (12 GB) copied, 20.8607 s, 553 MB/s

real 0m20.908s

user 0m0.016s

sys 0m8.908s

写入内存盘文件:

#time dd if=/dev/zero of=ramdisk/file11g bs=1M count=11000

11000+0 records in

11000+0 records out

11534336000 bytes (12 GB, 11 GiB) copied, 3.19751 s, 3.6 GB/s

real 0m3.199s

user 0m0.012s

sys 0m3.186s

写入读写盘文件:

#time dd if=/dev/zero of=usedDir/file11g bs=1M count=11000

11000+0 records in

11000+0 records out

11534336000 bytes (12 GB) copied, 21.2857 s, 542 MB/s

real 0m21.293s

user 0m0.017s

sys 0m9.151s

读取磁盘文件:

time cat file11g > /dev/null

real 0m20.972s

user 0m0.231s

sys 0m8.443s

读取内存盘:

time cat ramdisk/file11g > /dev/null

real 0m1.516s

user 0m0.080s

sys 0m1.436s

读取读写盘:

time cat usedDir/file11g > /dev/null

real 0m2.774s

user 0m0.070s

sys 0m2.689s

统计性能总览
统计读取一个11g文件的时长

盘体 读取 写入

磁盘 20s 20.9s

内存盘 1.5s 2.0s

读写盘 2.7s 21.2s

结论
1、读定分离盘写性能与磁盘一致,代表写入时实际为写入磁盘中。

2、读性能与内存一致,代表从内存盘中读出数据。

3、此方法主要为了加速信息的读取效率,提高随机访问的速度。特别在使用机械磁盘上,提升的效率特别显明。现在在固态磁盘上也已经接近有10倍的提升。

4、使用方式非常简单,直接将想要做分离的存储都放在读写分离文件夹上便可,例如将数据库的数据文件放在此磁盘上。

5、此方案的思路与实现方式都非常简单,属性一个测试性的方案,用于研发。如果需要正式使用,则需要开发严谨的驱动程序,最终可能会开发一套云服务,供有需要的客户直接以网络接口的方式使用,或一些业务服务,如数据库等。

扩展
未来可以通过采用异步的方式进行写入,但是这样会降低数据的安全性。异步写入可能需要实现驱动的方式来完成。
————————————————
版权声明:本文为CSDN博主「weixin_39789857」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39789857/article/details/111704912