rados put striper功能的调试

前言

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

实践过程

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

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

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

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

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

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

我们来用这个命令试一下

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

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

debug_rados=20
debug_striper=20

再次测试

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

这个地方解释下意思

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

--striper
       Use radostriper interface rather than pure rados

也就是这个rados在加了参数之后是调用了radostriper interface这个接口的,所以猜测这个条带的相关参数应该是在接口里面写死了的 https://github.com/ceph/ceph/blob/master/src/libradosstriper/RadosStriperImpl.cc

/// default object layout
struct ceph_file_layout default_file_layout = {
 fl_stripe_unit: init_le32(1<<22),
 fl_stripe_count: init_le32(1),
 fl_object_size: init_le32(1<<22),
 fl_cas_hash: init_le32(0),
 fl_object_stripe_unit: init_le32(0),
 fl_unused: init_le32(-1),
 fl_pg_pool : init_le32(-1),
};

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

下载代码

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

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

cd ceph
./install-deps.sh
./autogen.sh
./configure
make -j 12

启动开发模式服务

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

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

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

查看状态

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

我们修改下代码 vim libradosstriper/RadosStriperImpl.cc

/// default object layout
struct ceph_file_layout default_file_layout = {
 fl_stripe_unit: init_le32(1<<21),
 fl_stripe_count: init_le32(2),
 fl_object_size: init_le32(1<<22),
 fl_cas_hash: init_le32(0),
 fl_object_stripe_unit: init_le32(0),
 fl_unused: init_le32(-1),
 fl_pg_pool : init_le32(-1),
};

修改的是stripe_unit为2M,stripe_count为2,object_size为4M,也就是条带为2 修改完了后重新make

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

初始化集群,修改下配置文件增加调试信息 vim ./ceph.conf

debug_rados=20debug_striper=20

创建文件

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

可以看到对象还是4M 我们截取下日志分析

su 2097152 sc 2 os 4194304 stripes_per_object 2
off 0 blockno 0 stripeno 0 stripepos 0 objectsetno 0 objectno 0 block_start 0added new extent(debugstrip16M.0000000000000000 (0) 
off 2097152 blockno 1 stripeno 0 stripepos 1 objectsetno 0 objectno 1 block_start 0 added new extent(debugstrip16M.0000000000000001 (1) 
off 4194304 blockno 2 stripeno 1 stripepos 0 objectsetno 0 objectno 0 block_start 2097152added new extent(debugstrip16M.0000000000000000 (0)   
off 6291456 blockno 3 stripeno 1 stripepos 1 objectsetno 0 objectno 1 block_start 2097152added new extent(debugstrip16M.0000000000000001 (1)
off 8388608 blockno 4 stripeno 2 stripepos 0 objectsetno 1 objectno 2 block_start 0added new extent(debugstrip16M.0000000000000002 (2) 
off 10485760 blockno 5 stripeno 2 stripepos 1 objectsetno 1 objectno 3 block_start 0added new extent(debugstrip16M.0000000000000003 (3) 
off 12582912 blockno 6 stripeno 3 stripepos 0 objectsetno 1 objectno 2 block_start 2097152 added new extent(debugstrip16M.0000000000000002 (2)
off 14680064 blockno 7 stripeno 3 stripepos 1 objectsetno 1 objectno 3 block_start 2097152 added new extent(debugstrip16M.0000000000000003 (3)

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

总结

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

原文发布于微信公众号 - 磨磨谈(momotan1987)

原文发表时间:2017-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木头编程 - moTzxx

微信小程序Ⅱ [全局变量的配置/使用]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1K50
来自专栏Laoqi's Linux运维专列

Saltstack 远程操作(grains,pillar)服务安装+配置管理

24670
来自专栏小尘哥的专栏

springboot中使用tk.mybatis代码生成器

tk.mybatis是对mybatis的进一步封装,它对基本的单表的增删改查又做了进一步封装,springboot中的使用之前已经写过了,如果没用过,请参考我之...

34420
来自专栏DOTNET

【翻译】MongoDB指南/CRUD操作(三)

【原文地址】https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Tran...

30490
来自专栏用户画像

Window 下安装 Redis

下载地址:https://github.com/MSOpenTech/redis/releases。

6910
来自专栏从零开始学自动化测试

pytest文档21-pytest-html报告优化

pytest-html报告中当用到参数化时候,获取用例的nodeid里面有中文时候,会显示[\u6350\u52a9\u6211\u4eec]这种编码(再次声明...

91250
来自专栏Python中文社区

Python多进程抓取全国邮政编码和长途区号

由于Python设计的限制(就是咱们常用的CPython)最多只能用满1个CPU核心。Python提供了非常好用的多进程包multiprocessing,你只需...

28190
来自专栏一个爱吃西瓜的程序员

requests库的基本用法

Requests 是使用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库。 它比urllib库更加方便,可以节约...

11310
来自专栏张善友的专栏

应用IBatisNet+Castle进行项目的开发

       最近在做一个项目,项目的需求不够明确,这是做项目的大忌,但是没有办法。项目的架构采用Dotnet平台使用C#进行开发,为了加快项目的开发进度,采用...

187100
来自专栏Duncan's Blog

在非root用户下安装mpi4py

安装mpi4py所需要的依赖包(python2.7版本/Cpython/Openmpi) 1.源码包安装Python2.7版本

25310

扫码关注云+社区

领取腾讯云代金券