numa

时间:2024-08-22 20:58:01编辑:阿星

Linux上MySQL优化提升性能 哪些可以优化的关闭NUMA特性

Linux上MySQL优化提升性能,可以优化关闭NUMA特性如下:
这些其实都源于CPU最新的技术:节能模式。操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。
为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好,更彻底。
然后我们看看内存方面,我们有哪些可以优化的。
i)
我们先看看numa
非一致存储访问结构
(NUMA

Non-Uniform
Memory
Access)
也是最新的内存管理技术。它和对称多处理器结构
(SMP

Symmetric
Multi-Processor)
是对应的。
我们可以直观的看到:SMP访问内存的都是代价都是一样的;但是在NUMA架构下,本地内存的访问和非
本地内存的访问代价是不一样的。对应的根据这个特性,操作系统上,我们可以设置进程的内存分配方式。目前支持的方式包括:
--interleave=nodes
--membind=nodes
--cpunodebind=nodes
--physcpubind=cpus
--localalloc
--preferred=node
简而言之,就是说,你可以指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非
是设置为--interleave=nodes轮询分配方式,即内存可以在任意NUMA节点上分配这种方式以外。其他的方式就算其他NUMA节点上还有内
存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来获得内存。
所以最简单的方法,还是关闭掉这个特性。
关闭特性的方法,分别有:可以从BIOS,操作系统,启动进程时临时关闭这个特性。
a)
由于各种BIOS类型的区别,如何关闭NUMA千差万别,我们这里就不具体展示怎么设置了。
b)
在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:
kernel
/vmlinuz-2.6.32-220.el6.x86_64
ro
root=/dev/mapper/VolGroup-root
rd_NO_LUKS.UTF-8
rd_LVM_LV=VolGroup/root
rd_NO_MD
quiet
SYSFONT=latarcyrheb-sun16
rhgb
crashkernel=auto
rd_LVM_LV=VolGroup/swap
rhgb
crashkernel=auto
quiet
KEYBOARDTYPE=pc
KEYTABLE=us
rd_NO_DM
numa=off
另外可以设置
vm.zone_reclaim_mode=0尽量回收内存。
c)
启动MySQL的时候,关闭NUMA特性:
numactl
--interleave=all
mysqld
当然,最好的方式是在BIOS中关闭。
ii)
我们再看看vm.swappiness。
vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。
具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive
内存交换出去,还是释放数据的cache。


CPU使用内存是NUMA架构的吗

并行计算的背景:
自计算机诞生之日起,对其提供更强计算能力的追求始终没有间断。早期的计算机通过不断地提高时钟频率来加快处理速度。现在,时钟的问题越来越遇到限制,根据爱因斯坦相对论,电子的速度不会超过光速,频率的不断提高,意味着电子信号从一段到达另一端的距离就要越短,计算机就要不断变小。但是,伴随时钟的加快,处理器的热量也急剧增大,散热部件必不可少,迫使计算机的体积不可能无限制的减小,通过加快时钟来增强计算能力的方法遇到了瓶颈。
既然不能将计算机无限变小,那么就尝试另一种思路,通过扩展计算单元的数量,达到增强计算能力的目的。于是就有了多处理机系统,包括并行计算机,以及分布式计算机系统。NUMA(Non Uniform Memory Access)作为多处理机系统一种典型架构,具有区别于其他多处理机系统的特性。
1.具有对所有CPU可见的统一的地址空间
2.通过LOAD、STORE指令访问远端存储器
3.访问远端存储器的速度低于访问本地存储器

NUMA系统简介:
NUMA(Non Uniform Memory Access),即非一致内存访问,是针对UMA(Uniform Memory Access)提出的。典型的UMA架构,如SMP(Symmetric MultiProcessing)机器,多个CPU以及一个或多个主存储器模块通过一条系统总线通信。随着系统规模的扩大,CPU数量不断增加,对系统总线的争抢现象越发严重,系统总线带宽成为了多CPU访存的瓶颈。
NUMA架构下,多CPU对主存的访问并非对等的,每个CPU都有自己的主存, CPU与自己的主存物理上距离更近,访问速度更快,而访问远端存储器的速度相对要慢。NUMA用Node来管理CPU与主存。一个NUMA系统由多个NUMA Node组成,其中每个Node可以拥有多个CPU,但是只有一个内存控制器,保证本Node的所有CPU对本Node的主存实现对等访问,而其它Node的CPU对本Node的主存访问延迟要大一些。

NUMA系统的启动流程:

系统加电,对于单CPU机器,CPU直接执行BIOS程序,但是对于多处理机系统,由哪个CPU执行该程序是个问题。针对这个问题,Intel提出了Multiple Processor Initialization Protocol,该协议规定了两种类型的CPU,作为主启动CPU的BSP(Bootstrap Processor),作为应用服务CPU的AP(Application Processor),系统加电后通过主板上的硬件选择机制,选择一个CPU作为BSP,而将其它CPU作为AP。(具体的协议与选择算法细节,参考《IA-32 Architectures Software Developer's Manual 3A》,Chapter 7,Multiple Processor Management)[1]在BSP上执行BIOS程序,读取/设置CMOS相关信息,并完成自检程序,为其它AP建立管理列表,此时所有AP均处于空转状态。
Linux通过读取系统的firmware中的ACPI表,获得NUMA系统的CPU及物理内存分布信息,最重要的是SRAT(System Resource Affinity Table)和SLIT(System Locality Information Table)。SRAT中包含两个结构,Processor Local APIC/SAPIC Affinity Structure用于记录CPU信息,Memory Affinity Structure用于记录主存信息[3]。Linux kernel中通过include/acpi/actbl1.h中acpi_table_slit与acpi_table_srat记录SLIT与SRAT结构信息,通过acpi_numa_init()函数读取系统firmware中的数据,赋值给以上两个结构,用于NUMA系统初始化。代码(以Linux2.6.36 kernel为例)


Linux上MySQL优化提升性能,哪些可以优化关闭NUMA特性?

Linux 进程通过 C 标准库中的内存分配函数 malloc 向系统申请内存,但是到真正与内核交互之间,其实还隔了一层,即内存分配管理器(memory allocator)。常见的内存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默认使用的是 glibc 的 ptmalloc 作为内存分配器。内存分配器采用的是内存池的管理方式,处在用户程序层和内核层之间,它响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序。为了保持高效的分配,分配器通常会预先向操作系统申请一块内存,当用户程序申请和释放内存的时候,分配器会将这些内存管理起来,并通过一些算法策略来判断是否将其返回给操作系统。这样做的最大好处就是可以避免用户程序频繁的调用系统来进行内存分配,使用户程序在内存使用上更加高效快捷。关于 ptmalloc 的内存分配原理,个人也不是非常了解,这里就不班门弄斧了,有兴趣的同学可以去看下华庭的《glibc 内存管理 ptmalloc 源代码分析》。关于如何选择这三种内存分配器,网上资料大多都是推荐摒弃 glibc 原生的 ptmalloc,而改用 jemalloc 或者 tcmalloc 作为默认分配器。因为 ptmalloc 的主要问题其实是内存浪费、内存碎片、以及加锁导致的性能问题,而 jemalloc 与 tcmalloc 对于内存碎片、多线程处理优化的更好。目前 jemalloc 应用于 Firefox、FaceBook 等,并且是 MariaDB、Redis、Tengine 默认推荐的内存分配器,而 tcmalloc 则应用于 WebKit、Chrome 等。

上一篇:炫舞情侣装自定义图片

下一篇:鲜肉教师