文章目录
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
# 修改日志名字
# 生成图片
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论