echo “cset.uuid” > /sys/block/bcache0/bcache/attach脚本如下:wipefs -a /dev/ssdmake-bcache -C /dev/ssdecho :nvme0n1p2bcache2:nvme0n1p3bcache3:nvme0n1p4bcache4:nvme0n1p5bcache5:nvme0n1p6bcache6:nvme1n1p1bcache7 :nvme1n1p2bcache8:nvme1n1p3bcache9:nvme1n1p4bcache10:nvme1n1p5bcache11:nvme1n1p6cat osd.txt| . /prepare_osd.shbcache0 nvme0n1p1bcache1 nvme0n1p2bcache2 nvme0n1p3bcache3 nvme0n1p4bcache4 nvme0n1p5bcache5 nvme0n1p6bcache6 nvme1n1p1bcache7 nvme1n1p2bcache8 nvme1n1p3bcache9 nvme1n1p4bcache10 nvme1n1p5bcache11
Bcache简介 Bcache是Linux内核块设备层cache,支持多块HDD使用同一块SSD作为缓存盘。它让SSD作为HDD的缓存成为了可能。 Bcache是从Linux-3.10开始正式并入内核主线的,因此,要使用Bcache,需要将内核升级到3.10及以上版本才行。 Bcache缓存策略 Bcache支持三种缓存策略,分别是:writeback、writethrough、writearoud,默认使用writethrough,缓存策略可动态修改。 sys/block/sdb/bcache/dev/slaves 查看缓存模式 1 2 3 # cat /sys/block/bcache0/bcache/cache_mode [writethrough # cat /sys/block/bcache0/bcache/dirty_data 4.1G 格式化、挂载 1 2 # mkfs.ext4 /dev/bcache0 # mount /dev/bcache0
Bcache简介 Bcache是Linux内核块设备层cache,支持多块HDD使用同一块SSD作为缓存盘。它让SSD作为HDD的缓存成为了可能。 bcache-tools的安装与使用 bcache-tools的安装 要使用Bcache,必须安装bcache-tools工具包,由于CentOS 7的源中没有bcache-tools,因此,需要手动下载源码包进行编译 bcache-tools的使用 使用磁盘作为Bcache磁盘前,请先确保磁盘是空的,或者磁盘中的数据无关紧要。 擦除磁盘中的超级块信息: 创建Bcache后端磁盘(HDD): 创建Bcache缓存磁盘(SSD): 查看Bcache磁盘: Bcache磁盘配置 格式化Bcache磁盘并挂载 要使用bcache make-bcache 如果使用make-bcache命令出现了如下打印,那就说明当前磁盘已经是bcache磁盘, [root@localhost ~]# make-bcache -B /dev/sdb
逐个看内核线程,最后发现,最有可能的是bcache线程。 3,bcache ? hdd在guest中被添加成为bcache类型的磁盘,实际操作是向hdd盘的header中写入bcache的magic。在host上,磁盘被加载的时候,同样可以扫描到bcache类型的header。 在systemd-udevd和kernel的共同配合下,会加载bcache.ko,被启动bcache内核线程。 4,disable bcache 解决办法很简单,在host上禁用bcache就行了。 5,ramdisk 删掉/lib/modules/`uname -r`/kernel/drivers/md/bcache之后,重启host,执行lsmod | grep bcache还是看到了bcache
bcache采用一个bcache.lock保护,需要改成分段锁来支持并行读写。 ,i); initlock(&bcache.locks[i],buf); bcache.heads[i].prev = &bcache.heads[i]; bcache.heads[i ].next = &bcache.heads[i]; } //初始化block并添加到0-桶 for(b = bcache.buf; b < bcache.buf+NBUF; b++){ b for(b = bcache.heads[id].next; b ! for(b = bcache.heads[id].next; b !
修改bget和brelse,以便bcache中不同块的并发查找和释放不太可能在锁上发生冲突(例如,不必全部等待bcache.lock)。你必须保护每个块最多缓存一个副本的不变量。 ALL TESTS PASSED $ 请将你所有的锁以“bcache”开头进行命名。也就是说,您应该为每个锁调用initlock,并传递一个以“bcache”开头的名称。 = &bcache.buckets[i].head; bcache.buckets[i].head.next = &bcache.buckets[i].head; } // Create (&b->lock, "buffer"); bcache.buckets[0].head.next->prev = b; bcache.buckets[0].head.next = b; ; bcache.buckets[bid].head.next->prev = b; bcache.buckets[bid].head.next = b; }
, "bcache"); // Create linked list of buffers // 创建buf双向链表 bcache.head.prev = &bcache.head; bcache.head.next = &bcache.head; // 组装buf链表,头插法 for(b = bcache.buf; b < bcache.buf+NBUF; b++){ b->next = bcache.head.next; b->prev = &bcache.head; // 初始化单个buf的锁资源 initsleeplock(&b->lock , "buffer"); bcache.head.next->prev = b; bcache.head.next = b; } } 缓冲区有两个与之关联的状态字段。 ; b->prev = &bcache.head; bcache.head.next->prev = b; bcache.head.next = b; } release
; 多个进程同时使用文件系统的时候,bcache.lock 上会发生严重的锁竞争。 [i], "bcache_bufmap"); bcache.bufmap[i].next = 0; } // Initialize buffers for(int i=0;i<NBUF bcache.bufmap[0].next = b; } initlock(&bcache.eviction_lock, "bcache_eviction"); } // Look through ]); b->next = bcache.bufmap[key].next; bcache.bufmap[key].next = b; } b->dev = dev; bcache.bufmap_locks[key]); } 运行结果 $ bcachetest start test0 test0 results: --- lock kmem/bcache stats
"); bcache.head.prev = &bcache.head; bcache.head.next = &bcache.head; for(b = bcache.buf; b < bcache.buf+NBUF; b++){ b->next = bcache.head.next; b->prev = &bcache.head; initsleeplock( 而整个缓存区 $bcache$ 也有个锁,是自旋锁,$bcache$ 就像缓存块的分配器一般,获取释放缓存块都需要 $bcache$ 同意,而且 $bcache$ 也是公共资源,任意时刻都应最多只有一个任务访问 for(b = bcache.head.prev; b ! bcache.head; bcache.head.next->prev = b; bcache.head.next = b; } release(&bcache.lock
bCache = new BCache(); public String get(String key) { return bCache.get(key); } ; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Slf4j public class BCache { main] INFO com.xiepanpan.ApiTest - 测试结果:xiepanpan 23:19:46.831 [main] INFO com.xiepanpan.factory.impl.BCache - BCache 写入数据 Key:password value: 123456 23:19:46.831 [main] INFO com.xiepanpan.factory.impl.BCache - BCache 获取数据 key:password 23:19:46.831 [main] INFO com.xiepanpan.ApiTest - 密码为: 123456 参考文章: 《大话设计模式
struct buf head; } bcache; 2.2 Cache层的函数定义 binit()函数:初始化bcache,把所有的buf使用双链表进行连接。 buffers bcache.head.prev = &bcache.head; bcache.head.next = &bcache.head; for(b = bcache.buf; b < bcache.buf+NBUF; b++){ b->next = bcache.head.next; b->prev = &bcache.head; initsleeplock for(b = bcache.head.next; b ! bcache.head; bcache.head.next->prev = b; bcache.head.next = b; } release(&bcache.lock)
This platform has a new caching virtual device — bcache, which we haven’t used in this cluster before It might be a kernel, bcache, or disk issue. The iostat output showed high latency for bcache devices. But we still don’t know why the bcache latency was high. Let’s run the script and trigger udev events while fio writes to a bcache device: ? Success!
场景1:Bcache--用SSD代替内存,作为HDD盘缓存Bcache: Bcache is a Linux kernel block layer cache. 场景:使用SSD盘在IO速度较慢的HDD盘上面做一层缓存,从而来提高HDD盘的IO速率bcache 执行的缓存操作在块设备级别进行.经常访问的热数据会缓存在固态硬盘中并直接返回给应用程序原理:缓存的实现方式是使用 单个缓存设备可用于缓存任意数量的后备设备从非正常关机中恢复 - 直到缓存与后备设备保持一致,写入才会完成(bcache 内部不区分正常关机和非正常关机)。2. 排除过程:iops 为0缩容操作总结熟悉iostat -dxm 命令,看await指标了解io流程,每个io步骤到 io hang分布式存储的性能不是由最快的磁盘决定,而是由最慢的磁盘所决定本地:Bcache
一般存储厂商的通用有效方式是利用增加数据缓存层来降低延迟,即利用在存储节点给多块HDD配置一块SSD,再使用开源BCache方案,此种方案是一种通用的经济实惠解决方案。 如下图所示,不过这种方案对性能提升有限,主要原因还是IO路径过长,分布式存储核心层逻辑过于复杂,同时采用开源BCache方案也存在着很多问题诸如:BCache虽然开源,但如果出现问题,基本没有维护的能力 ;BCache增加运维难度;BCache对成员盘的故障处理能力较弱。
struct buf head; } bcache; 2.2 Cache层的函数定义 binit()函数:初始化bcache,把所有的buf使用双链表进行连接。 buffers bcache.head.prev = &bcache.head; bcache.head.next = &bcache.head; for(b = bcache.buf; b < bcache.buf+NBUF; b++){ b->next = bcache.head.next; b->prev = &bcache.head; initsleeplock for(b = bcache.head.next; b ! bcache.head; bcache.head.next->prev = b; bcache.head.next = b; } release(&bcache.lock)
ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1673419811&gen=playurlv2&os=bcache ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1673419811&gen=playurlv2&os=bcache
kalloctest 调用一个系统调用,使内核打印 kmem 和 bcache 锁(这是本实验的重点)和 5 个最争用次数最多锁的计数。如果存在锁争用,获取循环迭代的次数将会很大。 系统调用返回 kmem 和 bcache 锁的循环迭代次数的总和。 对于本实验,您必须使用具有多核的专用机器。如果您使用一台正在做其他事情的机器,那么 kalloctest 打印的计数将是无稽之谈。
软件 ssd 缓存开源软件主要有bcache ,flashcache bcache 需要编译最新的内核,要求比较高,配置比较复杂,目前主要用于测试环境; flashcache 是facebook内部使用的
"高清 720P", "size": 2940926, "src": [ "http://cn-hbsjz2-cmcc-bcache 80WXIekXRE9IMvXBvEuENvNCImNEVEua6m2jIxux0CkF6s2JZv5x0DQJZY2F8SkXKE9IB5QK==&deadl ine=1590653296&gen=playurl&nbs=1&oi=1862376489&os=bcache "清晰 480P", "size": 2969098, "src": [ "http://cn-hbsjz2-cmcc-bcache 80WXIekXRE9IMvXBvEuENvNCImNEVEua6m2jIxux0CkF6s2JZv5x0DQJZY2F8SkXKE9IB5QK==&deadl ine=1590653296&gen=playurl&nbs=1&oi=1862376489&os=bcache "流畅 360P", "size": 1419499, "src": [ "http://cn-hbsjz2-cmcc-bcache
char * rCache = CacheImg; unsigned char * gCache = CacheImg + imageSize; unsigned char * bCache = rCache + Y*width; unsigned char* LinePG = gCache + Y*width; unsigned char* LinePB = bCache rCache + heightStep; unsigned char* LinePG = gCache + heightStep; unsigned char* LinePB = bCache