前言

之前对于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.3
git 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=20
debug_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 0
added 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 2097152
added new extent(debugstrip16M.0000000000000000 (0)
off 6291456 blockno 3 stripeno 1 stripepos 1 objectsetno 0 objectno 1 block_start 2097152
added new extent(debugstrip16M.0000000000000001 (1)
off 8388608 blockno 4 stripeno 2 stripepos 0 objectsetno 1 objectno 2 block_start 0
added new extent(debugstrip16M.0000000000000002 (2)
off 10485760 blockno 5 stripeno 2 stripepos 1 objectsetno 1 objectno 3 block_start 0
added 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条带来增加一定的性能

参考文档

准备Ceph开发环境

变更记录

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

最新文章

  1. HQL常用的查询语句
  2. 推荐相关学习 &amp; 典型算法、典型特征、典型推荐系统框架
  3. PAT (Basic Level) Practise:1002. 写出这个数
  4. Ubuntu15.10使用mysql
  5. ${fn:length(worklicenseList)} #表示不在struts堆栈里,没有#表示从struts堆栈里取
  6. debian 学习记录-1 -安装
  7. Java学习笔记:语言基础
  8. Android图像处理2
  9. CF 319B Psychos in a Line 【单调队列】
  10. mysql自增
  11. Codeforces Round #236 (Div. 2)E. Strictly Positive Matrix(402E)
  12. sql中charindex和cast结合使用
  13. Jump的计划
  14. cocos2d-x 获得系统语言繁体
  15. Docker,容器,虚拟机和红烧肉
  16. curl命令用于模拟http浏览器发起动作
  17. Supervisor使用说明
  18. WordPress慢的八种解决方法(用排查法解决)
  19. sonar——Synchronized classes Vector, Hashtable, Stack and StringBuffer should not be used
  20. Eclipse Golang 开发环境搭建 GoClipse 插件

热门文章

  1. charles系列
  2. C语言和单片机C语言为什么会有差异?虽不同但理同!
  3. 【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?
  4. centos8安装RabbitMQ
  5. BERT模型详解
  6. c# 误区系列(二)
  7. SVN如何回滚到指定版本
  8. 万字长文深入理解java中的集合-附PDF下载
  9. 6个冷门但实用的pandas知识点
  10. SpringBoot中的全局异常处理