阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ceph性能调优——Journal与tcmalloc

231次阅读
没有评论

共计 5421 个字符,预计需要花费 14 分钟才能阅读完成。

最近对 Ceph 做了一下简单的性能测试,发现 Journal 的性能与 tcmalloc 的版本对性能影响很大。

测试结果

# rados -p tmppool -b 4096  bench 120 write  -t 32 --run-name test1
object size bw(MB/s) lantency(s) pool size journal tcmalloc version max thread cache
4K 2.676 0.0466848 3 SATA 2.0  
4K 3.669 0.0340574 2 SATA 2.0  
4K 10.169 0.0122452 2 SSD 2.0  
4K 5.34 0.0234077 3 SSD 2.0  
4K 7.62 0.0164019 3 SSD 2.1  
4K 8.838 0.0141392 3 SSD 2.1 2048M

可以看到:

  • (1)SSD journal 带来了一倍的性能提升;
  • (2) 使用 tcmalloc 2.1,并调整 max thread cache 参数后,也带来了将近一倍的性能提升;
  • (3) 副本数量对性能的影响也很大。

tcmalloc 的问题

Ceph 自带的 tcmalloc 为 2.0,测试过程中发现 CPU 利用率很高,几乎 90%:

Samples: 265K of event 'cycles', Event count (approx.): 104385445900
+  27.58%  libtcmalloc.so.4.1.0    [.] 
tcmalloc::CentralFreeList::FetchFromSpans()
+  15.25%  libtcmalloc.so.4.1.0    [.] 
tcmalloc::ThreadCache::ReleaseToCentralCache(tcmalloc::ThreadCache::FreeList*, 
unsigned long,
+  12.20%  libtcmalloc.so.4.1.0    [.] 
tcmalloc::CentralFreeList::ReleaseToSpans(void*)
+   1.63%  perf                    [.] append_chain
+   1.39%  libtcmalloc.so.4.1.0    [.] 
tcmalloc::CentralFreeList::ReleaseListToSpans(void*)
+   1.02%  libtcmalloc.so.4.1.0    [.] 
tcmalloc::CentralFreeList::RemoveRange(void**, void**, int)
+   0.85%  libtcmalloc.so.4.1.0    [.] 0x0000000000017e6f
+   0.75%  libtcmalloc.so.4.1.0    [.] 
tcmalloc::ThreadCache::IncreaseCacheLimitLocked()
+   0.67%  libc-2.12.so            [.] memcpy
+   0.53%  libtcmalloc.so.4.1.0    [.] operator delete(void*)

这是因为 tcmalloc 的 TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES 默认值太小,导致线程竞争引起的。邮件列表已经很多讨论这个问题:

  • Hitting tcmalloc bug even with patch applied
  • tcmalloc issues

调整该参数后,性能大幅提升,同时 CPU 利用率大幅下降。

Samples: 280K of event 'cycles', Event count (approx.): 73401082082
  3.92%  libtcmalloc.so.4.1.2    [.] tcmalloc::CentralFreeList::FetchFromSpans()
  3.52%  libtcmalloc.so.4.1.2    [.] tcmalloc::ThreadCache::ReleaseToCentralCache(tcmalloc::ThreadCache::FreeList*, unsigned long, i
  2.41%  libtcmalloc.so.4.1.2    [.] 0x0000000000017dcf
  1.78%  libc-2.12.so            [.] memcpy
  1.37%  libtcmalloc.so.4.1.2    [.] operator delete(void*)
  1.32%  libtcmalloc.so.4.1.2    [.] tcmalloc::CentralFreeList::ReleaseToSpans(void*)
  1.00%  [kernel]                [k] _raw_spin_lock

Journal 相关

Journal 大小

Journal 大小的选择尊循下面的规则:

osd journal size = {2 * (expected throughput * filestore max sync interval)}

即 osd journal 的大小应该设置为 (磁盘的带宽 * 同步时间) 的 2 倍。参考这里。

Journal 存储介质

由于 OSD 先写日志,然后异步写数据,所以写 journal 的速度至关重要。Journal 的存储介质的选择参考这里

SSD: Intel s3500 240G 的结果:

# fio --filename=/data/fio.dat --size=5G --direct=1 --sync=1 --bs=4k  --iodepth=1 --numjobs=32 --thread  --rw=write --runtime=120 --group_reporting --time_base --name=test_write
  write: io=3462.8MB, bw=29547KB/s, iops=7386 , runt=120005msec
    clat (usec): min=99 , max=51201 , avg=4328.97, stdev=382.90
     lat (usec): min=99 , max=51201 , avg=4329.26, stdev=382.86

在线调整 journal

  • (1)set noout
# ceph osd set noout
set noout
# ceph -s
    cluster 4a680a44-623f-4f5c-83b3-44483ba91872
     health HEALTH_WARN noout flag(s) set
…
  • (2)stop all osd
# service ceph stop osd
  • (3)flush journal
# cat flush.sh 
#!/bin/bash
i=12
num=12
end=`expr $i + $num`
while [$i -lt $end]
do
        ceph-osd -i $i --flush-journal
        i=$((i+1))
done
  • (4)change ceph.conf

增加如下内容:

[osd] osd journal = /data/ceph/osd$id/journal osd journal size = 5120

  • (5)create new journal
# cat mkjournal.sh 
#!/bin/bash
i=12
num=12
end=`expr $i + $num`
while [$i -lt $end]
do
        mkdir -p /data/ceph/osd$i       
        ceph-osd -i $i --mkjournal
        #ceph-osd -i $i --mkjournal     
        i=$((i+1))
done
  • (6)start ceph-osd deamon
# service ceph start osd
  • (7)clear noout
# ceph osd unset noout

两个小问题

  • 问题 1

在 ext3 文件系统上,mkjournal 会报下面的错误:

2015-08-17 14:45:30.588136 7fc865b3a800 -1 journal FileJournal::open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway 2015-08-17 14:45:30.588160 7fc865b3a800 -1 journal FileJournal::open_file : unable to preallocation journal to 5368709120 bytes: (22) Invalid argument 2015-08-17 14:45:30.588171 7fc865b3a800 -1 filestore(/var/lib/ceph/osd/ceph-23) mkjournal error creating journal on /data/ceph/osd23/journal: (22) Invalid argument 2015-08-17 14:45:30.588184 7fc865b3a800 -1 ** ERROR: error creating fresh journal /data/ceph/osd23/journal for object store /var/lib/ceph/osd/ceph-23: (22) Invalid argument

这是因为 ext3 不支持 fallocate:

int FileJournal::_open_file(int64_t oldsize, blksize_t blksize,
          bool create)
{
...
  if (create && (oldsize < conf_journal_sz)) {uint64_t newsize(g_conf->osd_journal_size);
    newsize <<= 20;
    dout(10) << "_open extending to" << newsize << "bytes" << dendl;
    ret = ::ftruncate(fd, newsize);
    if (ret < 0) {
      int err = errno;
      derr << "FileJournal::_open_file : unable to extend journal to"
     << newsize << "bytes:" << cpp_strerror(err) << dendl;
      return -err;
    }
    ret = ::posix_fallocate(fd, 0, newsize);
    if (ret) {
      derr << "FileJournal::_open_file : unable to preallocation journal to"
     << newsize << "bytes:" << cpp_strerror(ret) << dendl;
      return -ret;
    }
    max_size = newsize;
  }
  • 问题 2

当 journal 为文件时,打开 journal 文件时,会输出下面的错误:

2015-08-19 17:27:48.900894 7f1302791800 -1 journal FileJournal::_open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway

即 ceph 对于这种情况不会使用 aio,为什么呢???

int FileJournal::_open(bool forwrite, bool create)
{
...
  if (S_ISBLK(st.st_mode)) {ret = _open_block_device();
  } else {if (aio && !force_aio) {
      derr << "FileJournal::_open: disabling aio for non-block journal.  Use"
     << "journal_force_aio to force use of aio anyway" << dendl;
      aio = false; /// 不使用 aio
    }
    ret = _open_file(st.st_size, st.st_blksize, create);
  }
...

 

在 CentOS 7.1 上安装分布式存储系统 Ceph  http://www.linuxidc.com/Linux/2015-08/120990.htm

Ceph 环境配置文档 PDF http://www.linuxidc.com/Linux/2013-05/85212.htm 

CentOS 6.3 上部署 Ceph http://www.linuxidc.com/Linux/2013-05/85213.htm 

Ceph 的安装过程 http://www.linuxidc.com/Linux/2013-05/85210.htm 

HOWTO Install Ceph On FC12, FC 上安装 Ceph 分布式文件系统 http://www.linuxidc.com/Linux/2013-05/85209.htm 

Ceph 文件系统安装 http://www.linuxidc.com/Linux/2013-05/85208.htm 

CentOS 6.2 64 位上安装 Ceph 0.47.2 http://www.linuxidc.com/Linux/2013-05/85206.htm 

Ubuntu 12.04 Ceph 分布式文件系统 http://www.linuxidc.com/Linux/2013-04/82588.htm 

Fedora 14 上安装 Ceph 0.24 http://www.linuxidc.com/Linux/2011-01/31580.htm 

Ceph 的详细介绍 :请点这里
Ceph 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-10/124527.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5421字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中