GlusterFS分布式文件系统小文件场景优化

GlusterFS分布式文件系统小文件场景优化

什么是GlusterFS分布式文件系统?

GlusterFS是大规模可扩展解决方案,它横向的扩展性能比较好,多个客户端可以并发访问,能够支撑PB数量级的数据。

随着个人和各种组织机构对信息需求的快速增长,数据呈现爆炸式地增长。其中海量小文件的存储场景越来越多。海量小文件,通常指文件数量达到千万级、亿级、十亿级以上的场景,这种应用场景对元数据读写、存储效率等要求较高,海量小文件(LOSF,lots of small files)是当前业界的一大难题。通常认为文件大小小于1MB的文件为小文件。

对于LOSF而言,IOPS/OPS是关键性能衡量指标,造成性能和存储效率低下的主要原因包括元数据管理、数据布局和I/O管理、Cache管理、网络开销等方面。从理论分析以及LOSF优化实践来看,优化应该从元数据管理、缓存机制、合并小文件等方面展开,而且优化是一个系统工程,结合硬件、软件,从多个层面同时着手,优化效果会更显著。

系统优化建议:
对于Gluster在小文件场景的优化,可以从硬件和软件两方面进行,如果不考虑成本问题,硬件优化是最为直接有效的优化方法,按照减少数据访问时间的优化思路,采用更高性能的硬件来提高LOSF性能。比如,使用速度更快的SSD作为全部或部分存储介质,部分部署时作为分层存储,可以显著提高随机读写场景下的IOPS/OPS性能;采用处理能力更强或更多的CPU,可以提高系统的I/O处理速度和并发性;配置更大容量的内存,以空间换时间,有效提高数据缓存命中率;采用延迟更小、带宽更高的网络设备优化网络传输效率,比如万兆网络或InfiniBand网络。硬件优化的目标是消除I/O物理通道上的瓶颈,保证理论上的性能最大化,为软件层面的优化工作做铺垫。值得一提的是,硬件设备在性能上要做到匹配,尤其是磁盘和网络,否则容易导致性能瓶颈或者成本浪费。
软件方面,包含系统参数优化和代码层面的优化,代码层面的优化可以考虑增加元数据服务以提升目录遍历相关操作的性能等,系统参数优化包含对Gluster本身和OS系统参数的调优,本文重点介绍软件方面优化的系统参数优化,将从Gluster本身,以及OS上来描述如何针对GlusterFS的海量小文件场景进行性能优化。

您将建立什么?
在本文中,您将搭建一套高性能的GlusterFS分布式存储系统,您的分布存储系统将具备以下功能:

  1. 具备全对称架构。
  2. 具备分布式卷存储功能。

您将学会到什么?

  1. 如何创建和使用GlusterFS分布式卷存储。
  2. 如何通过系统参数优化提升小文件读写性能。
  3. 如何通过创建Hot tier提升小文件读写性能。

先搭建一套完整的GlusterFS开发环境。

进行Gluster分布式文件系统性能优化任务,需要完成以下准备工作。

  1. 准备3台服务器,预装CentOS 7操作系统,并配置好基本环境。
  2. 在所有节点上安装好glusterfs软件,并确保服务“glusterd.service”正常启动。
  3. 将服务器上的数据盘格式化为xfs格式,挂载待创建glusterfs文件系统使用。
  4. 下载测试工具包smallfile,放置“/public/data/”目录下。

配置开发环境

创建分布式卷
步骤1 创建文件系统数据存储目录gv0。

# ssh host1 mkdir -p /data/brick1/gv0
# ssh host2 mkdir -p /data/brick1/gv0
# ssh host3 mkdir -p /data/brick1/gv0

步骤2 创建分布式卷gv0。

# gluster volume create gv0 host1:/data/brick1/gv0 host2:/data/brick1/gv0 host3:/data/brick1/gv0

步骤3查看volume信息。

# gluster volume info gv0

步骤4启动创建的卷。

# gluster volume start gv0

步骤5 在3台服务器上分别创建文件系统挂载目录“/glusterfs”,并挂载文件系统。

# mkdir -p /glusterfs
# mount -t glusterfs host1:/gv0 /glusterfs

测试文件系统的读写性能:
在本次案例中,我们同样以这3台服务器作为客户端,使用smallfile工具(从“/public/data/”目录下获取工具包)测试glusterfs的小文件读写性能,分布式文件系统的挂载点为“/glusterfs”。
步骤1创建测试目录“/glusterfs/test”, 将工具包smallfile拷贝到“/home”目录下,并进入工具目录下。

# mkdir –p / glusterfs/test
# cp -r /public/data/smallfile /home && cd /home/smallfile

步骤2执行如下操作,测试1MB文件大小的写性能,记录“IOPS”数值。

# python smallfile_cli.py --operation create --threads 8 --file-size 1024 --files 2048 --top /glusterfs/test --host-set host1, host2, host3

步骤3执行如下操作,测试1MB文件大小的读性能,记录“IOPS”数值。

# python smallfile_cli.py --operation read --threads 8 --file-size 1024 --files 2048 --top /glusterfs/test --host-set host1, host2, host3

系统参数优化:

OS系统参数调优:
针对OS层面系统参数,做如下优化。在所有节点上执行。
#调整CPU参数

#将CPU 频率固定工作在其支持的最高运行频率上,而不动态调节。
cpupower frequency-set --governor performance

#调整tuned策略

#将CPU模式修改为高性能模式
tuned-adm profile throughput-performance

#尝试为任意进程分配巨页

echo "always" > /sys/kernel/mm/transparent_hugepage/enabled

#查看是否启用透明巨页

#使用命令查看时,如果输出结果为[always]表示透明大页启用了。[never]表示透明大页禁用、[madvise]表示(只在MADV_HUGEPAGE标志的VMA中使用THP)
# cat /sys/kernel/mm/transparent_hugepage/enabled

Gluster系统参数调优:
针对Gluster层面参数,做如下优化。

如果系统CPU核心数较多,可将client.event-threads、server.event-threads和performance.io-thread-count调高一些;
线程优化最佳实践:
通过调整网络连接处理事件的线程数,可以看到Gluster存储堆栈的性能提升。 以下是调整事件线程值的建议最佳实践。
1.由于每个线程一次处理一个连接,所以不建议使用比brick进程(glusterfsd)或客户端进程(glusterfs或gfapi)更多的线程连接。 由于这个原因,监视客户端和brick上的连接计数(使用netstat命令)以获得事件线程数的适当数量。
2.配置比可用处理单元更高的事件线程值可能会再次导致这些线程上下文切换。 推荐将从前一步推导的数目减少到少于可用处理单位的数目。
3.如果Gluster存储卷在单个节点上运行大量的brick进程,那么减少上一步推导出的事件线程数将有助于竞争进程获得足够的并发性,并避免线程间的上下文切换。
4.如果某个特定的线程消耗的CPU周期数超过所需的数量,那么增加事件线程数可以提高Gluster存储服务器的性能。
5. 除了推导适当的事件线程计数之外,增加存储节点上的server.outstanding-rpc-limit也可以帮助排队brick进程的请求,而不会让请求在网络队列上空闲。
6.调整事件线程值时可以提高性能的另一个参数是performance.io-thread-count(及其相关的线程数),可以将其设置为更高的值,因为这些线程在底层文件系统上执行实际的IO操作。

#为客户端设置事件线程值,通过调整事件线程值来调整Gluster存储服务器的性能。
gluster volume set gv0 client.event-threads 4

#为服务器设置事件线程值,使用事件线程值来调整Gluster存储服务器的性能
gluster volume set gv0 server.event-threads 2
#启用元数据缓存以提高目录操作的性能。 按照以下顺序从可信存储池上的任意一个节点执行以下命令。
gluster volume set gv0 group metadata-cache
#若系统内存较大,可将nfs.mem-factor调高一些,以取得更好的性能调优结果:
gluster volume set gv0 nfs.mem-factor 150
#cluster.read-hash-mode默认值1,在副本卷情况下,这个值如果设置为0则会选择副本中的第一个启动brick读;1 则会根据gfid去选择,这样所有客户端都会选择同一个brick读; 2 是根据 文件gfid和客户端pid 选择副本中的brick,这样当挂载多个客户端则会选择副本中不同的brick。
#场景: 在副本卷模式下,多个客户端或者并发请求一个文件时候,选择2可以有概率使多个读请求分散到副本中的不同brick从而提升性能,不局限在磁盘的性能瓶颈上。
gluster volume set gv0 cluster.read-hash-mode 2
#read-ahead 层时候设置预读页数,默认值4
gluster volume set gv0 performance.read-ahead-page-count 16

#tcp-window-size client缓存的大小,默认值null,缓存区不够,内存足够可以适当调整大小。
gluster volume set gv0 network.tcp-window-size 1048576

#并发网络的开启,默认值off
gluster volume set gv0 performance.client-io-threads on

#限制客户端rpc 请求数(不限制可能出现内存不足),默认64
gluster volume set gv0 server.outstanding-rpc-limit 128

#用来提高小文件读性能
gluster volume set gv0 performance.nfs.quick-read on

#nfs的io-thread选项,作用与io-thread相同
gluster volume set gv0 performance.nfs.io-threads on

#开启禁用features缓存
gluster volume set gv0 features.cache-invalidation on

#设置禁用features缓存失效时间
gluster volume set gv0 features.cache-invalidation-timeout 600

#开启CPU高频性能状态预取
gluster volume set gv0 performance.stat-prefetch on

#开启禁用CPU高频性能缓存
gluster volume set gv0 performance.cache-invalidation on

测试文件系统读写性能:
点为“/glusterfs”,创建测试目录“/glusterfs/test1”。
步骤1执行如下操作,测试1MB文件大小的写性能,记录“IOPS”数值。

# python smallfile_cli.py --operation create --threads 8 --file-size 1024 --files 2048 --top /glusterfs/test1 --host-set host1, host2, host3

步骤2执行如下操作,测试1MB文件大小的读性能,记录“IOPS”数值。

# python smallfile_cli.py --operation read--threads 8 --file-size 1024 --files 2048 --top /glusterfs/test1 --host-set host1, host2, host3

步骤3对比上一节测试的结果,可以看出IOPS性能有所提升。

创建Hot Tier
步骤1创建分布式卷的Hot Tier。

# gluster volume tier gv0 attach host1:/data/tier1/gv0 host2:/data/tier1/gv0 host3:/data/tier1/gv0

步骤2查看卷信息,命令:

gluster volume info gv0

可以看到Hot Tier和Cold Tier的类型和使
用的硬盘。
步骤3执行如下操作,测试1MB文件大小的写性能,记录“IOPS”数值。

# python smallfile_cli.py --operation create --threads 32 --file-size 1024 --files 2048 --top /glusterfs/test --host-set host1, host2, host3

步骤4对比上一节测试的结果,可以看出小文件写IOPS性能有所提升。

你可能感兴趣的:(系统调优)