作者:代晓磊
原文来源: tidb.net/blog/7d54d9…
各种数据库官方都有硬件有一定要求,本文就比较普惠的告诉大家为啥要这样设置,以及不同的设置有啥不同。首先硬件都在适配操作系统的,数据库是安装在操作系统之上。不同的分布式数据库对于软件和硬件都有一些推荐配置。比如TiDB在Linux平台推荐CentOS 7.3+版本,并且如果要运行生产环境的集群,TiDB/PD/TiKV等组件都有最低的CPU、内存、硬盘、网卡要求。本文在满足这些需求的基础上,探讨下硬件参数优化。
CPU
先从CPU聊起
- CPU选型
可以分为计算型和存储型。计算型往往需要更多的CPU核心和更高的主频。存储型的CPU可能就配置稍微低些。对于计算型和存储型CPU选择,拿数据库服务器来说,大家可以从TiDB server(计算)和TiKV(存储)使用的CPU来区分,提前规划的目的是为了硬件采购更加合理,节省成本。
- CPU架构:X86/ARM
X86架构出现在intel/AMD的CPU架构中,采用复杂指令集,也是目前最主流服务器的CPU架构。ARM架构CPU在手机,mac笔记本,以及华为等国产服务器厂商中出现。目前各大公司主要采购的是X86-64架构的CPU,也对ARM服务器进行了web和数据库应用的验证,对于全球缺“芯”的现实来说,ARM CPU未来可期,大家有时间有资源的时候可以测测mysql/redis/tidb等数据库在ARM服务器上的表现。
- Numa绑核
现在针对多核心CPU,每个CPU都有自己专属/本地的mem,当然访问本地的mem比其跨NUMA访问内存来的更快,开启NUMA会优先就近使用内存,在本NUMA上的内存不够的时候默认是到其它NUMA上分配内存,也就是跟关闭NUMA是一样的。所以在单机多数据库部署时推荐配置。
- CPU-动态节能技术
cpufreq 是一个动态调整 CPU 频率的模块,可支持五种模式。为保证服务性能应选用 performance 模式,将 CPU 频率固定工作在其支持的最高运行频率上,从而获取最佳的性能,一般都是默认powersave,可以通过 cpupower frequency-set修改。
Memory
- 关闭Swap
大家都知道Swap是用硬盘来承接到达一定阀值的内存访问,由vm.swappiness 参数控制,默认 60,也就是系统内存使用到40%时开始使用swap,TiDB 运行需要有足够的内存。如果内存不足,不建议使用 swap 作为内存不足的缓冲,因为这会降低性能。建议永久关闭系统 swap。
- min_free_kbytes
该内核参数控制了多少内存应该保持空闲而不被文件系统缓存占用。通常情况下,内核会用文件系统缓存占据几乎所有的空闲内存,并根据需要释放内存供进程分配。由于数据库会共享内存中执行大量的分配,默认的内核值可能会导致意外的OOM(Out-of-Memory kill),在mem>40G的情况下,建议将该参数配置为至少1GB,但是不建议超过总内存的5%,这可以确保Linux始终保持足够的内存可用。
- 关闭透明大页(即 Transparent Huge Pages,缩写为 THP)
数据库的内存访问模式往往是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟,若开启针对 THP 的直接内存规整功能,也会出现系统 CPU 使用率激增的现象,因此建议关闭 THP。
- 虚拟内存dirty_ratio/dirty_background_ratio参数
dirty_ratio 绝对的脏页百分比值限限制。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统将开始使用 pdflush 操作将脏的 page cache 写入磁盘。默认值为 20%,也就是说如果到达该值时可能会导致应用进程的IO等待,通常不需调整。
dirty_background_ratio 百分比值。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统开始在后台将脏的 page cache 写入磁盘。默认值为 10%,如果后台刷脏页的慢,而数据写的快就容易触发上面dirty-ratio的限制。通常不需调整。对于高性能 SSD,比如 NVMe 设备来说,设置较低的值有利于提高内存回收时的效率。
硬盘
- 硬盘选型
SAS/SATA SSD/PCi-e SSD/持久内存:傲腾
(1) SAS一般跟RAID卡搭配,实现raid 0/1/10/5等阵列扩展。
(2) SATA支持热插拔,接口最高6G/s
(3) PCIE传输速率更高8G/s,但是支持多通道,可以线性扩展速率。之前网卡/显卡都在用。上面3个接口协议不同,AHCI转为SAS和SATA设计,NVMe协议为PCIE SSD设计性能更优。一般核心的+高I/O的数据库都采用该类型SSD。
(4) 持久内存:傲腾,有钱可以买,它提供丰富的底层接口,对于需要极致写入性能的,可以考虑。持久内存将经济实惠的更大容量与对数据持久性的支持巧妙的结合在一起。以创新技术提供独特的操作模式,可以满足您针对各种工作负载的需求。
除了上面的硬盘外,还有RAID,常见的RAID级别有0/1/5/10,使用RAID的目的就是为了增强写入速度、扩容存储以及可恢复磁盘的作用。RAID主要分为软RAID、硬RAID二种。软RAID是由操作系统来完成的,所以处理I/O时还需要CPU,建议有条件的公司采用硬件RAID卡,硬件RAID卡在独立的RAID控制器和I/O处理下,不占用CPU资源,拥有很好的I/O性能。
- I/O 调度算法
1、noop(no operation)
Noop调度算法是内核中最简单的IO调度算法。Noop调度算法将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应用,因为内核的 I/O 调度操作会导致性能损失。在NVMe SSD这种高速I/O设备调度算法设置 noop 后,直接将 I/O 请求下发给硬件(没有内核赚差价),从而获取更好的性能。
2、CFQ(Completely Fair Queuing)
CFQ尝试提供由发起I/O进程决定的公平的I/O调度,该算法为每一个进程分配一个时间窗口,在该时间窗口内,允许进程发出IO请求。通过时间窗口在不同进程间的移动,保证了对于所有进程而言都有公平的发出IO请求的机会,假如少数进程存在大量密集的I/O请求的情况,会出现明显的I/O性能下降。
3、 deadline
DEADLINE调度算法主要针对I/O请求的延时而设计,每个I/O请求都被附加一个最后执行期限。读请求和写请求被分成了两个队列,默认优先处理读IO,除非写快被deadline时才调度。当系统中存在的I/O请求进程数量比较少时,与CFQ算法相比,DEADLINE算法可以提供较高的I/O吞吐率。
- 文件系统选择?Ext4 or XFS?
ext4是第四代扩展文件系统,是ext3文件系统的后继版本,相比ext3,ext4取消子目录限制,支持的文件卷达到1EB,最大文件支持达到16TB,对于大数据存储足够,ext4在fsck(file system check)做了大量优化,相比ext3用时少很多。
xfs是由SGI公司设计的优秀的64位文件系统。xfs在可扩展、并行I/O、online碎片整理、延迟性能分配等方面做了大量改进,被称为业界最先进的、最具可升级性的文件系统技术。最大文件系统支持8EB,但文件也支持16TB,CentOS 7开始就用XFS作为默认的文件系统了,XFS的性能也比EXT4好。
最后为啥TiDB用ext4,为啥不用xfs?官方给出的是:稳定性
- ext4磁盘挂载参数
- 1、nodelalloc 关闭延迟分配
提到nodealloc需要先知道delalloc, delalloc是说把所有的block分配推到真正要写数据的时候,之前有淘宝内核在线上业务中反馈出delalloc延迟分配导致的写延迟问题,所以禁用延迟分配。
- 2、noatime
读取文件时,将禁用对元数据的更新。Linux 在默认情况下使用atime选项,每次在磁盘上读取(或写入)数据时都会产生一个记录。默认的atime 选项最大的问题在于即使从页面缓存读取文件(从内存而不是磁盘读取),也会产生磁盘写操作。
网络
网卡我们很少关注,主要在出现“抖动”问题时查看下监控,排查下流量等问题,日常只需要根据流量和网络延迟的要求选择千兆和万兆即可。所以这里主要涉及到2个方面,一个是网卡的稳定性,一个是网卡的速率。
1、网卡的速率
在现在越来越多的数据库100G网络时,我们现在还在准备将服务器的网卡从千兆升级到万兆网卡,其实是否升级还是看数据库服务器网卡流量和网络延迟情况。在目前的大多数流量情况下,千兆网卡足够用来对外提供服务,而对于PD/tikv等心跳数据交换非常频繁的组件,建议使用万兆网卡。
2、网卡的稳定性
网卡稳定提供服务是数据库服务器的基本要求,为了保障网络稳定性,一般都会采用双网卡做冗余,可以分为2种情况,一是双网卡做bond4,这样任意一个网卡故障都不影响业务的正常运行。另外双网卡的作用可以一块网卡提供数据的读写服务器,另外一块儿网卡用于日常探活和DB备份,这样可以避免DB备份对一块儿网卡流量的影响。
3、网络问题排查的思路
- 查看硬件监控,看网卡是否被跑满了
- 查看连通性:ethtool ent0+ping ip+telnet ip 端口,是否是防火墙问题?
- traceroute查看每一条延迟,iftop看tcp链接的带宽占用
- 如果有丢包可以使用ethtool -S eth0|grep drop查看,也可以使用tcpdump来抓包查看