ceph 性能调优 + 性能测试

ceph 性能调优场景

    1、确定预期,即你是啥硬件(你是容量性、性能性、还是综合性)

ceph 性能调优原则

    1、一次只对一个性能指标参数进行调整

ceph 性能调优思路

    1、多数情况,压测流量并未真的直接到达后端,比如有系统cache、raid cache、CDN等
    2、服务器端影响因素较大
        硬件:(CPU,Memory,Swap,Disk IO,Network IO,)
        中间件:线程池、连接池、GC等
        数据库相关指标:慢查SQL,命中率,锁、参数设置
        应用程序:算法、缓冲、缓存、同步或异步
    3、客户端也有影响的可能
    4、测试工具有其自身的开销
    5、网络FW

硬件优化项

    NUMA资源均衡{包括NIC、DISK、CPU、}

OS优化项

参考文章:https://bbs.huaweicloud.com/forum/thread-181983-1-1.html
# 1、关闭swap,避免使用虚拟内存,默认值:60
    sed -i '/vm.swappiness/ d' /etc/sysctl.conf
    echo "vm.swappiness = 0" | tee -a /etc/sysctl.conf
    sysctl vm.swappiness=0

# 2、全部MTU 9000

# 3、修改pid_max最大线程数,默认值为:32768
    # 查看默认值 cat /proc/sys/kernel/pid_max   (pve默认就是4194303 不需更改 )
    echo 4194303 > /proc/sys/kernel/pid_max

# 4、增大请求队列,nr_requests ,适当调整该值可以提升磁盘的吞吐量 (默认值为256) (注意重启会失效)
    echo 512 > /sys/block/sdb/queue/nr_requests

# 5、修改IO调度器,I/O_Scheduler,rhel默认值为CFQ,pve默认为md-deadline,建议:HDD设置为deadline,SSD设置为noop
 # 获取所有磁盘设备列表
disk_list=$(ls /sys/block/ | grep -E 'sd[a-z]$')
nvme_list=$(ls /sys/block/ | grep -E 'nvme[0-9]n[0-9]$')

for disk in $disk_list; do
    # 检查磁盘类型
    rotational=$(cat "/sys/block/${disk}/queue/rotational")

    if [ "$rotational" -eq 1 ]; then
        # HDD,设置为deadline,并将 请求队列增大到512(默认256)
        echo "Setting I/O scheduler for HDD ${disk} to deadline"
        echo "deadline" > "/sys/block/${disk}/queue/scheduler"
        echo "512" > /sys/block/${disk}/queue/nr_requests
    else
        # SSD,设置为noop
        echo "Setting I/O scheduler for SSD ${disk} to noop"
        echo "noop" > "/sys/block/${disk}/queue/scheduler"
    fi
done

for nvme_disk in $nvme_list; do
    # NVMe,设置为none
    echo "Setting I/O scheduler for NVMe ${nvme_disk} to none"
    echo "none" > "/sys/block/${nvme_disk}/queue/scheduler"
done

    4、修改最大可打开文件数 file_max   # echo ${file-max} > /proc/sys/fs/file-max
    5、加大文件预读  read_ahead  # 查看 /sbin/blockdev --getra /dev/vdb

    NUMA 亲和性优化
        # 保证网络和存储资源均衡地分配到各个NUMA节点
        for i in {0..11}; do echo `expr ${i} / 3` > /sys/class/block/nvme${i}n1/device/device/numa_node; done
        for j in {0..3}; do echo ${j} > /sys/class/net/enps0f${j}/device/numa_node; done

https://bbs.huaweicloud.com/forum/thread-42980-1-1.html

OS其他优化项目

其他优化手段
1、绑定网卡/SSD 中断
    # 必须先把 irqbalace 服务关闭,否则 irqbalace 服务会将绑定给重新均衡掉。
    cat /proc/interrupt | grep eth
    echo cpu_mask > /proc/irq/${IRQ_NUM}/smp_affinity

2、cgroup隔离业务
    # 针对对繁忙的线程或者进程来说是比较有效的,主要是基于 CPU cache

3、tcmalloc/jemalloc
    # 主要是优化内存的分配和回收效率,有Tcmalloc和jemalloc可选,可以去Tcmalloc和jemalloc的网站去下载相关文件进行阅读。
    优化内存分配和回收,库有较全面的文档。

介绍2种 Ceph 性能观测工具
1、ceph perf
    ceph osd perf osd 读写|落盘延时
    ceph daemon xxx perf dump

2、perf
    perf top
    perf stat

ceph 配置优化项

d

性能测试前、要做的准备

# 查看内存缓存(其中,buff/cache 就是缓存资源)
    free -h

# 手动释放内存
    # /proc 是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。
    # 也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。

    因为这是一个非破坏性的操作,而且脏对象是不可释放的,所以用户应该首先运行
    sync

    写入这个文件会导致内核从内存中删除干净的缓存、dentries和inode,从而使内存变得空闲。
    # 要释放pagecache,请使用
    echo 1 > /proc/sys/vm/drop_caches && sync

    # 要释放dentries和索引节点,请使用
    echo 2 > /proc/sys/vm/drop_caches && sync

    # 要释放pagecache、dentries和索引节点,请使用
    echo 3 > /proc/sys/vm/drop_caches && sync

rados bench 测试

rados bench语法介绍
    rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t  --no-cleanup
    -p:                 # -p或-poo指定池名
    <seconds>:         # 测试时间(以秒为单位)
    <write|seq|rand>:  # 测试类型,例如写入、顺序读取或随机读取
    -b:                # 块大小默认为4M,安全最大对象大小16M
    -t:                # 并发线程数;默认值为16
    --no-cleanup:      # 由rados工作台写入池的临时数据,不被清除。当这些数据与顺序读取或随机读取一起使用时,它们将被用于读取操作。默认情况下数据会清理。
    --run-name LABEL    # 同时运行多个rados,写入时指定标签,房子多客户端试图访问同一对象I/O出错。

# 测试用例
    # 测试60s写,数据不清理
    rados bench -p volumes 60 write --no-cleanup --run-name 001
    rados bench -p volumes 60 write --no-cleanup --run-name 002     #若是要在多台机器同时跑,就指定不同的名字

    # 测试60s顺序读(可能存在60s不到就读完了所有数据)
    rados bench -p volumes 60 seq

    # 测试60s随机读数据
    rados bench -p volumes 60 rand

    # 测试完 清空脏数据
    rados -p volumes cleanup
    # rados purge volumes --yes-i-really-really-mean-it

    # 直接将文件put到pool
    rados -p volumes put test1 /root/test1  #将本地的/root/test1 上传到volumes池,名字为test1(经测试只能上传单个小于100M的文件)
    rados -p volumes ls                     #查看volumes中存放的对象

rbd bench-write (块设备写测试工具)

# rbd bench-write 可用参数
    --io-size:单位 byte,默认 4M
    --io-total:总写入字节,默认 1024M
    --io-pattern <seq|rand>:写模式,默认为 seq 即顺序写

    rbd bench-write volumes/kvm001-system  --io-size 4M --io-total 10G --io-pattern seq     # 顺序写10G
    rbd bench-write volumes/kvm001-system  --io-size 4M --io-total 10G --io-pattern rand    # 随机写10G

rados load-gen(高负载测试工具)

# rados load-gen
    --num-objects:      # 初始生成测试用的对象数,默认 200
    --min-object-size:  # 测试对象的最小大小,默认 1KB,单位byte 
    --max-object-size:  # 测试对象的最大大小,默认 5GB,单位byte
    --min-ops:          # 一次提交的最小IO数,相当于iodepth
    --max-ops:          # 一次提交的最大IO数,相当于iodepth
    --min-op-len:       # 压测IO的最小大小,默认 1KB,单位byte
    --max-op-len:       # 压测IO的最大大小,默认 1KB,单位byte
    --max-backlog:      # 一次提交IO的吞吐量上限,默认10MB/s,单位B/s
    --percent:          # 读写混合中读的比例,默认80,范围[0, 100]
    --target-throughput:# 一次提交IO的历史累计吞吐量上限,默认 5MB/s,单位B/s,
    --run-length:       # 运行的时间,默认60s,单位秒

    rados load-gen -p volumes --num-objects 500 --min-object-size 4M --max-object-size 4M --max-object-size 4M --max-ops 16 --min-op-len 4M  --max-op-len 4M --percent 5 --target-throughput 40 --run-length 10

FIO 性能测试

# 创建块设备
    rbd create volumes/kvm001-system --size 100G
    rbd map volumes/kvm001-system

    # mkfs.xfs /dev/rbd/volumes/kvm001-system
    # mount /dev/rbd/volumes/kvm001-system /root/volumes

10线程4K随机写,IO深度64,Direct IO + AIO ,没有sync同步
    fio --filename=/dev/rbd0 -direct=1 -thread=1 --lockmem=1 --ioengine=libaio --random_generator=tausworthe64 --group_reporting=1 -rw=randrw --numjobs=10 --blocksize=4k -iodepth=64 -size=10M -name=4k-randrw

结果看:IOPS、吞吐率、写延迟分布

cat > /root/conf-file  << EOF
[global]
ioengine=rbd
pool=volumes
rbdname=kvm001.raw
numjobs=1
direct=1
size=2g

[4k-write]
runtime=30
stonewall
group_reporting
bs=4k
rw=write
iodepth=4
write_bw_log=4k-write
write_lat_log=4k-write
write_iops_log=4k-write

[4k-read]
runtime=30
stonewall
group_reporting
bs=4k
rw=read
iodepth=4
write_bw_log=4k-read
write_lat_log=4k-read
write_iops_log=4k-read
EOF

    # 执行测试
    fio /root/conf-file

    # 修改日志名字

    # 生成图片
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/1164.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/7/6作者: 辣条①号

目标:网络规划设计师、系统工程师、ceph存储工程师、云计算工程师。 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录