暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL DBA的自我修养(十三)

记忆乘凉 2016-12-30
288

121:如何临时启用 bbu 的写缓存。

可以通过临时修改raid卡缓存策略为Write Cache OK if Bad BBU来解决。


122:如何解决电池周期性充放电带来的 IO 性能抖动。

方案一:

       根据bbu下次充放电的时间,在业务量较低的时候,提前进行充放电,避免业务高峰期发生raid卡写策略从Write Back Write Through的更改。(手工触发充放电,下次的时间会往后顺延)(DELLRelearn电池周期一般为90天,IBM的电池一般为30天)

方案二:

       设置Forced WriteBack写策略,也就是即是在电池电量低于警戒值甚至电池放电完毕的情况下,强制使用WtiteBack写缓存策略,避免写入性能波动,此时一定要有UPS之类的后备电源,否则当电池放点完毕的时候,服务器恰好断电,会导致写入raid卡缓存中数据丢失。

 


123:如何查看电池下次自动校正时间。

bbu的日志中获取到下次电池relearn时间


手工触发校准的命令

# Megacli64 -AdpBbuCmd ~sbuLearh –aALL

 


124numa 架构的工作特点,为什么不适合 mysql 数据库服务器。

从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构(SMPSymmetricMulti-Processor),非一致存储访问结构(NUMANon-Uniform Memory Access),以及海量并行处理结构(MPPMassive Parallel Processing)

NUMA中,虽然内存直接attachCPU上,但是由于内存被平均分配在了各个die上。只有当CPU访问自身直接attach内存对应的物理地址时,才会有较短的响应时间(后称Local Access)。而如果需要访问其他CPU attach的内存的数据时,就需要通过inter-connect通道访问,响应时间就相比之前变慢了(后称Remote Access)。所以NUMANon-UniformMemory Access)就此得名。


MySQL数据库在numa上的问题:

CPU规模因摩尔定律指数级发展,而总线发展缓慢,导致多核CPU通过一条总线共享内存成为瓶颈;于是NUMA出现了,CPU平均划分为若干个Chip(不多于4个),每个Chip有自己的内存控制器及内存插槽;CPU访问自己Chip上所插的内存时速度快,而访问其他CPU所关联的内存(下文称Remote Access)的速度相较慢三倍左右;于是Linux内核默认使用CPU亲和的内存分配策略,使内存页尽可能的和调用线程处在同一个Core/Chip中;由于内存页没有动态调整策略,使得大部分内存页都集中在CPU 0上;又因为Reclaim默认策略优先淘汰/SwapChip上的内存,使得大量有用内存被换出;当被换出页被访问时问题就以数据库响应时间飙高甚至阻塞的形式出现了。


解决MySQLnumaswap问题的办法:

1.numactl --interleave=all

2.MySQL进程启动前,使用sysctl -q-w vm.drop_caches=3清空文件缓存所占用的空间

3.Innodb在启动时,就完成整个Innodb_buffer_pool_size的内存分配

4.配置vm.zone_reclaim_mode = 0使得内存不足时去remote memory分配优先于swap out local page

5.echo -15 > /proc/<pid_of_mysqld>/oom_adj调低MySQL进程被OOM_killer强制Kill的可能

6.memlock

7.MySQL使用Huge Page(黑魔法,巧用了Huge Page不会被swap的特性)

 


125:如何关闭 numa,列举至少三种方式(服务器级别、os 级别、进程级别)。

1.bios中关闭numa 


interleaving 可以互相交叉存取,将这个打开。

2./etc/grub.cnf

kernel那行之后追加numa= off ,之后重启linux

3.mysql启动之前,修改mysql_safe启动脚本 添加cmd="/usr/binlnumactl--interleave all$cmd“,到下面代码上面,之后保存重启。


4.mysql5.7以后的版本

直接修改参数

Loose_innodb_numa_interleave=1

 


126:判断 numa 是否启动,判断是否因为 numa 的问题造成了 swap

通过numactl --show (显示当前numa策略)

或者numactl hardware(显示当前numa节点情况)查看

[root@localhost ~]# numactl --hardware

available: 1 nodes (0)                    #一个节点 用的是0cpu

node 0 cpus: 0 1 2 3                #0cpu 总的cpu

node 0 size: 2047 MB                    #cpu所有的内存

node 0 free: 122 MB               #cpu空闲内存

node distances:                       节点距离

node   0

  0:  10

[root@localhost ~]# numactl --show

policy: default                       

preferred node: current

physcpubind: 0 1 2 3

cpubind: 0

nodebind: 0

membind: 0

numa的内存分配策略:

缺省(default):总是在本地节点分配

绑定(bind):强制分配到指定节点上

交叉(interleave):在所有节点或者指定节点上交叉分配内存

优先(preferred):在指定节点上分配,失败则在其他节点上分配

通过查看,如果多个节点,其中某个节点free很小,或者为0,就表示因为numa问题造成了swap

 


127linux 内核升级,测试对固态盘的 io 吞吐量的影响。

可以在内核官网www.kernel.org去下载安装包升级更新的内核;测试各个版本的内核对ssd盘的支持,主要是测试压力效果。Fio测试工具,专门测试IO

常见参数配置:


 


128:下载fio(orion)压力测试工具,测试 io 性能。

下载地址:http://fio.updatestar.com/

FIO是一个非常简单好用的性能测试工具,它能对裸设备、块设备、和带文件系统的设备进行测试。

支持的读写种类也很多,多大13种之多,但是我们平时值关心随机读写和顺序读写。

FIO的使用需要提前写好一个配置文件(也可以不写配置文件,但是每次敲命令的时候需要填很多参数),比如:

 1 [write]

 2directory=/mnt/ddb/1

 3 ioengine=libaio

 4 lockmem=1g

 5 iodepth=4

 6 rw=randwrite

 7 bs=32k

 8 direct=1

 9 size=20G

10 lockmem=1G

11 numjobs=5

表明会在/mnt/ddb/1目录下进行操作,他会创建N个指定大小的物理文件进行执行类型的IO操作,N就是numjobs,也就是并发数量。

指定direct=1能对裸盘的测试更准一点,lockmem表明对测试进行使用物理内存的限制。

裸设备的话directory改成filename就可以了,当然裸设备需要使用RAW提前挂载。

filename=/dev/raw/raw1

运行的执行只需要直接 fio conf-file就行了

OrionOracle提供的一个工具,他能在不安装Oracle的情况下模拟数据库压力进行测试,Orion可以在Oracle的网站上直接下载,也不需要编译,直接就跑

同样Orion也可以对裸设备进行测试,和FIO差不多命令如下:

 ./orion_linux_x86 -run advanced -testname test-size_small 8 -matrix row -type rand -duration 60

表明对8K大小的IO_Size进行测试,Testname后面是配置文件,它会自己增加压力,每个测试间隔为60S

-size_small 表明是小IO 它会一直增加并发直到机器的极限,每个测试间隔60S也就是一分钟。

-matrix row 是对小IO测试的,如果是大IO需要-matrix col,文档里都有的。

Orion相比FIO的好处就是它会实时的记录机器的IO变化情况,而FIO测试结束后只会给一个平均的值,这样我们就无法看到这个过程中的波动情况,不过我们可以实时的抓IOstat输出结果绘制图表来看过程中是否出现波动情况。

 


129:写一个完整的 MySQL 安装文档。

硬件选型、价格、mysql 软件、配置、压力测试、监控、参数调整、os 配置、硬件相关参数的配置(raid 卡的 bbu 的配置和管理),整个一个流程要非常的完成,特别是性能监控、调整趋势图(os 层面的监控+数据库层面的监控)

另开 MySQL安装思路和MySQL优化思路。


130:dell服务器配置解读。


131:MySQL引擎功能解读

MySQL支持的是表的插件式的存储引擎,目前选择有很多,使用最多的主要是InnoDBMyisam。官方手册上说后者的速度要快于前者3倍左右,确实后者的运行过程要简于前者,在效率上应该更快。但不同的存储引擎适合不同的应用,对于存储引擎的选择,it all depends

InnoDB5.5版本之后成为了默认的存储引擎。它支持事务、支持外键,支持行锁,支持MVCC多版本并发控制,更加适用于OLTP应用。值得一提的事它在5.6版本之后具有了Myisam的所有功能。

Myisam5.5版本之前的默认存储引擎,它不支持事务,具有高速存储、检索和全文搜索能力,适合OLAP应用进行ETL相关操作。

 


132:下载 maridb percona 两个版本,安装试用一下。

目前MySQL有三个版本:官方版本(Oracle MySQL)PerconaMariaDB

官方版本就是原始MySQL的延续;Percona版本现在是一个相对比较成熟的优秀的MySQL分支版本,在性能提升、可靠性、管理型方面做了很多改善,并且它和官方版本基本完全兼容,在性能上有大约20%以上的提升;MariaDB版本是原来MySQL的团队重新做的,目标是为了取代原始版本,它在原来的MySQL Server层做了大量源码级的改进,但也因此产生了和官方版本部分无法兼容的特性。目前大多数人会选择官方版本,perona是目前比较推荐使用的。

 


文章转载自记忆乘凉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论