硬件选型
CPU与内存
| CPU | RAM |
Monitor | 维护Cluster map,CPU不敏感 | >=2GB/process (ceph-mon) |
OSD | >= 1 CPU core/OSD process | 执行恢复操作需大量内存,>=1GB/TB data |
MDS | CPU敏感 | >=2GB/process (ceph-mds) |
网络
- public网络:10Gbps网卡
- cluster网络:10Gbps网卡
- 管理网络(optional): 1Gbps网卡
写操作:
- 先将object写到OSD对应的日志盘,写完后发送一个ACK给客户端;
- 后台再将日志数据同步到数据盘;
日志盘
- 即使是通用场景,也需用SSD做日志盘。一块SSD可以创建多个逻辑分区,每个逻辑分区映射到一个OSD数据盘。
- 日志盘大小一般10-20GB
- 盘数比:
- SSD:OSD = 1:4
- NVMe:OSD = 1:12-18
BIOS设置
- 超线程(HT,Hyper-Threading)打开
- 关闭节能
- NUMA:NUMA就是将内存和CPU分割为多个区域,每个区域叫做Node,然后将Node告诉互联。
- 关闭NUMA(CentOS下,可以修改/etc/grub.conf,添加numa=off来关闭NUMA),或者
- 通过cgroup将ceph-osd进程与某一个CPU core以及同一Node下的内存进行绑定。
操作系统优化
在Linux的各种发行版中,为了保证对硬件的兼容和可靠性,很多内核参数都采用了较为保守的设置,然而这无法满足高性能计算的需求。
1.Linux Kernel级优化
- 调度:
Linux默认的IO调度一般对磁盘寻址慢做了专门优化,但对于SSD而言,由于访问磁盘不同逻辑扇区的时间几乎一样,这个优化就没有什么作用了。所以用 Noop 调度器替代内核默认的 CFQ. 操作如下:
echo noop > /sys/block/sd<ID>/queue/scheduler
而机械硬盘的设置为:
echo deadline > /sys/block/sd<ID>/queue/scheduler
- 预读
Linux默认的预读 read_ahead_kb 并不适合 RADOS 对象存储读,应该设置更大的值:
echo "8192" > /sys/block/sd<ID>/queue/read_ahead_kb
- 进程数量
OSD需要消耗大量进程。设置内核PID上限:
echo 4194303 > /proc/sys/kernel/pid_max
- 调整CPU频率,使其运行在最高性能下:
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null
2. 内存优化
- SMP:所有CPU共享全部资源,如总线、内存、IO等。每个CPU都通过总线访问内存,导致总线压力太大后,CPU处理能力大大降低。
NUMA: 上面已有介绍。访问本地内存速度比访问远程内存要快。所以,如果进程需要访问远端内存,程序效率会大大降低。Ceph目前并未对NUMA架构做过多优化。如果CPU颗数较少(2-4颗),SMP架构的内存在效率上要高一些;如果CPU颗数较多,可以通过进程绑定的方法,在保证CPU能尽可能访问自身内存的前提下,使用NUMA架构。
- SWAP:
当物理内存不足时,就需要将一部分内存中的非活跃(inactive)内存页置换到交换分区(SWAP)中。
这涉及到内核中关于SWAP的使用策略。由 vm.swappiness 这个内核参数控制:当值为0时,表示尽可能避免换页;值为100时,将积极换页。所以,一般将该参数设置为0. 配置到 /etc/sysctl.conf 文件中。
- 内存管理:
Ceph默认使用TCmalloc来管理内存。在非全闪环境下,TCmalloc已经够用;在全闪环境下,建议增加TCmalloc的Cache大小或者使用jemalloc来替代TCmalloc.
- cgroup
cgroup是Linux内核提供的一种可以限制、记录、隔离进程组使用的物理资源(CPU、memory、IO等)的机制。
可将cgroup的配置操作添加到OSD或MON的启动脚本。
注意,在全闪情况下,每个OSD进程可能需要高达 6GHz的CPU和4GB以上的内存。
3. 网络优化
- 巨型帧
以太网的MTU是1500字节,默认情况下以太网帧是1522字节 = 1500(payload)+14(Ethernet header)+4(CRC)+4(VLAN tag)
巨型帧是将MTU调整到9000,从而通过减少网络中数据包的个数来减轻网络设备处理包头的额外开销。
设置MTU,需要本地设备和对端设备同时开启,可以极大提高性能。
- 中断亲和
进行网络IO时,会出发系统中断。默认情况下,所有的网卡中断都交由CPU0处理。
当大量网络IO出现时,处理大量网络IO会导致CPU0长时间处于满负载状态,以致无法处理更多的IO导致网络丢包等并发问题,产生系统瓶颈。Linux2.4内核之后,引入了将中断绑定到指定的CPU的技术,称为中断亲和(SMP IRQ affinity)。Linux中所有的中断情况在文件 /proc/interrupts 中记录。
可以通过 echo "$bitmask" > /proc/irq/$num/smp_affinity
bitmask代表CPU的掩码,以十六进制表示,每一位代表一个CPU核。 这里的$num代表中断号。
但是,这样手动设置CPU太过麻烦。实际中有 irqbalance 服务会定期(10秒)统计CPU的负载和系统的中断量,自动迁移中断,保持负载均衡。
irqbalance 在部分情况下确实能极大减少工作量,但由于它的检测无法保证实时性,部分情况下会加剧系统负载。
所以,还是建议根据系统规划,通过手动设置中断亲和,隔离部分CPU处理网卡中断。
- 硬件加速
主要采取TOE网卡(TCP offload Engine),它主要处理以下工作:
1) 协议处理:对TCP/IP协议的处理,如IP数据包的校验、TCP数据流的可靠性和一致性处理。
2) 中断处理:普通网卡上每个数据包都要触发一次中断,TOW网卡让每个应用程序完成一次完整的数据处理后才触发一次中断。
3) 减少内存拷贝:因为在网卡内进行协议处理,所以不必将数据复制到内核缓冲区,而是直接复制到应用程序的缓冲区。
- RDMA (Remote Direct Memory Access)
RDMA可以在不需要操作系统的干预下,完成2个主机之间内存数据的传输。
RDMA工作过程中,应用程序与网卡直接互传数据,中间不经过内核缓冲区。
RDMA在Ceph中主要由Mellanox维护,使用accelio实现了类似SampleMessager的xio消息处理机制。
- DPDK (Data Plane Development Kit)
DPDK采用轮询方式处理数据包处理过程,而不是使用CPU中断处理数据包的方式。
DPDK重载了网卡驱动,驱动在收到数据包后,不使用中断通知CPU,而是直接存入用户态内存中,使得应用程序可以通过DPDK提供的接口从内存中直接读取数据包。
使用DPDK类似于RDMA,避免了内存拷贝和上下文切换的时间。
4. Ceph层面优化
- 各种参数的配置(略)
大致有:global参数、journal相关参数、osd config tuning参数、recovery tuning参数、client tuning参数
- PG数量优化
Total PGs = (osd number * [100-200]) / replica_number
即,osd的数量乘以100到200之间的一个数值(如果pool比较多,则乘以200),再除以副本数。
(完)