自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (4)
  • 收藏
  • 关注

原创 Ceph Monitor选主(下)

选举主动启动选举的节点向monmap中的其它节点发送OP_PROPOSE请求,并将选举的epoch加1,置为奇数。void Monitor::start_election()_reset();elector.call_election(); start();acked_me.clear();init();epoch = mon->store->get(Monitor::MONITOR_NAME, “election_epoch”);if (!epoch)epoch = 1;

2020-06-16 17:48:26 710

原创 Ceph Monitor选主(上)

monitor选主主要包括前期准备和选主两部分选主前期准备发送探测消息任何一个monitor节点都可以发起选举,选举的入口函数是bootstrapbootstrap cancel_probe_timeout(); if (probe_timeout_event) timer.cancel_event(probe_timeout_event); probe_timeout_event = NULL; // monitor状态改变 state = STATE_PROBING;

2020-06-16 14:57:19 821

原创 Ceph Monitor Paxos实现

Monitor的Paxos实现主要包括Leveldb、Paxos和PaxosService三层,其中Leveldb负责底层存储,Paxos负责Paxos算法的具体实现,PaxosService则是基于Paxos提供的服务,包括OSDMap、MonitorMap、PGMap、CRUSHMap。标题Paxos实现Monitor节点分为一个leader节点和多个peon节点,且只有leader节点可以发起提议,下面以monmap更新分析Paxos实现。leader向各个peon节点发送OP_BEGIN消息.

2020-06-15 21:42:03 917 1

原创 《The Chubby lock service for loosely-coupled distributed systems》阅读笔记

Chubby架构一个Chubby的cell一般由5个节点组成,并利用Paxos算法选举出一个master节点,客户端通过chubby库和master节点通信。Chubby内部维护了一个文件系统,文件系统中的每个文件都可以看成一个锁。其它服务利用Chubby选主时,谁先获得文件的锁,谁就master节点。(1) 客户端如何利用Chubby选主?   chubby提供了一系列操作文件系统的接口,利用chubby进行选主时,所有的节点调用Open()和Acquire()加锁,加锁成功的节点成为主节点,其它

2020-05-21 23:42:11 367

原创 《Google File System》思考

单master节点如何做到高可用 gfs论文中对master的高可用描述是5.1.3节中的Master Replication一节,为了可用性,一个操作日志和checkpoint会在多个机器上存有master副本。一个更改操作日志只有刷入所有机器的磁盘中才算成功。为简单起见,一个master进程仍然负责所有的更改操作以及后台活动,如在内部更改系统的垃圾收集。当它失败时,几乎可以立即重启。如果其机...

2020-05-04 11:18:55 267

原创 《The Google File System》论文阅读笔记

1 导论GFS的设计基于以下几点:(1) 首先组间故障是一个很常见的事情。(2) 普遍都是大文件,GB规模的文件也很常见。(3) 大多数文件的更改方式是追加新数据而不是覆盖已经存在的数据。(4) 共同设计应用程序和文件系统API可以增加灵活性,从而使整个系统受益2 设计综述2.1 假设系统包含许多廉价的商业组间,这些组间会经常故障。因此系统必须经常监控自身,定期检测、容忍和及时从...

2020-05-03 18:27:05 618

原创 从挂载fuse文件系统分析mount系统调用

mount系统调用的原型如下int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);其中source为设备文件的路径名,target为挂载...

2020-04-02 20:53:31 2590

原创 ubuntu18.04更换源后 update失败

ubuntu18.04更换为阿里源后,执行apt-get update,出现如下错误E: Failed to fetch http://mirrors.aliyun.com/ubuntu/dists/bionic/main/binary-arm64/Packages 404 Not Found [IP: 111.164.16.227 80]E: Failed to fetch http:/...

2020-04-01 14:14:04 3535 4

原创 Linux设备模型初始化——SCSI上层sd驱动分析

static int __init init_sd(void){ int majors = 0, i; /* Linux中所有的主设备号也是被各种各样的设备所瓜分.其中,8,65-71,136-143这么个16个号码就被scsi disk所霸占了. sd_major()函数的返回值就是这16个数字.每个主设备号可以带256个次设备号. */ for (i = 0; i < SD...

2020-03-07 15:05:35 1535 1

原创 Linux设备模型初始化——SCSI子系统初始化

Linux中scsi驱动框架在Linux中scsi驱动基本分为三大层:top level,middle level以及lower level。top level为具体的scsi设备驱动,例如我们常用的磁盘设备驱动就在该层(Linux中的实现为sd.c),scsi disk的驱动向上表现为块设备,因此,具有块设备的接口及一切属性,向下表现scsi设备,因为scsi disk基于scsi总线进行数据...

2020-03-04 14:22:35 1184

原创 Linux设备模型初始化——PCI子系统初始化

在《Linux设备模型初始化》一节介绍了由__define_initcall引入的几个初始化宏,PCI初始化过程就是由这些宏控制的,下面我们介绍PCI的初始化。首先就是优先级最高的postcore_initcall(pcibus_class_init),pcibus_class_init函数是PCI子系统第一个执行的初始化函数。在sys/class中注册pci_bus目录。static int...

2020-02-28 22:05:52 833

原创 Linux设备模型初始化

Linux设备模型初始化Linux设备模型的最高层是subsystem,Linux中是利用decl_subsys和decl_subsys_name宏定义subsystem变量的,这两个宏的实现如下:#define decl_subsys(_name,_type,_hotplug_ops) struct subsystem _name##_subsys = { .kset = { .kob...

2020-02-27 14:17:35 298

原创 Linux设备驱动模型——总线、设备、驱动

总线内核所支持的每一种总线类型都由一个bus_type描述。因为bus_type结构体中定义了struct subsystem subsys,所以总线的级别处于subsystem,即总线的父结构也一定是一个subsystem。同时bus_type结构体中也定义了struct kset drivers和struct kset devices,这两个kset的父结构都是bus_type的struct...

2020-02-27 14:05:50 268

原创 Linux设备驱动模型——kobject、kset、subsystem的关系

kobjectLinux内核中有大量的驱动和设备,而这些驱动和设备往往具有类似的结构,根据面向对象的思想,我们就可以将这些共同的部分提取为父类,这个父类就是kobject,也就是驱动编程中使用的.ko文件的由来,而三大类设备驱动都需要包含这个kobject结构,也就是"继承"自kobject。一个kobject对象就对应sys目录中的一个设备,也可以理解为一个kobject就对应sys目录中的一...

2020-02-27 13:14:29 642

原创 中断和异常

中断向量Intel x86 系列微机共支持256 种向量中断,为使处理器较容易地识别每种中断源,将它们从0~255 编号,即赋予一个中断类型码 n,Intel 把这个8 位的无符号整数叫做一个向量,因此,也叫中断向量。所有256 种中断可分为两大类:异常和中断。异常又分为故障(Fault)、陷阱(Trap)和夭折(Abort),它们的共同特点是既不使用中断控制器,又不能被屏蔽。中断又分为外部可屏...

2020-02-13 15:30:14 965

原创 非连续内存区管理

伙伴算法系统、slab分配器都是要求物理页框连续。buddy 分配器并不能完全消除页外碎片问题,为了应付可能的情况(指总空闲空间大于请求 大小,但空闲空间却不连续,这种情况 buddy 分配器没有办法处理),Linux 提供了一种机 制,称 vmalloc 分配器。它允许将不连续的物理空间映射到连续的虚地址空间。这个虚地址空间的描述符:struct vm_struct {unsigned lo...

2020-02-07 16:23:05 203

原创 slab分配器

Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比 如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分...

2020-02-06 20:20:22 340

原创 内存管理——伙伴系统算法

通常情况下,一个高级操作系统必须要给进程提供基本的、能够在任意时刻申请和释放任意大小内存的功能,就像malloc 函数那样,然而,实现malloc 函数并不简单,由于进程申请内存的大小是任意的,如果操作系统对malloc 函数的实现方法不对,将直接导致一个不可避免的问题,那就是内存碎片。内存碎片就是内存被分割成很小很小的一些块,这些块虽然是空闲的,但是却小到无法使用。随着申请和释放次数的增加,内...

2020-02-05 17:04:30 598

原创 内存寻址——分页

Linux中的分页分页单元把线性地址转换为物理地址,为了效率起见,线性地址被分成以固定长度为单位的组,成为页。这样页内部连续的线性地址被映射到连续的物理地址中。这样,内核就可以指定一个页的物理地址和其存取权限,而不用指定页所包含的全部线性地址的存取权限。分页单元把所有的RAM分成固定长度的页框(有时也叫做物理页)。每个页框包含一个页,也就是说一个页框的长度与一个页的长度一致。页框是主存的一部分...

2020-02-04 20:46:06 809

原创 内存寻址——分段

段描述符硬件中包含很多段,比如代码段、数据段等,每个段都由一个8字节的段描述符表示,段描述符存放在全局描述符表(GDT)或者局部描述符表(LDT)中,段描述符中的字段如下所示:注意其中的Type字段就描述了段类型,下面是Linux中采用的各种段描述符中每个字段的情况GDT地址和大小存放在gdtr控制寄存器中,LDT地址和大小存放在ldtr控制寄存器中Linux对gdt的定义如下Lin...

2020-02-04 20:25:39 316

原创 ceph monitor选主流程

本人分析了monitor启动时的日志信息,结合源码最终整理了选主流程图,如下

2019-12-15 14:52:34 387

原创 ceph BlueStore缓存解析

ceph bluestore缓存中保存的是object的信息,包括元数据和实际数据,元数据是用LRUCache实现的,实际数据是用TwoQCache实现的。#define P(x) \ namespace x { \ static const mempool::pool_index_t id = mempool::mempool_##x; \ te...

2019-03-26 17:32:44 2633

原创 ceph pg peering和恢复 (2)

主osd收到副osd发送来的MSG_OSD_PG_NOTIFY消息后,会将该消息中所带的osd的日志信息合并到本地。主osd收到MSG_OSD_PG_NOTIFY消息后,会调用ms_fast_dispatch进行处理,其调用栈如下OSD::ms_fast_dispatch(Message *m) case MSG_OSD_PG_NOTIFY: //pg中其他从osd发来的MOSDPGN...

2019-03-10 15:58:04 1136 1

原创 ceph pg peering和恢复 (1)

pg是ceph中比较抽象的一个概念,且起到了一个承上启下的作用,客户端的对象映射到pg,而pg映射到具体的osd,pg的peering和恢复是ceph中比较复杂的一部分了。因为pg的创建过程会经历pg peering和恢复的所有过程,因此我们可以从创建pg的流程来分析pg的peering和恢复。pg的创建请求类型是MSG_OSD_PG_CREATE,到达osd后,osd中的_dispatch会继...

2019-03-09 18:52:28 2377 1

原创 ceph bluefs 日志压缩解析

bluefs的操作大量增加时,日志也会增加,从而增加占用空间,由于文件系统的元数据在内存中都有记录,且内存中的元数据都是非重复的,因此可以通过遍历元数据,将元数据重新写到日志文件当中,即可实现日志的压缩。具体是_compact_log_async函数来实现的...

2019-02-25 16:08:52 1330

原创 ceph bluefs 写操作 源码解析

ceph bluefs的写操作是由RocksDB的Write之类的操作而触发的,其最终经过层层调用,最后会调用bluefs提供的一些列精简过的接口。一、创建一个可写文件rocksdb::Status BlueRocksEnv::NewWritableFile BlueFS::FileWriter *h; fs-&gt;open_for_write(dir, file, &amp;h, fa...

2019-02-22 22:41:39 2019

原创 ceph bluefs 启动加载源码解析(上)

ceph bluefs负责对接rocksdb,是一个精简的文件系统,往下整合磁盘设备,往上给rocksdb提供一些必须的接口,其在ceph bluestore架构中所处于的位置如下图所示。ceph bluefs的上电加载过程是利用_open_db函数实现的。如果是创建osd,则调用方式是_open_db(true),如果是启动osd,则调用方式是_open_db(false, !open_d...

2019-02-22 16:51:43 1628

原创 ceph bluestore 磁盘空间管理源码解析

ceph minic版本的bluestore默认使用BitmapFreelistManager来管理磁盘空闲空间,并将磁盘空间使用情况固化到rocksdb。同时bluestore使用StupidAllocator来分配磁盘空间。在bluestore申请空间时要BitmapFreelistManager和StupidAllocator配合完成。关于FreelistManager,在osd上电时,会...

2019-02-17 18:47:52 1881

原创 ceph bluestore 写操作源码分析(下)

在https://blog.csdn.net/u014104588/article/details/87277341中,分析了bluestore对于大写和小写不同的处理方式,最后采用异步写和延迟写的方法。在_txc_state_proc函数中,处理了异步写和延迟写的情况(分别成为simple write和deferred write)。simple write此情况会发生在写新blob和可复用...

2019-02-16 11:50:27 2489

原创 ceph bluestore 写操作源码分析(上)

bluestore写操作分为大写和小写,写操作经过层层处理后最终被传递到BlueStore::queue_transactions函数中,如下:ReplicatedBackend::submit_transaction parent-&amp;amp;amp;gt;queue_transactions(tls, op.op); //调用PrimaryLogPG::queue_transactions ...

2019-02-15 15:50:54 6685 2

原创 ceph bluestore中读操作的处理

在读请求到达后_do_read函数会调用如下函数来处理具体的读操作,其中op.extent.offset和op.extent.length是在对象内的偏移和长度pgbackend-&amp;gt;objects_read_sync(soid, op.extent.offset, op.extent.length, op.flags, &amp;amp;osd_op.outdata)‘’在objects_re...

2019-02-02 21:55:36 1993

原创 ceph AsyncMessenger模块源码分析(下)

处理连接请求对于AsyncMessenger,当新的连接请求到达时,epoll会监听到该事件,并调用listenfd对应的回调函数listen_handler(C_processor_accept),在listen_handler中,会获取引用次数最少的worker(为了负载均衡),用改worker去处理这一个连接请求。具体做法为(1)调用listen_socket.accept(&amp;c...

2019-01-25 20:00:22 1017

原创 ceph AsyncMessenger模块源码分析(上)

1

2019-01-24 18:30:25 1950

原创 网络编程中的shutdown和close

1

2019-01-16 12:18:56 827 2

原创 希捷hdd部分smart属性分析

Attribute ID 1: Raw Error Rate原始值:Raw [3 – 0] = Number of sector readsRaw [6 - 4] = Number of read errors.标准化:Normalized Raw Error Rate = 10 * log10(NumberOfSectorsTransferredToOrFromHost * 512 *...

2019-01-15 17:27:17 4311

原创 openstack swift临时url设置

(1)利用radosgw创建subuser(因为我用的后端存储是ceph,不是的话就可以用其他方法)radosgw-admin user create --subuser=testuser:zy --uid=testuser --display-name=“zy test” --access=full{ &quot;user_id&quot;: &quot;testuser&quot;, &quot;display_name...

2019-01-10 19:01:22 924

原创 backblaze 2018年磁盘smart属性数据集

https://f001.backblazeb2.com/file/Backblaze-Hard-Drive-Data/data_Q3_2018.ziphttps://f001.backblazeb2.com/file/Backblaze-Hard-Drive-Data/data_Q2_2018.ziphttps://f001.backblazeb2.com/file/Backblaze-Ha...

2019-01-09 21:07:12 2382

原创 修改ceph源码——增加函数级别日志输出功能

ceph中原有日志功能介绍当前ceph中的日志只能做到某一子系统(subsystem)的某一级别日志,比如给ceph_subsys_osd子系统设置日志级别为5,则表示任何级别小于等于5的osd子系统日志都可以输出到日志文件。关于子系统日志级别设置有两种方法(1)在配置文件中指定比如debug_osd 5 就是将osd子系统的日志输出级别设置为5(2)利用admin_socket动态...

2019-01-03 14:43:51 1302

原创 编译ceph时提示“ld: cannot find -lBoost: :boost”的解决方法

编译ceph源码时提示/opt/rh/devtoolset-7/root/usrilibexec/gcc/x86_64-redhat-tinux/7/ld: cannot find -lBoost::boost /opt/rh/devtoolset-7/root/usr/Ubexec/gcc/x86_64-redhat-linux/711d: cannot find -lThreads::Th...

2018-12-17 20:50:05 2130

转载 解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题

源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。问题原因分析为了安装最新版本的Node.js(最新版本的Node.j...

2018-12-17 18:17:16 1942

IEMOCAP_full_release_withoutVideos

语音数据集保存在百度网盘里,文件是链接和提取码,数据集不包含视频。

2018-12-10

opencv sgm cuda实现

Opencv没有实现sgm算法的gpu版本,这个项目基于opencv sgm算法。 经过我的测试,它比opencv sgm算法的cpu版本快3-4倍,效果与opencv sgm完全相同。 最大差异可以设置为32的整数倍,最大值为256。

2018-12-03

cuda runtime api使用手册

从nvidia下载下来的,有时候进不了nvidia官网,方便离线观看。

2018-04-19

Docker技术入门与实战完整版电子书

2016-07-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除