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.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条带来增加一定的性能
参考文档
变更记录
| Why | Who | When |
|---|---|---|
| 创建 | 武汉-运维-磨渣 | 2017-04-26 |
rados put striper功能的调试的更多相关文章
- YUV422蓝屏显示输出功能辅助调试
YUV422蓝屏显示输出功能辅助调试 YUV422有YUYV,YVYU,UYVY,VYUY四种,以下笔者就就以UYVY为例介绍一下数据构成.因为常常要跟视频输入打交道,所以YUV422这种常见的视频信 ...
- 利用 Eclipse IDE 的强大功能远程调试 Java 应用程序
II. Eclipse 连接套接字模式下的 VM 调用示例(具体引用实践) 说明:不管采用哪种方式,调试的源代码都在eclipse的环境下 一.调试方式一(将目标应用程序作为调试的服务器,eclips ...
- openStack queens 功能验证调试
linux已经加载 的内核模块查看
- 使用 JLINK 的 RTT 功能 进行 调试打印数据
jlink V9 时,在 SWD 接口 模式 时 ,要 接 SWO 这个引脚 ,否则导致 在 FreeRTOS的任务中不能使用, 正确的 接线方法 是 VCC,GND,SWDIO,SWCLK,S ...
- Eclipse的调试功能的10个小窍门[转]
原文链接:http://www.importnew.com/6164.html 你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常 ...
- Eclipse的调试功能的10个小窍门
你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常值得我们来了解一些用得到的功能,可以帮我们节约很多时间.所以在这个主题上值得我再 ...
- Eclipse的调试功能(转)(让Eclipse也能有VS的即时窗口那样的即时代码调试功能)
前言:可以很明确的说明,eclipse也有像vs那样的即时窗口来运行即时代码的功能. 调试的界面如下: 如果要像vs那样的即时调试功能,需要做一些设置,就是Expressions功能. 开通步骤:Wi ...
- Chrome浏览器调试,console简述
作为一个前端开发者,不可避免的需要进行各种各样的调试. 在谷歌浏览器出来以前,火狐的firebug是特别有名的一款调试工具,不过自从谷歌浏览器诞生以来,其自带的开发者工具足以媲美firebug,某种程 ...
- 【转】你所不知道的Android Studio调试技巧
这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...
随机推荐
- 【状态压缩DP】SCOI2009 围豆豆
题目大意 洛谷链接 在一个\(N×M\)的矩阵方格内分布着\(D\)颗豆子,每颗豆有不同的分值\(V_i\).游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到 ...
- spring boot: 设计接口站api的版本号,支持次版本号(spring boot 2.3.2)
一,为什么接口站的api要使用版本号? 1,当服务端接口的功能发生改进后, 客户端如果不更新版本, 则服务端返回的功能可能不能使用, 所以在服务端功能升级后, 客户端也要相应的使用 ...
- 实战:xfs文件系统的备份和恢复
概述 XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统. centos7选择xfs格式作为默认文件系统 ...
- MySql中varchar和char,如何选择合适的数据类型?
背景 学过MySQL的同学都知道MySQL中varchar和char是两种最主要的字符串类型,varchar是变长的类型,而char是固定长度.那关于如何选择类型就成为令人头疼的事,很多初学者为了保证 ...
- linux 卸载 umount 提示device is busy
思路:先杀掉挂载的目录(如:/usr1/)这个进程 fuser -v /usr1/ 再卸载
- localStorage.getItem得到的是[object Object] 的解决方案
设计背景: 购物车要实现本地存储,避免刷新页面数据丢失 实现方案: 1,本地储存,进入页面获取本地数据,在进行数据操作 2,每操作一次数据就将数据传给后台进行保存,(操作数据多,用户量大对服务器造成压 ...
- Jenkins部署持续集成远程机节点的问题
工作需要把工作电脑作为持续集成的执行机,最近研究Jenkins,在工作电脑上搭了一套环境,期间把原来的JDK删除掉了,导致持续集成的Jenkins节点slave-agent.jnlp打不开.解决方法是 ...
- 看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 final 是 Java 中的关键字 ...
- 计算机网络:TCP协议建立连接的过程为什么是三次握手而不是两次?【对于网上的两种说法我的思考】
网上关于这个问题吵得很凶,但是仔细看过之后我更偏向认为两种说的是一样的. 首先我们来看看 TCP 协议的三次握手过程 如上图所示: 解释一下里面的英文: 里面起到作用的一些标志位就是TCP报文首部里的 ...
- ETCD核心机制解析
ETCD整体机制 etcd 是一个分布式的.可靠的 key-value 存储系统,它适用于存储分布式系统中的关键数据. etcd 集群中多个节点之间通过Raft算法完成分布式一致性协同,算法会选举出一 ...