前言

之前对于striper这个地方的功能并没研究太多,只是知道这个里面可以以条带方式并行的去写对象,从而加大并发性来提高性能,而默认的条带数目为1,也就是以对象大小去写,并没有条带,所以不是很好感觉到差别,今天就尝试下用rados命令来看下这个条带是怎么回事

实践过程

最开始我的集群是用rpm包进行安装的,这个可以做一些常规的测试,如果需要改动一些代码的话,就比较麻烦了,本文后面会讲述怎么改动一点点代码,然后进行测试

我们一般来说用rados put操作就是一个完整的文件,并不会进行拆分,我们尝试下看下

  1. [root@lab8106 ~]# dd if=/dev/zero of=16M bs=4M count=4
  2. [root@lab8106 ~]# rados -p rbd put 16M 16M
  3. [root@lab8106 ~]# rados -p rbd stat 16M
  4. rbd/16M mtime 2017-04-26 15:08:14.000000, size 16777216

可以看到我们put 16M的文件,在后台就是一个16M的对象

这个rados命令还有个参数是striper

  1. [root@lab8106 ~]# rados --help|grep stri
  2. --striper
  3. Use radostriper interface rather than pure rados

我们来用这个命令试一下

  1. [root@lab8106 ~]# dd if=/dev/zero of=strip16M bs=4M count=4
  2. [root@lab8106 ~]# rados -p rbd put strip16M strip16M --striper
  3. [root@lab8106 ~]# rados -p rbd ls |grep strip
  4. strip16M.0000000000000002
  5. strip16M.0000000000000003
  6. strip16M.0000000000000000
  7. strip16M.0000000000000001
  8. [root@lab8106 ~]# rados -p rbd --striper ls |grep strip
  9. strip16M
  10. [root@lab8106 ~]# rados -p rbd stat strip16M.0000000000000002
  11. rbd/strip16M.0000000000000002 mtime 2017-04-26 15:11:06.000000, size 4194304

可以看到这个16M的文件是被拆分成了4M一个的对象,存储到了后台的,我们开启下日志后看下有没有什么详细的信息,因为在rados参数当中确实没有找到可配置的选项

在/etc/ceph/ceph.conf当中添加

  1. debug_rados=20
  2. debug_striper=20

再次测试

  1. [root@lab8106 ~]# dd if=/dev/zero of=strip116M bs=4M count=4
  2. [root@lab8106 ~]# rados -p rbd put strip116M strip116M --striper
  3. ···
  4. sc is one, reset su to os
  5. su 4194304 sc 1 os 4194304 stripes_per_object 1
  6. ···

这个地方解释下意思

strip count is 1,重置strip unit为object size ,也就是4M

strip unit 4194304 ,strip count 1,object size 4194304,每个对象的条带为1

这个代码里面写了

https://github.com/ceph/ceph/blob/master/src/tools/rados/rados.cc

  1. --striper
  2. Use radostriper interface rather than pure rados

也就是这个rados在加了参数之后是调用了radostriper interface这个接口的,所以猜测这个条带的相关参数应该是在接口里面写死了的

https://github.com/ceph/ceph/blob/master/src/libradosstriper/RadosStriperImpl.cc

  1. /// default object layout
  2. struct ceph_file_layout default_file_layout = {
  3. fl_stripe_unit: init_le32(1<<22),
  4. fl_stripe_count: init_le32(1),
  5. fl_object_size: init_le32(1<<22),
  6. fl_cas_hash: init_le32(0),
  7. fl_object_stripe_unit: init_le32(0),
  8. fl_unused: init_le32(-1),
  9. fl_pg_pool : init_le32(-1),
  10. };

下面开始看下调试模式下改下这几个数值

下载代码

  1. git clone https://github.com/ceph/ceph.git
  2. git checkout -b myceph2 v10.2.3
  3. git submodule update --init --recursive

切换到10.2.3版本,用的make模式,没用cmake

  1. cd ceph
  2. ./install-deps.sh
  3. ./autogen.sh
  4. ./configure
  5. make -j 12

启动开发模式服务

  1. cd src
  2. ./vstart.sh --mon_num 1 --osd_num 3 --mds_num 1 --short -n -d

这样,dev cluster就起来了。修改部分源码重新make之后,需要关闭cluster,重启让代码生效,当然最好的是,你修改哪个模块,就重启那个模块就行,这里使用重启集群

  1. ./stop.sh all
  2. ./vstart.sh --mon_num 1 --osd_num 3 --mds_num 1 --short -d

查看状态

  1. [root@lab8106 src]# ./ceph -s -c ./ceph.conf

我们修改下代码

vim libradosstriper/RadosStriperImpl.cc

  1. /// default object layout
  2. struct ceph_file_layout default_file_layout = {
  3. fl_stripe_unit: init_le32(1<<21),
  4. fl_stripe_count: init_le32(2),
  5. fl_object_size: init_le32(1<<22),
  6. fl_cas_hash: init_le32(0),
  7. fl_object_stripe_unit: init_le32(0),
  8. fl_unused: init_le32(-1),
  9. fl_pg_pool : init_le32(-1),
  10. };

修改的是stripe_unit为2M,stripe_count为2,object_size为4M,也就是条带为2

修改完了后重新make

  1. ./stop.sh all
  2. ./vstart.sh --mon_num 1 --osd_num 3 --mds_num 1 --short -d

初始化集群,修改下配置文件增加调试信息

vim ./ceph.conf

  1. debug_rados=20
  2. debug_striper=20

创建文件

  1. [root@lab8106 ~]# dd if=/dev/zero of=debugstrip16M bs=4M count=4
  2. [root@lab8106 src]# ./rados -c ./ceph.conf --striper -p rbd put debugstrip16M debugstrip16M
  3. [root@lab8106 src]#./rados -c ./ceph.conf -p rbd stat debugstrip16M.0000000000000001
  4. rbd/debugstrip16M.0000000000000001 mtime 2017-04-26 15:38:41.483464
  5. 2017-04-26 15:37:27.000000, size 4194304

可以看到对象还是4M

我们截取下日志分析

  1. su 2097152 sc 2 os 4194304 stripes_per_object 2
  2. off 0 blockno 0 stripeno 0 stripepos 0 objectsetno 0 objectno 0 block_start 0
  3. added new extent(debugstrip16M.0000000000000000 (0)
  4. off 2097152 blockno 1 stripeno 0 stripepos 1 objectsetno 0 objectno 1 block_start 0
  5. added new extent(debugstrip16M.0000000000000001 (1)
  6. off 4194304 blockno 2 stripeno 1 stripepos 0 objectsetno 0 objectno 0 block_start 2097152
  7. added new extent(debugstrip16M.0000000000000000 (0)
  8. off 6291456 blockno 3 stripeno 1 stripepos 1 objectsetno 0 objectno 1 block_start 2097152
  9. added new extent(debugstrip16M.0000000000000001 (1)
  10. off 8388608 blockno 4 stripeno 2 stripepos 0 objectsetno 1 objectno 2 block_start 0
  11. added new extent(debugstrip16M.0000000000000002 (2)
  12. off 10485760 blockno 5 stripeno 2 stripepos 1 objectsetno 1 objectno 3 block_start 0
  13. added new extent(debugstrip16M.0000000000000003 (3)
  14. off 12582912 blockno 6 stripeno 3 stripepos 0 objectsetno 1 objectno 2 block_start 2097152
  15. added new extent(debugstrip16M.0000000000000002 (2)
  16. off 14680064 blockno 7 stripeno 3 stripepos 1 objectsetno 1 objectno 3 block_start 2097152
  17. added new extent(debugstrip16M.0000000000000003 (3)

从上面可以看到先在debugstrip16M.0000000000000000写了2M,在debugstrip16M.0000000000000001写了2M,

然后在debugstrip16M.0000000000000000追加写了2M,并且是从block_start 2097152开始的,每个对象是写了两次的并且每次写的就是条带的大小的2M,跟修改上面的条带大小和对象大小是一致的,并且可以很清楚的看到写对象的过程

总结

本篇尝试了用rados来测试strip功能,并且顺带讲了下怎么在开发模式下修改代码并测试,如果自己写客户端的话,利用librados的时候,可以考虑使用libradosstriper条带来增加一定的性能

参考文档

准备Ceph开发环境

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-04-26

rados put striper功能的调试的更多相关文章

  1. YUV422蓝屏显示输出功能辅助调试

    YUV422蓝屏显示输出功能辅助调试 YUV422有YUYV,YVYU,UYVY,VYUY四种,以下笔者就就以UYVY为例介绍一下数据构成.因为常常要跟视频输入打交道,所以YUV422这种常见的视频信 ...

  2. 利用 Eclipse IDE 的强大功能远程调试 Java 应用程序

    II. Eclipse 连接套接字模式下的 VM 调用示例(具体引用实践) 说明:不管采用哪种方式,调试的源代码都在eclipse的环境下 一.调试方式一(将目标应用程序作为调试的服务器,eclips ...

  3. openStack queens 功能验证调试

    linux已经加载 的内核模块查看

  4. 使用 JLINK 的 RTT 功能 进行 调试打印数据

    jlink V9 时,在 SWD 接口 模式 时  ,要 接 SWO 这个引脚 ,否则导致 在 FreeRTOS的任务中不能使用,  正确的 接线方法 是  VCC,GND,SWDIO,SWCLK,S ...

  5. Eclipse的调试功能的10个小窍门[转]

    原文链接:http://www.importnew.com/6164.html 你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常 ...

  6. Eclipse的调试功能的10个小窍门

    你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常值得我们来了解一些用得到的功能,可以帮我们节约很多时间.所以在这个主题上值得我再 ...

  7. Eclipse的调试功能(转)(让Eclipse也能有VS的即时窗口那样的即时代码调试功能)

    前言:可以很明确的说明,eclipse也有像vs那样的即时窗口来运行即时代码的功能. 调试的界面如下: 如果要像vs那样的即时调试功能,需要做一些设置,就是Expressions功能. 开通步骤:Wi ...

  8. Chrome浏览器调试,console简述

    作为一个前端开发者,不可避免的需要进行各种各样的调试. 在谷歌浏览器出来以前,火狐的firebug是特别有名的一款调试工具,不过自从谷歌浏览器诞生以来,其自带的开发者工具足以媲美firebug,某种程 ...

  9. 【转】你所不知道的Android Studio调试技巧

    这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...

随机推荐

  1. 【编程学习】浅谈哈希表及用C语言构建哈希表!

    哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...

  2. Docker-V 详解

      1. 作用 挂载宿主机的一个目录. 2. 案例 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:   # docker run -it -v ...

  3. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)

    介绍   Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的.即使是基础学习也很有挺有挑战性.   在这篇文章中,我想用最少的代码写出一个可用的 API 服务. ...

  4. C++学习笔记---数据类型

    1.整型 C++中能够表示整型的类型有几下几种方式,区别在于所占内存空间不足 数据类型 占用空间 取值范围 short(短整型) 2字节 (-2^15~2^15-1) int(整型) 4字节 (-2^ ...

  5. Vue3: 如何以 Vite 创建,以 Vue Router, Vuex, Ant Design 开始应用

    本文代码: https://github.com/ikuokuo/start-vue3 在线演示: https://ikuokuo.github.io/start-vue3/ Vite 创建 Vue ...

  6. abstract关键字的说法

    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...

  7. Pytest学习(四) - fixture的使用

    前言 写这篇文章,整体还是比较坎坷的,我发现有知识断层,理解再整理写出来,还真的有些难. 作为java党硬磕Python,虽然对我而言是常事了(因为我比较爱折腾,哈哈),但这并不能影响我的热情. 执念 ...

  8. scott lock

    账户被锁: cmd --->sqlplus /nolog--->conn sys/change_on_install as sysdba;---->alter user scott ...

  9. oracle索引失效情况(转)

    1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.   由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Orac ...

  10. mysql在DOS环境下操作的命令

    管理员运行cmd,执行启动mysql命令:net start MySQL版本号 登录数据库:mysql -u root -p 输入密码 创建数据库:drop database if exists 数据 ...