Ceph 参数性能调优

来源:互联网 发布:高中教材答案软件 编辑:程序博客网 时间:2024/05/02 18:09

Ceph 参数性能调优

网络的各种Ceph参数的优化比较多,有些有效果,有些在某些场景下不但达不到预期的效果,反而有相反的效果。很多参数如果不了解其意义,面对不同的应用场景就显得无所适从,所以有必要简单的了解一下相关的原理。

Ceph的基本原理

Ceph数据写流程


图1: OSD 写请求的流程

如图1 所示:
    • msg模块接受到读写请求,通过ms_fast_dispatch函数等处理,添加道OSD的op_sharedwq
    • 在op_sharedwq的请求通过线程池的一系列复杂的处理,最后调用FileJournal的submit_entry函数同时添加到FileJournal的writeq队列里和completions队列里。
    • FileJournal的write_thread线程以aio的形式写日志数据到磁盘、、
    • FileJournal的write_finish_thread以线程检查IO请求是否完成
    • Finisher的线程把请求添加到FileStore的op_wq队列里
    • FileStore调用write系统调用,把对象的数据写入XFS文件系统里,其先写入系统的PageCache里,当内容不足时,也有可能直接刷磁盘。然后向上层返回ack应答写成功。
    • 当Journal日志空间不足,或者sync_thread定期回收日志的空间。 调用syncfs函数把page_cache里的数据刷到数据盘上,确保对象数据落盘,然后清空相应的日志空间。

Ceph读数据流程


Ceph参数优化

Ceph的调优的参数比较多,但是大致可以分为三类:一类是Throttle相关的参数,第二类是线程相关的参数, 第三类是缓存相关的参数

Throttle相关的参数


osd_max_write_size

一次写操作的最大的size,也就是fio测试的到时候一次写的blocksize,同时也是日志的最小SIZE,也就是说日志的大小至少大于一次写操作的大小。

osd_client_message_size_cap & osd_client_message_cap


这两个参数是在MSG层做的限制。如图1所示的OSD的最顶层

限制OSD在网络层接受client的请求的msg的总的大小和数量,默认值为500M,100
osd_client_message_cap的值要往大调。可以通过ceph daemon osd.0 perf dump 命令查看相对应的两个Throttle的统计信息。如果该限制起作用,就他调到相应的参数。

throttle-osd_client_bytes
throttle-osd_client_messages

filestore_queue_max_ops & filestore_queue_max_bytes

filesotre 的op_wq里对应的限制

filestore_queue_max_ops = 25000 (默认值为 50)

filestore_queue_max_bytes = 1048576000 (默认值 100M)


filestore_queue_committing_max_ops 和filestore_queue_committing_max_bytes这两个参数对可以checkpoint的文件系统如Btrfs,ZFS有用,对于XFS没有作用。

journal_max_write_entries & journal_max_write_bytes

如图1所示,这两个参数控制日志的write_thread线程,一次写入磁盘的最大条数和字节数,默认值分别为100和10M,这个必须调高
journal_max_write_bytes = 1073714824
journal_max_write_entries = 10000

journal_queue_max_ops & journal_queue_max_bytes

如图1所示的FileJournal的writeq的限制。这是一个Throttle,默认值为300和32M,这个可以往大调。
journal_queue_max_ops = 50000
journal_queue_max_bytes = 10485760000

线程相关的参数

osd_op_threads

OSD的线程池 osd_tp, 其主要处理peering_wq的请求,线程数量 osd_op_threads,因其不再读写的关键路径上,其一般不做调整。

osd_op_num_threads_per_shard * osd_op_num_shards

线程池osd_op_tp 处理op_shardedwq 队列里的请求。如图1所示,它是主要的OSD的处理线程池,其数量为:osd_op_num_threads_per_shard * osd_op_num_shards,默认值分别为5,2, 总共10个线程,可以往大调整,测试发现它对性能影响不是特别大。

osd_disk_threads

disktp 对于的处理的任务:snap_trim_wq, scrub_wq, rep_scrub_wq,remove_wq, 线程池的数量 osd_disk_threads,默认值为1,它不在读写的关键路径上,对性能影响不大。

filestore_op_threads

filestore_op_threads,这个参数设置FileStore的op_wq线程池数量。默认值为2 ,测试时设置为8,对性能影响不大。一般不做调整。

缓存相关参数

osd_map_cache_size

osdmap 查看历史的osdmap的数据

osd_pg_object_context_cache_count (default 64)
filestore_fd_cache_shard (default 16)
filestore_fd_cache_size ( default 128)
filestore_omap_header_cache_size (default 1024)

这几个参数都是这种和对象相关的缓存机制,分别为 object_context,fd,omap
的缓存,这几个参数对于顺序读写没有太大的影响。对于随机读写来说,可以调到一点。 测试时设置为1024和10240,对随机IO性能略有提升。


日志相关的参数

日志的同步参数

filestore_commit_timeout=30000
filestore _min_sync_interval = 5
filestore _max_sync_interval = 10

如图1所示的OSD的读写流程,sync_thread至少filestore _max_sync_interval秒的时间唤醒一次,在filestore _min_sync_interval内调用syncfs同步日志一次。如果日志比较大的话,可以设置的比较长一点。

WBThorttle参数

Ceph优化后的参数



[osd]

filestore_op_threads=4

filestore_journal_parallel=false

filestore_journal_writeahead=true

journal_dio = true

journal_aio = true

journal_force_aio = true

filestore_fiemap = true

filestore_wbthrottle_enable=false

filestore_fd_cache_size = 1024

filestore_omap_header_cache_size = 1024

osd_pg_object_context_cache_count= 1024

filestore_commit_timeout=30000

filestore _min_sync_interval = 5

filestore _max_sync_interval = 10

osd client message size cap = 2147483648

osd_client_message_cap = 5000

filestore_queue_max_ops = 25000

filestore_queue_max_bytes = 1048576000

journal_max_write_bytes = 1073714824

journal_max_write_entries = 10000

journal_queue_max_ops = 50000

journal_queue_max_bytes = 10485760000


[client]

rbd cache = true

rbd cache size = 268435456

rbd cache max dirty = 134217728

rbd cache max dirty age = 5
0 0