数据库调优之硬件
作者:代晓磊_360
各种数据库官方都有硬件有一定要求,本文就比较普惠的告诉大家为啥要这样设置,以及不同的设置有啥不同。首先硬件都在适配操作系统的,数据库是安装在操作系统之上。不同的分布式数据库对于软件和硬件都有一些推荐配置。比如 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 来抓包查看