Ceph性能调优参数
集群范围内的配置参数定义在ceph的配置文件中,任何一个ceph守护进程启动的时候都会遵循已定义的设置。这些配置参数全部放在/etc/ceph/ceph.conf文件中,这个文件有一个global部分和若干个服务类型部分,任何时候一个ceph服务启动,都会应用[global]部分,以及进程特定部分的配置。
1.1 network
建议使用两个物理隔离的网络,分别作为Public Network(公共网络,即客户端访问网络)和Cluster Network(集群网络,即节点之间的网络)。
Public Network:定义Public Network的语法:Public network = {public network / netmask}。
public network = x.x.x.x/24
Cluster Network:定义Cluster Network的语法:Cluster network = {cluster network / netmask}。
cluster network = x.x.x.x/24
1.2 osd pool default min size
处于degraded状态的副本数。它确定了Ceph在向客户端确认写操作时,存储池中的对象必须具有的最小副本数目,缺省值为0。
osd pool default min size = 3
1.3 osd pool default pg和osd pool default pgp
确保集群有一个切实的PG数量。建议每个OSD的PG数目是100。使用这个公式计算PG个数:(OSD总数 * 100)/副本个数。
对于10个OSD和副本数目为3的情况,PG个数应该小于(10*100)/3 = 333。
osd pool default pg num = 128
osd pool default pgp num = 128
1.4 osd pool default min size
这是处于degraded状态的副本数目,它应该小于osd pool default size的值,为存储池中的object设置最小副本数目来确认写操作。即使集群处于degraded状态。如果最小值不匹配,Ceph将不会确认写操作给客户端。
osd pool default min size = 1
1.5 osd recovery threads
恢复数据所需的线程数。 osd_recovery_threads = 1
1.6 osd backfilling
设置允许Ceph配置回填操作(backfilling operation)的优先级比请求读写更低。osd max backfills:允许进或出单个OSD的最大backfill数。
osd_max_backfills = 2
1.7 osd recovery max active
某个给定时刻,每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量。
osd_recovery_max_active = 1
1.8 osd journal size
应该使用这个参数来设置日志大小。日志大小应该至少是预期磁盘速度和filestore最大同步时间间隔的两倍。如果使用了SSD日志,最好创建大于10GB的日志,并调大filestore的最小、最大同步时间间隔。
osd_journal_size = 10240
2 OSD参数调优
2.1 OSD常用设置
下面的设置允许Ceph OSD进程设定文件系统类型、挂载选项,以及一些其他有用的配置。
2.1.1 osd mkfs options xfs
创建OSD的时候,Ceph将使用这些xfs选项来创建OSD的文件系统:
osd_mkfs_options_xfs = “-f -i size=2048”
2.1.2 osd mount options xfs
设置挂载文件系统到OSD的选项。当Ceph挂载一个OSD时,下面的选项将用于OSD文件系统挂载。
osd_mount_options_xfs =“rw,noatime,inode64,logbufs=8,logbsize=256k, delaylog,allocsize=4M”
2.1.3 osd max write size
OSD单次写的最大大小,单位是MB。
osd_max_write_size = 256
2.1.4 osd client message size cap
内存中允许的最大客户端数据消息大小,单位是字节。
osd_client_message_size_cap = 1073741824
2.1.5 osd map dedup
删除OSD map中的重复项。
osd_map_dedup = true
2.1.6 osd op threads
服务于Ceph OSD进程操作的线程个数。设置为0可关闭它。调大该值会增加请求处理速率。
osd_op_threads = 16
2.1.7 osd disk threads
用于执行像清理(scrubbing)、快照裁剪(snap trimming)这样的后台磁盘密集性OSD操作的磁盘线程数量。
osd_disk_threads = 1
2.1.8 osd disk thread ioprio class
和osd_disk_thread_ioprio_priority一起使用。这个可调参数能够改变磁盘线程的I/O调度类型,且只工作在Linux内核CFQ调度器上。可用的值为idle、be或者rt。
idle:磁盘线程的优先级比OSD的其他线程低。当你想放缓一个忙于处理客户端请求的OSD上的清理(scrubbing)处理时,它是很有用的。
be:磁盘线程有着和OSD其他进程相同的优先级。
rt:磁盘线程的优先级比OSD的其他线程高。当清理(scrubbing)被迫切需要时,须将它配置为优先于客户端操作,此时该参数是很有用的。
osd_disk_thread_ioprio_class = idle 、 osd disk thread ioprio priority:和osd_disk_thread_ioprio_ class一起使用。这个可调参数可以改变磁盘线程的I/O调度优先级,范围从0(最高)到7(最低)。如果给定主机的所有OSD都处于优先级 idle,它们都在竞争I/O,而且没有太多操作。这个参数可以用来将一个OSD的磁盘线程优先级降为7,从而让另一个优先级为0的OSD尽可能更快地做清理(scrubbing)。和osd_disk_thread_ioprio_ class一样,它也工作在Linux内核CFQ调度器上。
osd_disk_thread_ioprio_priority = 0
2.2 OSD日志设置
Ceph OSD守护进程支持下列日志配置。
2.2.1 osd journal size
缺省值为0,使用这个参数来设置日志大小。日志大小应该至少是预期磁盘速度和filestore最大同步时间间隔的两倍。如果使用了SSD日志,最好创建大于10GB的日志,并调大filestore的最小、最大同步时间间隔。
osd_journal_size = 20480
2.2.2 journal max write byte:
单次写日志的最大比特数。
journal_max_write_bytes = 1073714824
2.2.3 journal max write entries:
单次写日志的最大条目数。
journal_max_write_entries = 10000
2.2.4 journal queue max ops:
给定时间里,日志队列允许的最大operation数。
journal_queue_max_ops = 50000
2.2.5 journal queue max bytes
给定时间里,日志队列允许的最大比特数。
journal_queue_max_bytes = 10485760000
2.2.6 journal dio
启用direct i/o到日志。需要将journal block align配置为true。
journal_dio = true
2.2.7 journal aio
启用libaio异步写日志。需要将journal dio配置为true。
journal_aio = true
2.2.8 journal block align
日志块写操作对齐,需要配置了dio和aio。
journal_block_align = true
2.3 OSD filestore设置
下面是一些OSD filestore的配置项。
2.3.1 Filestore merge threshold:
将libaio用于异步写日志。需要journal dio被置为true。
filestore_merge_threshold = 40
2.3.2 Filestore spilt multiple
子目录在分裂成二级目录之前最大的文件数。
filestore_split_multiple = 8
2.3.3 Filestore op threads:
并行执行的文件系统操作线程个数。
filestore_op_threads = 32
2.3.4 Filestore xattr use omap
给XATTRS(扩展属性)使用object map。在ext4文件系统中要被置为true。
filestore_xattr_use_omap = true
2.3.5 Filestore sync interval
为了创建一个一致的提交点(consistent commit point),filestore需要停止写操作来执行syncfs(),也就是从日志中同步数据到数据盘,然后清理日志。更加频繁地同步操作,可以减少存储在日志中的数据量。这种情况下,日志就能充分得到利用。配置一个越小的同步值,越有利于文件系统合并小量的写,提升性能。下面的参数定义了两次同步之间最小和最大的时间周期。
filestore_min_sync_interval = 10
filestore_max_sync_interval = 15
2.3.6 Filestore queue max ops
在阻塞新operation加入队列之前,filestore能接受的最大operation数。
filestore_queue_max_ops = 2500
2.3.7 Filestore queue max bytes
一个operation的最大比特数。
filestore_queue_max_bytes = 10485760
2.3.7 Filestore queue committing max ops
filestore能提交的operation的最大个数。
filestore_queue_committing_max_ops = 5000
2.3.8 Filestore queue committing max bytes
filestore能提交的operation的最大比特数。
filestore_queue_committing_max_bytes = 10485760000
2.4 OSD Recovery设置
如果相比数据恢复(recovery),你更加在意性能,可以使用这些配置,反之亦然。如果Ceph集群健康状态不正常,处于数据恢复状态,它就不能表现出正常性能,因为OSD正忙于数据恢复。如果你仍然想获得更好的性能,可以降低数据恢复的优先级,使数据恢复占用的OSD资源更少。如果想让OSD更快速地做恢复,从而让集群快速恢复其状态。
2.4.1 osd recovery max active
某个给定时刻,每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量。
osd_recovery_max_active = 1
2.4.2 osd recovery max single start
该指令要和osd_recovery_max_active一起使用,要理解其含义。假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG启动一个恢复操作,而且最多可以有三个恢复操作同时处于活动状态。
osd_recovery_max_single_start = 1
2.4.3 osd recovery op priority
用于配置恢复操作的优先级。值越小,优先级越高。
osd_recovery_op_priority = 50
2.4.4 osd recovery max chunk
数据恢复块的最大值,单位是字节。
osd_recovery_max_chunk = 1048576
2.4.5 osd recovery threads
恢复数据所需的线程数。
osd_recovery_threads = 1
2.5 OSD backfilling(回填)设置
OSD backfilling设置允许Ceph配置回填操作(backfilling operation)的优先级比请求读写更低。
2.5.1 osd max backfills
允许进或出单个OSD的最大backfill数。
osd_max_backfills = 2
2.5.2 osd backing scan min:
每个backfill扫描的最小object数。
osd_backfill_scan_min = 8
2.5.3 osd backfill scan max
每个backfill扫描的最大object数。
osd_backfill_scan_max = 64
2.6 OSD scrubbing(清理)设置
OSD scrubbing对维护数据完整性来说是非常重要的,但是也会降低其性能。你可以采用以下配置来增加或减少scrubbing操作。
2.6.1 osd max scrube
一个OSD进程最大的并行scrub操作数。
osd_max_scrubs = 1
2.6.2 osd scrub sleep
两个连续的scrub之间的scrub睡眠时间,单位是秒。
osd_scrub_sleep = 1
2.6.3 osd scrub chunk min
设置一个OSD执行scrub的数据块的最小个数。
osd_scrub_chunk_min = 1
2.6.4 osd scrub chunk max
设置一个OSD执行scrub的数据块的最大个数。
osd_scrub_chunk_max = 5
2.6.5 osd deep scrub stride
深层scrub时读大小,单位是字节。
osd_deep_scrub_stride = 1048576
2.6.6 osd scrub begin hour
scrub开始的最早时间。和osd_scrub_end_hour一起使用来定义scrub时间窗口。
osd_scrub_begin_hour = 19
2.6.7 osd scrub end hour
scrub执行的结束时间。和osd_scrub_begin_hour一起使用来定义scrub时间窗口。
osd_scrub_end_hour = 7
3 Monitor调优
Monitor调优参数定义在Ceph集群配置文件的[mon]部分下。
3.1 mon osd down out interval
指定Ceph在OSD守护进程的多少秒时间内没有响应后标记其为“down”或“out”状态。当你的OSD节点崩溃、自行重启或者有短时间的网络故障时,这个选项就派上用场了。你不想让集群在问题出现时就立刻启动数据平衡(rebalancing),而是等待几分钟观察问题能否解决。
mon_osd_down_out_interval = 600
3.2 mon allow pool delete
要避免Ceph 存储池的意外删除,请设置这个参数为false。当你有很多管理员管理这个Ceph集群,而你又不想为客户数据承担任何风险时,这个参数将派上用场。
mon_allow_pool_delete = false
3.3 mon osd min down reporters
如果Ceph OSD守护进程监控的OSD down了,它就会向MON报告;缺省值为1,表示仅报告一次。使用这个选项,可以改变Ceph OSD进程需要向Monitor报告一个down掉的OSD的最小次数。在一个大集群中,建议使用一个比缺省值大的值,3是一个不错的值。
mon_osd_min_down_reporters = 3
4 客户端(Client)调优
客户端调优参数应该定义在配置文件的[client]部分。通常[client]部分存在于客户端节点的配置文件中。
4.1 rbd cache
启用RBD(RAPOS Block Device)缓存。
rbd_cache = true
4.2 rbd cache writethrough until flush
一开始使用write-through模式,在第一次flush请求被接收后切换到writeback模式。
rbd_cache_writethrough_until_flush = true
4.3 rbd concurrent management
可以在rbd上执行的并发管理操作数。
rbd_concurrent_management_ops = 10
4.4 rbd cache size
rbd缓存大小,单位为字节。
rbd_cache_size = 67108864
4.5 rbd cache max dirty
缓存触发writeback时的上限字节数。配置该值要小于rbd_cache_size。
rbd_cache_max_dirty = 50331648 #48M
4.6 rbd cache target dirty
在缓存开始写数据到后端存储之前,脏数据大小的目标值。
rbd_cache_target_dirty = 33554432
4.7 rdb cache max dirty age
在writeback开始之前,脏数据在缓存中存在的秒数。
rbd_cache_max_dirty_age = 2
4.8 rbd default format
使用了第二种rbd格式,它已经在librbd和3.11之后的Linux内核版本中被支持。它添加了对克隆(cloning)的支持,更加容易扩展,未来会支持更多的特性。
rbd_default_format = 2