ceph 优化配置

1. Linux OS

Kernel pid max

echo 4194303 > /proc/sys/kernel/pid_max

Jumbo frames, 交换机端需要支持该功能,系统网卡设置才有效果

ifconfig eth0 mtu 9000

永久设置

echo "MTU=9000" | tee -a /etc/sysconfig/network-script/ifcfg-eth0
/etc/init.d/networking restart

read_ahead, 通过数据预读并且记载到随机访问内存方式提高磁盘读操作,查看默认值


cat /sys/block/sda/queue/read_ahead_kb

根据一些Ceph的公开分享,8192是比较理想的值

echo "8192" > /sys/block/sda/queue/read_ahead_kb

swappiness, 主要控制系统对swap的使用,这个参数的调整最先见于UnitedStack公开的文档中,猜测调整的

原因主要是使用swap会影响系统的性能。

echo "vm.swappiness = 0" | tee -a /etc/sysctl.conf

I/O Scheduler,关于I/O Scheculder的调整网上已经有很多资料,这里不再赘述,简单说SSD要用noop,SATA/SAS使用deadline。

echo "deadline" > /sys/block/sd[x]/queue/scheduler
echo "noop" > /sys/block/sd[x]/queue/scheduler
cgroup

这方面的文章好像比较少,昨天在和Ceph社区交流过程中,Jan Schermer说准备把生产环境中的一些脚本贡献出来,但是暂时还没有,他同时也列举了一些使用cgroup进行隔离的原因。

不在process和thread在不同的core上移动(更好的缓存利用)
减少NUMA的影响
网络和存储控制器影响 - 较小
通过限制cpuset来限制Linux调度域(不确定是不是重要但是是最佳实践)
如果开启了HT,可能会造成OSD在thread1上,KVM在thread2上,并且是同一个core。Core的延迟和性能取决于其他一个线程做什么。

2. Ceph Configurations

[global]

参数名描述默认值建议值
public network客户端访问网络 192.168.100.0/24
cluster network集群网络 192.168.1.0/24
max open files如果设置了该选项,Ceph会设置系统的max open fds0131072

查看系统最大文件打开数可以使用命令

cat /proc/sys/fs/file-max

[osd] - filestore

参数名描述默认值建议值
filestore xattr use omap为XATTRS使用object map,EXT4文件系统时使用,XFS或者btrfs也可以使用falsetrue
filestore max sync interval从日志到数据盘最大同步间隔(seconds)515
filestore min sync interval从日志到数据盘最小同步间隔(seconds)0.110
filestore queue max ops数据盘最大接受的操作数50025000
filestore queue max bytes数据盘一次操作最大字节数(bytes)100 << 2010485760
filestore queue committing max ops数据盘能够commit的操作数5005000
filestore queue committing max bytes数据盘能够commit的最大字节数(bytes)100 << 2010485760000
filestore op threads并发文件系统操作数232
  • 调整omap的原因主要是EXT4文件系统默认仅有4K
  • filestore queue相关的参数对于性能影响很小,参数调整不会对性能优化有本质上提升

[osd] - journal

参数名描述默认值建议值
osd journal sizeOSD日志大小(MB)512020000
journal max write bytesjournal一次性写入的最大字节数(bytes)10 << 201073714824
journal max write entriesjournal一次性写入的最大记录数10010000
journal queue max opsjournal一次性最大在队列中的操作数50050000
journal queue max bytesjournal一次性最大在队列中的字节数(bytes)10 << 2010485760000
  • Ceph OSD Daemon stops writes and synchronizes the journal with the filesystem, allowing Ceph OSD Daemons to trim operations from the journal and reuse the space.
  • 上面这段话的意思就是,Ceph OSD进程在往数据盘上刷数据的过程中,是停止写操作的。

[osd] - osd config tuning

参数名描述默认值建议值
osd max write sizeOSD一次可写入的最大值(MB)90512
osd client message size cap客户端允许在内存中的最大数据(bytes)5242880002147483648
osd deep scrub stride在Deep Scrub时候允许读取的字节数(bytes)524288131072
osd op threadsOSD进程操作的线程数28
osd disk threadsOSD密集型操作例如恢复和Scrubbing时的线程14
osd map cache size保留OSD Map的缓存(MB)5001024
osd map cache bl sizeOSD进程在内存中的OSD Map缓存(MB)50128
osd mount options xfsCeph OSD xfs Mount选项rw,noatime,inode64rw,noexec,nodev,noatime,nodiratime,nobarrier

增加osd op threads和disk threads会带来额外的CPU开销

[osd] - recovery tuning

参数名描述默认值建议值
osd recovery op priority恢复操作优先级,取值1-63,值越高占用资源越高104
osd recovery max active同一时间内活跃的恢复请求数1510
osd max backfills一个OSD允许的最大backfills数104

[osd] - client tuning

参数名描述默认值建议值
rbd cacheRBD缓存truetrue
rbd cache sizeRBD缓存大小(bytes)33554432268435456
rbd cache max dirty缓存为write-back时允许的最大dirty字节数(bytes),如果为0,使用write-through25165824134217728
rbd cache max dirty age在被刷新到存储盘前dirty数据存在缓存的时间(seconds)15

关闭Debug

3. PG Number

PG和PGP数量一定要根据OSD的数量进行调整,计算公式如下,但是最后算出的结果一定要接近或者等于一个2的指数。

Total PGs = (Total_number_of_OSD * 100) / max_replication_count

例如15个OSD,副本数为3的情况下,根据公式计算的结果应该为500,最接近512,所以需要设定该pool(volumes)的pg_num和pgp_num都为512.

ceph osd pool set volumes pg_num 512
ceph osd pool set volumes pgp_num 512

4. CRUSH Map

CRUSH是一个非常灵活的方式,CRUSH MAP的调整取决于部署的具体环境,这个可能需要根据具体情况进行分析,这里面就不再赘述了。

5. 其他因素的影响

ceph osd perf
生产过程中一个由于在集群中存在一个性能不好的磁盘,导致整个集群性能下降的case。通过osd perf可以提供磁盘latency的状况,同时在运维过程中也可以作为监控的一个重要指标,很明显在下面的例子中,OSD 8的磁盘延时较长,所以需要考虑将该OSD剔除出集群:

ceph osd perf
osd fs_commit_latency(ms) fs_apply_latency(ms)
  0                    14                   17
  1                    14                   16
  2                    10                   11
  3                     4                    5
  4                    13                   15
  5                    17                   20
  6                    15                   18
  7                    14                   16
  8                   299                  329

ceph.conf

[global]#全局设置
fsid = xxxxxxxxxxxxxxx                           #集群标识ID 
mon initial members = node1, node2, node3               #初始monitor (由创建monitor命令而定)
mon host = 10.0.1.1,10.0.1.2,10.0.1.3            #monitor IP 地址
auth cluster required = cephx                    #集群认证
auth service required = cephx                           #服务认证
auth client required = cephx                            #客户端认证
osd pool default size = 2                             #默认副本数设置 默认是3
osd pool default min size = 1                           #PG 处于 degraded 状态不影响其 IO 能力,min_size是一个PG能接受IO的最小副本数
public network = 10.0.1.0/24                            #公共网络(monitorIP段) 
cluster network = 10.0.2.0/24                           #集群网络
max open files = 131072                                 #默认0#如果设置了该选项,Ceph会设置系统的max open fds

##############################################################
[mon]
mon data = /var/lib/ceph/mon/ceph-$id
mon clock drift allowed = 1                             #默认值0.05#monitor间的clock drift
mon osd min down reporters = 13                         #默认值1#向monitor报告down的最小OSD数
mon osd down out interval = 600      #默认值300      #标记一个OSD状态为down和out之前ceph等待的秒数
##############################################################
[osd]
osd data = /var/lib/ceph/osd/ceph-$id
osd journal size = 20000 #默认5120                          #osd journal大小
osd journal = /var/lib/ceph/osd/$cluster-$id/journal    #osd journal 位置
osd mkfs type = xfs                                     #格式化系统类型
osd max write size = 512 #默认值90                   #OSD一次可写入的最大值(MB)
osd client message size cap = 2147483648   #默认值100    #客户端允许在内存中的最大数据(bytes)
osd deep scrub stride = 131072                      #默认值524288         #在Deep Scrub时候允许读取的字节数(bytes)
osd op threads = 16                                         #默认值2                   #并发文件系统操作数
osd disk threads = 4                                         #默认值1                   #OSD密集型操作例如恢复和Scrubbing时的线程
osd map cache size = 1024                              #默认值500                 #保留OSD Map的缓存(MB)
osd map cache bl size = 128                            #默认值50                #OSD进程在内存中的OSD Map缓存(MB)
osd mount options xfs = "rw,noexec,nodev,noatime,nodiratime,nobarrier"   #默认值rw,noatime,inode64  #Ceph OSD xfs Mount选项
osd recovery op priority = 2                 #默认值10              #恢复操作优先级,取值1-63,值越高占用资源越高
osd recovery max active = 10              #默认值15              #同一时间内活跃的恢复请求数 
osd max backfills = 4                           #默认值10                  #一个OSD允许的最大backfills数
osd min pg log entries = 30000           #默认值3000           #修建PGLog是保留的最大PGLog数
osd max pg log entries = 100000         #默认值10000         #修建PGLog是保留的最大PGLog数
osd mon heartbeat interval = 40           #默认值30            #OSD ping一个monitor的时间间隔(默认30s)
ms dispatch throttle bytes = 1048576000 #默认值 104857600 #等待派遣的最大消息数
objecter inflight ops = 819200                   #默认值1024           #客户端流控,允许的最大未发送io请求数,超过阀值会堵塞应用io,为0表示不受限
osd op log threshold = 50                            #默认值5                  #一次显示多少操作的log
osd crush chooseleaf type = 0                       #默认值为1              #CRUSH规则用到chooseleaf时的bucket的类型
filestore xattr use omap = true                         #默认false#为XATTRS使用object map,EXT4文件系统时使用,XFS或者btrfs也可以使用
filestore min sync interval = 10                          #默认0.1#从日志到数据盘最小同步间隔(seconds)
filestore max sync interval = 15                          #默认5#从日志到数据盘最大同步间隔(seconds)
filestore queue max ops = 25000                        #默认500#数据盘最大接受的操作数
filestore queue max bytes = 1048576000            #默认100   #数据盘一次操作最大字节数(bytes
filestore queue committing max ops = 50000       #默认500     #数据盘能够commit的操作数
filestore queue committing max bytes = 10485760000 #默认100 #数据盘能够commit的最大字节数(bytes)
filestore split multiple = 8                                               #默认值2         #前一个子目录分裂成子目录中的文件的最大数量
filestore merge threshold = 40                                        #默认值10       #前一个子类目录中的文件合并到父类的最小数量
filestore fd cache size = 1024                                         #默认值128              #对象文件句柄缓存大小
filestore op threads = 32                                                  #默认值2                    #并发文件系统操作数
journal max write bytes = 1073714824                           #默认值1048560    #journal一次性写入的最大字节数(bytes)
journal max write entries = 10000                                   #默认值100         #journal一次性写入的最大记录数
journal queue max ops = 50000                                      #默认值50            #journal一次性最大在队列中的操作数
journal queue max bytes = 10485760000                       #默认值33554432   #journal一次性最大在队列中的字节数(bytes)
##############################################################
[client]
rbd cache = true       #默认值 true      #RBD缓存
rbd cache size = 335544320       #默认值33554432           #RBD缓存大小(bytes)
rbd cache max dirty = 134217728     #默认值25165824      #缓存为write-back时允许的最大dirty字节数(bytes),如果为0,使用write-through
rbd cache max dirty age = 30     #默认值1                #在被刷新到存储盘前dirty数据存在缓存的时间(seconds)
rbd cache writethrough until flush = false     #默认值true  #该选项是为了兼容linux-2.6.32之前的virtio驱动,避免因为不发送flush请求,数据不回写
#设置该参数后,librbd会以writethrough的方式执行io,直到收到第一个flush请求,才切换为writeback方式。
rbd cache max dirty object = 2     #默认值0              #最大的Object对象数,默认为0,表示通过rbd cache size计算得到,librbd默认以4MB为单位对磁盘Image进行逻辑切分
#每个chunk对象抽象为一个Object;librbd中以Object为单位来管理缓存,增大该值可以提升性能
rbd cache target dirty = 235544320   #默认值16777216    #开始执行回写过程的脏数据大小,不能超过 rbd_cache_max_dirty

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值