Posts tagged ‘linux’

Linux上MySQL优化三板斧

现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简单的策略。这些方法都有助于改进MySQL的性能。
闲话少说,进入正题。

一、CPU

首先从CPU说起。
你仔细检查的话,有些服务器上会有的一个有趣的现象:你cat /proc/cpuinfo时,会发现CPU的频率竟然跟它标称的频率不一样:

这个是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我们发现第5颗CPU的频率为1.2G。
这是什么原因列?
这些其实都源于CPU最新的技术:节能模式。操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。这对环保人士和抵制地球变暖来说是一个福音,但是对MySQL来说,可能是一个灾难。
为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好,更彻底。由于各种BIOS类型的区别,设置为CPU为最大性能模式千差万别,我们这里就不具体展示怎么设置了。

二、内存

然后我们看看内存方面,我们有哪些可以优化的。

i)我们先看看numa

非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 也是最新的内存管理技术。它和对称多处理器结构 (SMP : Symmetric Multi-Processor) 是对应的。简单的队别如下:

Smp numa

如图所示,详细的NUMA信息我们这里不介绍了。但是我们可以直观的看到:SMP访问内存的都是代价都是一样的;但是在NUMA架构下,本地内存的访问和非本地内存的访问代价是不一样的。对应的根据这个特性,操作系统上,我们可以设置进程的内存分配方式。目前支持的方式包括:

简而言之,就是说,你可以指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非是设置为–interleave=nodes轮询分配方式,即内存可以在任意NUMA节点上分配这种方式以外。其他的方式就算其他NUMA节点上还有内存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来获得内存。有经验的系统管理员或者DBA都知道SWAP导致的数据库性能下降有多么坑爹。
所以最简单的方法,还是关闭掉这个特性。
关闭特性的方法,分别有:可以从BIOS,操作系统,启动进程时临时关闭这个特性。
a)由于各种BIOS类型的区别,如何关闭NUMA千差万别,我们这里就不具体展示怎么设置了。
b)在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:

另外可以设置 vm.zone_reclaim_mode=0尽量回收内存。
c)启动MySQL的时候,关闭NUMA特性:

当然,最好的方式是在BIOS中关闭。

ii)我们再看看vm.swappiness。

vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。
具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive 内存交换出去,还是释放数据的cache。cache中缓存着从磁盘读出来的数据,根据程序的局部性原理,这些数据有可能在接下来又要被读取;inactive 内存顾名思义,就是那些被应用程序映射着,但是“长时间”不用的内存。
我们可以利用vmstat看到inactive的内存的数量:

通过/proc/meminfo 你可以看到更详细的信息:

这里我们对不活跃inactive内存进一步深入讨论。Linux中,内存可能处于三种状态:free,active和inactive。众所周知,Linux Kernel在内部维护了很多LRU列表用来管理内存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用来管理匿名页,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用来管理page caches页缓存。系统内核会根据内存页的访问情况,不定时的将活跃active内存被移到inactive列表中,这些inactive的内存可以被交换到swap中去。
一般来说,MySQL,特别是InnoDB管理内存缓存,它占用的内存比较多,不经常访问的内存也会不少,这些内存如果被Linux错误的交换出去了,将浪费很多CPU和IO资源。 InnoDB自己管理缓存,cache的文件数据来说占用了内存,对InnoDB几乎没有任何好处。
所以,我们在MySQL的服务器上最好设置vm.swappiness=0。

我们可以通过在sysctl.conf中添加一行:

并使用sysctl -p来使得该参数生效。

三、文件系统

最后,我们看一下文件系统的优化

i)我们建议在文件系统的mount参数上加上noatime,nobarrier两个选项。

用noatime mount的话,文件系统在程序访问对应的文件或者文件夹时,不会更新对应的access time。一般来说,Linux会给文件记录了三个时间,change time, modify time和access time。
我们可以通过stat来查看文件的三个时间:

其中access time指文件最后一次被读取的时间,modify time指的是文件的文本内容最后发生变化的时间,change time指的是文件的inode最后发生变化(比如位置、用户属性、组属性等)的时间。一般来说,文件都是读多写少,而且我们也很少关心某一个文件最近什么时间被访问了。
所以,我们建议采用noatime选项,这样文件系统不记录access time,避免浪费资源。
现在的很多文件系统会在数据提交时强制底层设备刷新cache,避免数据丢失,称之为write barriers。但是,其实我们数据库服务器底层存储设备要么采用RAID卡,RAID卡本身的电池可以掉电保护;要么采用Flash卡,它也有自我保护机制,保证数据不会丢失。所以我们可以安全的使用nobarrier挂载文件系统。设置方法如下:
对于ext3, ext4和 reiserfs文件系统可以在mount时指定barrier=0;对于xfs可以指定nobarrier选项。

ii)文件系统上还有一个提高IO的优化万能钥匙,那就是deadline。

在Flash技术之前,我们都是使用机械磁盘存储数据的,机械磁盘的寻道时间是影响它速度的最重要因素,直接导致它的每秒可做的IO(IOPS)非常有限,为了尽量排序和合并多个请求,以达到一次寻道能够满足多次IO请求的目的,Linux文件系统设计了多种IO调度策略,已适用各种场景和存储设备。
Linux的IO调度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP。每种调度策略的详细调度方式我们这里不详细描述,这里我们主要介绍CFQ和Deadline,CFQ是Linux内核2.6.18之后的默认调度策略,它声称对每一个 IO 请求都是公平的,这种调度策略对大部分应用都是适用的。但是如果数据库有两个请求,一个请求3次IO,一个请求10000次IO,由于绝对公平,3次IO的这个请求都需要跟其他10000个IO请求竞争,可能要等待上千个IO完成才能返回,导致它的响应时间非常慢。并且如果在处理的过程中,又有很多IO请求陆续发送过来,部分IO请求甚至可能一直无法得到调度被“饿死”。而deadline兼顾到一个请求不会在队列中等待太久导致饿死,对数据库这种应用来说更加适用。
实时设置,我们可以通过
[pre]
echo deadline >/sys/block/sda/queue/scheduler[/pre]

来将sda的调度策略设置为deadline。

我们也可以直接在/etc/grub.conf的kernel行最后添加elevator=deadline来永久生效。

总结

  1. CPU方面
    • 关闭电源保护模式
  2. 内存:
    • vm.swappiness = 0
    • 关闭numa
  3. 文件系统:
    • 用noatime,nobarrier挂载系统
    • IO调度策略修改为deadline。

 

参考文档:
http://www.gentoo-wiki.info/FAQ_Linux_Memory_Management
http://bbs.gfan.com/android-4165836-1-1.html
https://wiki.archlinux.org/index.php/CPU_Frequency_Scaling_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://www.mysqlperformanceblog.com/2013/12/07/linux-performance-tuning-tips-mysql/

mount点fail以后影响rpm和check_raid

今天碰到一个比较奇怪的问题。我们的一台机器,突然跑rpm和check_raid会hang死。
另外一个同事跟进以后发现把这个系统中一个已经失效mount点强制umount掉以后就能够恢复。
感觉这个是两个问题啊。

库哥通过strace最终找到了具体的原因。
通过strace可以看到rpm运行的时候会首先检查整个文件系统的挂载点。
由于该挂载点的提供服务者已经下线,所以对应的节点访问会hang住。
也就导致了rpm无法继续运行下去。
目前还不能确认这种问题的影响面有多少。

另外一位大牛旺旺介绍了文件系统IO延时的文章。先记录下来,细细品味
Brendan Gregg 写的关于文件系统IO延时的系列文章,,虽然是基于Solaris系统做的,,对于Linux以及相关的系统也比较有参考意义,,有兴趣的同学可以了解下.
http://dtrace.org/blogs/brendan/2011/05/11/file-system-latency-part-1/
http://dtrace.org/blogs/brendan/2011/05/13/file-system-latency-part-2/
http://dtrace.org/blogs/brendan/2011/05/18/file-system-latency-part-3/
http://dtrace.org/blogs/brendan/2011/05/24/file-system-latency-part-4/

may your success

dell dset工具收集日志以及dell bios升级

上周对最核心的中文站主机进行了bios升级,其中涉及到dell相关日志的收集以及bios升级的办法,这里记录下来,以便以后如果还有类似需要,进行查阅。
首先,dell 的dset工具使用和介绍本身官网上就有:http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=20&tid=99848&type=email_tool。这个工具可以用来收集系统驱动,服务,网络设置等等,同时又包括CPU,memory, ESM log, BIOS/firmware versions and system health (fan/voltage levels). ,它也收集系统存储信息,比如:RAID卡,硬盘等。运行方式没有找到非交互式的办法,估计只好解压bin包来搞了。运行这个文件以后会在指定的目录或者在用户根目录下产生一个压缩文件。解压文件需要密码,偷偷的告诉你,就是:dell。解压的文件夹里面dsetreport.hta就是一个网页文件,看起来还是比较爽的。
然后:我们DELL R710机器的bios下载地址http://ftp.us.dell.com/bios/PER710_BIOS_LX_2.3.12.BIN
另外找dell的工程师要了几个工具的下载地址和使用说明:
OSMA软件下载(windows版):http://ftp.us.dell.com/sysman/OM-SrvAdmin-Dell-Web-WIN-6.4.0-1266_A00.18.exe
OSMA软件下载(Linux版):http://ftp.us.dell.com/sysman/OM_6.1.0_ManNode_A00.tar.gz
ITA软件下载:http://ftp.us.dell.com/sysman/OM-ITAssistant-Dell-Web-WIN-6.4.0-1266_A00.11.exe
ITA使用说明:http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=20&tid=163390

利用MegaCli和smartCtl工具获得ssd盘使用情况

之前详细询问了intel工程师关于怎么获得ssd盘使用情况的信息,并在杭州核心集群offer获得使用了一年多的ssd盘机器信息,目前该批机器ssd盘基本上都只耗一滴血,非常健康。
这里简单描述一下,怎么利用MegaCli和smartCtl获得ssd盘使用情况
首先,由于我们的服务器是做了raid的,所以需要用MegaCli获得各个适配器下的各个磁盘的信息。(目前我们的MySQL机器基本只有一个适配器)MegaCli有很多参数,具体的用法就不详细介绍了。
这里我们用MegaCli -PDList –aALL获得所有的适配器的物理磁盘信息。
例如:
Enclosure Device ID: 32
Slot Number: 4
Device Id: 4
Sequence Number: 2
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Last Predictive Failure Event Seq Number: 0
Raw Size: 122880MB [0xf000000 Sectors]
Non Coerced Size: 122368MB [0xef00000 Sectors]
Coerced Size: 122368MB [0xef00000 Sectors]
Firmware state: Online
SAS Address(0): 0x1221000004000000
Connected Port Number: 4(path0)
Inquiry Data: ATA     INTEL SSDSA2M16002HACVPO944400FM160AGN
这个就是其中一块物理磁盘的信息。
我们可以看到它的适配器编号(Enclosure Device ID: 32),设备编号(Device Id: 4),磁盘大小(Raw Size: 122880MB [0xf000000 Sectors]),连接口(Connected Port Number: 5(path0)),上线状态(Firmware state: Online。也有可能是hotspare)以及磁盘信息(Inquiry Data: ATA     INTEL SSDSA2M16002HACVPO944400FM160AGN,intel的ssd盘)
然后,通过smartctl我们可以获得对应磁盘的具体信息。smartctl是smartmontools工具包中的其中一个工具。
注意:这里smartctl的版本需要比较新,比如5.1.40已上
smartctl -a -d megaraid,4 /dev/sdb
这里megaraid,4的4表示上面MegaCli输出中的Device Id: 4,也就是说我们希望读取物理磁盘4的磁盘信息。
ssd盘的输出信息和sas盘的输出信息不同,特别是在
Vendor Specific SMART Attributes with Thresholds:段。
该段有很多ssd盘独有的参数。具体的参数请参考intel的pdf文件。
这里截取杭州offer集群的一台机器信息作为参考:
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
3 Spin_Up_Time            0x0000   100   000   000    Old_age   Offline      –       0
4 Start_Stop_Count        0x0000   100   000   000    Old_age   Offline      –       0
5 Reallocated_Sector_Ct   0x0002   100   100   000    Old_age   Always       –       0
9 Power_On_Hours          0x0002   100   100   000    Old_age   Always       –       10362
12 Power_Cycle_Count       0x0002   100   100   000    Old_age   Always       –       62
192 Unsafe_Shutdown_Count   0x0002   100   100   000    Old_age   Always       –       44
232 Available_Reservd_Space 0x0003   100   100   010    Pre-fail  Always       –       0
233 Media_Wearout_Indicator 0x0002   099   099   000    Old_age   Always       –       0
225 Host_Writes_32MiB       0x0000   200   200   000    Old_age   Offline      –       1284966
226 Intel_Internal          0x0002   255   000   000    Old_age   Always       –       0
227 Intel_Internal          0x0002   000   000   000    Old_age   Always       –       0
228 Intel_Internal          0x0002   000   000   000    Old_age   Always       –       0
其中我们比较关注的有以下四点:
1、Media_Wearout_Indicator:    使用耗费,100为没有任何耗费; 表示SSD上NAND的擦写次数的程度,初始值为100,随着擦写次数的增加,开始线性递减,递减速度按照擦写次数从0到最大的比例。一旦这个值降低到 1,就不再降了,同时表示SSD上面已经有NAND的擦写次数到达了最大次数。这个时候建议需要备份数据,以及更换SSD。
上面的机器为099,按照100滴血算,目前只耗了1滴血
2、Reallocated_Sector_Ct: 出厂后产生的坏块个数, 初始值为100,如果有坏块,从1开始增加,每4个坏块增加1
这里offer的机器还没有任何坏块
3、Host_Writes_32MiB: 已写32MiB, 每写入65536个扇区raw value增加1。这个扇区还是个数量单位,512字节
比如:这块盘就是 1284966 * 65536 * 512 = 40155.1875 GB
注意到每个机器都有一块盘写的比较少,这块盘就是hotspare盘。
每台机器我们有7块ssd盘。其中6块盘做的raid 5,第7块盘做的hotspare。
4、Available_Reservd_Space: SSD上剩余的保留空间, 初始值为100,表示100%,阀值为10,递减到10表示保留空间已经不能再减少
offer的机器基本都没有什么降低。
这样我们就获得了ssd盘的使用情况。
这里我再把林总的计算ssd盘还能用多久的方法摘录如下:
从这些值还可以推算一些东西:
offer集群的SSD单块盘累计写入量大约是40T  VS offer集群基本上都在99-100,磨损的程度非常低(初始值是100)。
Intel的均匀磨损算法控制得很好,基本上保证了磨损程度是平均的。
假设SSD单盘实际100GB(64GB+保留容量)大小,写入量40TB的话,就是每块单盘经历了40TB/100GB=400次相当于全盘写一遍,去除第一次空盘时写入的量,还有399次应该是“擦除”-“写入”的过程,为计算简便,我们就认为已经擦写了400次了。再考虑磨损率最大仅有1%,则我们的SSD盘厂商保证可擦写次数>=400/0.01=40000次(这个数字也是非常靠谱的),于是可以推算出:
1.         咱们的盘至少还可以写入(40000-400)*100GB=3960TB的数据
2.         上线到现在超过半年了,按已有的使用率(半年写入40TB),还可以用3960TB/40/2=49.5年
什么概念呢?不出其他的问题,理论上offer集群的SSD盘极限可用50年,当然我们不会用那么久,也不能等磨损率99%了才去考虑换盘,但是用到磨损率50%也可25年之久,再考虑材料性能的衰减,至少用上3、5年肯定是没有问题的