TIPS之 cephfs底层调优

cephfs ceph-nbd 底层调优

Posted by 董江 on Wednesday, July 31, 2024

一、网卡调优

参数含义

默认值:1024

现象:通过ethtool -g <网卡名称> 查看

修改建议:将“ring_buffer”队列大小调整为4096。

# 设置网卡ring buffer
$ ethtool -G <网卡名称> rx 4096 tx 4096
# 查看当前buffer大小
$ ethtool -g <网卡名称>

lro 和 gro

默认值:off

现象:打开后最大吞吐量明显上升。对于大文件512会有丢包影响。

修改建议:

  • 关闭“large-receive-offload”功能
  • 关闭"generic-receive-offload"功能
# 关闭网卡lro功能。
$ ethtool -K <网卡名称> lro off gro off
# 检查是否成功打开。
$ ethtool -k <网卡名称> | grep large-receive-offload
$ ethtool -k <网卡名称> | grep generic-receive-offload

二、OS内核调优

默认值:60

现象:用到swap时性能明显下降

修改建议:关闭swap内存的使用,将该参数设定为0

$ sudo sysctl vm.swappiness=0

默认值:32768

现象:通过cat /proc/sys/kernel/pid_max查看

修改建议:设置系统可生成最大线程数为4194303

$ echo 4194303 > /proc/sys/kernel/pid_max

“file-max”是设置系统所有进程一共可以打开的文件数量。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,则应该增加这个值。

默认值:13291808

现象:通过cat /proc/sys/fs/file-max查看

修改建议:设置系统所有进程一共可以打开的文件数量,设置为cat /proc/meminfo | grep MemTotal | awk '{print $2}'所查看到的值

$ cat /proc/meminfo | grep MemTotal | awk '{print $2}'
263850188

$ cat /proc/sys/fs/file-max
13060492

$ echo 263850188 > /proc/sys/fs/file-max

Linux的文件预读readahead,指Linux系统内核将指定文件的某区域预读进页缓存起来,便于接下来对该区域进行读取时,不会因缺页(page fault)而阻塞。

鉴于从内存读取比从磁盘读取要快很多,预读可以有效的减少磁盘的寻道次数和应用程序的IO等待时间,是改进磁盘读IO性能的重要优化手段之一。

默认值:128 KB

现象:预读可以有效的减少磁盘的寻道次数和应用程序的IO等待时间。通过**/sbin/blockdev –getra /dev/sdb**查看

修改建议:通过数据预读并且记载到随机访问内存方式提高磁盘读操作,调整为8192 KB

$ /sbin/blockdev --getra /dev/
/dev/sda
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
/dev/sdf
/dev/sdg
/dev/sdh
/dev/sdi

Linux IO调度器是Linux内核中的一个组成部分,用户可以通过调整这个调度器来优化系统性能。

默认值:CFQ

现象:要根据不同的存储器来设置Linux IO调度器从而达到优化系统性能

修改建议:IO调度策略,HDD设置为deadline,SSD设置为noop

echo noop > /sys/block/{sdb,sdc,....}/queue/schedule

默认值:128

现象:通过适当的调整nr_requests参数可以提升磁盘的吞吐量

修改建议:调整硬盘请求队列数,设置为512

echo 512 > /sys/block/{sdb,sdc,....}/queue/nr_requests

三、Cephfs 配置

机器配置:

[global]

默认值:4294967296 (4GB)

修改建议:8589934592 (4GB)

默认值:0

修改建议:1

[mon]

默认值:0.05

修改建议:1

默认值:2

修改建议:13

默认值:600

修改建议:600

[OSD]

默认值:5120

修改建议:20000

默认值:90

修改建议:512

默认值:100

修改建议:2147483648

默认值:524288

修改建议:131072

默认值:50

修改建议:1024

默认值:3

修改建议:2

默认值:3

修改建议:10

默认值:1

修改建议:4

默认值:3000

修改建议:30000

默认值:3000

修改建议:100000

默认值:30

修改建议:40

默认值:104857600

修改建议:1048576000

默认值:1024

修改建议:819200

默认值:5

修改建议:50

默认值:1

修改建议:0

默认值:10485760

修改建议:1073714824

默认值:100

修改建议:10000

[global]
fsid = <xxxxx>
mon_initial_members = <cephfs1>, <cephfs2>, <cephfs3>
mon_host = <ip1>,<ip2>,<ip3>
auth_cluster_required = none
auth_service_required = none
auth_client_required = none
public_network= <cidr>/24

[mon]
mon_clock_drift_allowed = 1                         # monitor间的clock drift. 默认0.05
mon_osd_min_down_reporters =  8                     # 向monitor报告down的最小OSD数. 默认2
mon_osd_down_out_interval = 600                     # 标记一个OSD状态为down和out之前Ceph等待的秒数. 默认600

[OSD]
osd_pool_default_size = 2
osd_memory_target = 8589934592                      # 每个OSD进程能申请到的内存大小 8GB
osd_pool_default_pg_num = 1024
osd_pool_default_pgp_num = 1024
osd_journal_size = 81920
osd_mkfs_type = xfs
osd_mkfs_options_xfs = -f
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_pglog_entries = 100000 #默认值10000          #修建PGLog是保留的最大PGLog数
osd_mon_heartbeat_interval = 40 #默认值30            #OSD ping一个monitor的时间间隔(默认30s)
osd_op_log_threshold = 50 #默认值5                   #一次显示多少操作的log
osd_crush_chooseleaf_type = 0 #默认值1               # CRUSH规则用到chooseleaf时的bucket的类型

filestore_xattr_use_omap = true
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 = 1600 #默认值2                  #前一个子目录分裂成子目录中的文件的最大数量
filestore_merge_threshold = 40 #默认值10                  #前一个子类目录中的文件合并到父类的最小数量
filestore_fd_cache_size = 204800 #默认值128               #对象文件句柄缓存大小
filestore_omap_header_cache_size = 204800
filestore_fiemap = true    #默认值false  #读写分离
filestore_ondisk_finisher threads = 2  #默认值为1
filestore_apply_finisher threads = 2   #默认值为1

mds_cache_size = 102400000
mds_beacon_grace = 120
mds_session_timeout = 15
mds_session_autoclose = 60
mds_reconnect_timeout = 15
mds_decay_halflife = 10

rbd_op_threads = 4
rbd_cache_size = 268435456
rbd_cache_max_dirty = 134217728
rbd_cache_max_dirty_age = 5
rbd_cache_max_dirty_object = 64

journal_max_write_bytes = 1073714824
journal_max_write_entries = 10000
journal_queue_max_ops = 50000
journal_queue_max_bytes = 10485760000

ms_async_op_threads = 5     #默认值3
ms_dispatch_throttle_bytes = 1048576000 #默认值 104857600 #等待派遣的最大消息数

objecter_inflight_ops = 819200 #默认值1024           #客户端流控,允许的最大未发送io请求数,超过阀值会堵塞应用io,为0表示不受限

client_caps_release_delay = 10

其他

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付