制作一个读写分离文件夹
目标
为了更好的加大系统的读取效率与此功能的通用性,制作一个读写分离的文件夹。
原理
读取数据时是从内存中读取,写入数据时是则写入磁盘。
使用方式
指定一个文件夹,此文件夹下的文件都具有读写分离效果。这样任何基于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