背景 最近翻ceph的官方的博客,发现了一篇博客提到了一个ubuntu下面的编译参数引起的rocksdb的性能下降,这个地方应该是ceph官方代码的参数没生效
受影响的系统
P版本之前的ceph版本 
操作系统是ubuntu的 
某些ceph版本 
 
这个要素比较多,所以运行的环境并不一定受到影响,那么我们看下,收到影响的版本是哪些,非ubuntu的系统可以忽略这个问题
我对15的版本比较熟,就以这个版本举例子
受到影响的版本 这个版本是从ceph官方同步过来的版本
1 https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-15.2.17/pool/main/c/ceph/
不受影响的版本 1 https://launchpad.net/ubuntu/focal/+source /ceph
这个是ubuntu官方打包的版本
下载不同的版本 源文件
1 2 3 4 5 6 7 8 9 10 11 12 root@lab103:~yes ]  https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-15.2.17 focal  main
上面的源是安装ceph的软件包的,如果屏蔽掉最后一行,安装的就是ubuntu官方的版本,如果留着最后一行,安装的就是ceph官方的版本,包的名称不一样,这个很好区分
两个版本的区别 我们下载ubuntu官方的debian的打包文件
1 wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/ceph/15.2.17-0ubuntu0.20.04.6/ceph_15.2.17-0ubuntu0.20.04.6.debian.tar.xz
ubuntu的官方的包是把debian的目录剥离出来的
我们再下载ceph官方的源码包,这个跟git里面是同步的我们看下内容
1 wget https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-15.2.17/pool/main/c/ceph/ceph_15.2.17.orig.tar.gz
ceph的官方包里面是有debian目录的,我们直接查看内容
我们需要比对的是debian/rules里面的内容
ubuntu官方的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 export  JAVAC=javac
ceph官方的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 extraopts += -DWITH_OCF=ON -DWITH_LTTNG=ON
区别就是这个
1 extraopts += -DCMAKE_BUILD_TYPE=RelWithDebInfo
RelWithDebInfo: 既优化又能调试的版本
这个参数带来的效果是
1 -DCMAKE_CXX_FLAGS='-Wno-deprecated-copy -Wno-pessimizing-move' " 
会带来这两个参数,以及一些其它的关闭,属于生产包需要加这个参数好一点
ceph官方是放在自己的cmake里面控制,但是deb打包的时候,有自己的这个参数,变量就被冲掉了,也就是没生效
1 https://github.com/ceph/ceph/pull/55500
官方现在改了,应该是解决了,但是ubuntu官方里面是直接在最上层就用参数去控制了,也就没有这个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 endif()"-Wno-deprecated-copy"  HAS_WARNING_DEPRECATED_COPY)set (rocksdb_CXX_FLAGS "${CMAKE_CXX_FLAGS} " )if (HAS_WARNING_DEPRECATED_COPY)set (rocksdb_CXX_FLAGS -Wno-deprecated-copy)" -Wno-deprecated-copy" )"-Wno-pessimizing-move"  HAS_WARNING_PESSIMIZING_MOVE)if (HAS_WARNING_PESSIMIZING_MOVE)set (rocksdb_CXX_FLAGS "${rocksdb_CXX_FLAGS}  -Wno-pessimizing-move" )" -Wno-pessimizing-move" )if (rocksdb_CXX_FLAGS)'${rocksdb_CXX_FLAGS}' )
打包过程可以看到这两个参数加进去了没
1 2 3 [  8%] Performing configure step for  'rocksdb_ext' cd  /ceph/ceph-15.2.17/obj-x86_64-linux-gnu/src/rocksdb && /usr/bin/cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DWITH_GFLAGS=OFF -DCMAKE_PREFIX_PATH= -DCMAKE_CXX_COMPILER=/usr/bin/c++ -DWITH_SNAPPY=TRUE -DWITH_LZ4=TRUE -DLZ4_INCLUDE_DIR=/usr/include -DLZ4_LIBRARIES=/usr/lib/x86_64-linux-gnu/liblz4.so -DWITH_ZLIB=TRUE -DPORTABLE=ON -DCMAKE_AR=/usr/bin/ar -DCMAKE_BUILD_TYPE=RelWithDebInfo -DFAIL_ON_WARNINGS=OFF -DUSE_RTTI=1 "-GUnix Makefiles"  -DCMAKE_C_FLAGS=-Wno-stringop-truncation "-DCMAKE_CXX_FLAGS=' -Wno-deprecated-copy -Wno-pessimizing-move'"  "-GUnix Makefiles"  /ceph/ceph-15.2.17/src/rocksdb
那么我们整体捋一捋
1 2 - ceph在代码里面加了参数,参数被打包过程冲掉了,引起了性能下降
大概就是这么回事,差不多就是发行版本出的包,没有按优化的版本打包,问题很小,影响还比较大,如果正好使用的就是这个ubuntu的官方包的话
性能测试 上面是说了这个问题的来源,我们来体验一下这个性能的区别
为了测试的准确性,构建了一个单机,单副本的环境,单个nvme的osd,在宿主机创建好osd之后,停止osd,然后把osd映射到docker里面进行手动启动
这样做的目的是,osd不变,减少变量,容器系统一致,只替换了ceph的包
容器启动方式
1 docker run -it --privileged=true  -v /dev/:/dev/ -v /var/lib/ceph/:/var/lib/ceph -v /etc/ceph:/etc/ceph --network host ubuntu:focal /bin/bash --name ceph_deb
ceph官方包 1 2 root@lab103:/
手动启动osd
1 /usr/bin/ceph-osd -f --cluster ceph --id  0 --setuser ceph --setgroup ceph
测试
1 rados -p data bench 30 write -b 4096
也可以用其它命令,小io4k的比较明显,时间不久,就都贴上来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 [root@lab103 zp]for  up to 30 seconds or 0 objects
ubuntu官方包 1 2 3 4 root@lab103:/
手动启动osd
1 /usr/bin/ceph-osd -f --cluster ceph --id  0 --setuser ceph --setgroup ceph
测试
1 rados -p data bench 30 write -b 4096
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 [root@lab103 zp]for  up to 30 seconds or 0 objects
一个iops 14976(58MB/s)  - ubuntu的包
可以看到差距还是很明显的
这个如果正好碰到了,可以按ubuntu这个方式改下debian的rule,或者把ceph的pr弄进去重新打包即可,具体验证有没有问题,可以通过检查下打包的参数或者直接单机验证下性能也可以