zoukankan      html  css  js  c++  java
  • mysql案例~关于linux服务器本身的优化问题

    简介:mysql服务优化分为 1服务器本身的优化 2mysql本身的性能优化 今天咱们来讨论下服务器本身的优化性能

    一 参数的优化简介

      1 文件系统的选择

      Linux 常用文件系统:

      ext3, ext4, XFS, ReiserFS, JFS

      其中最常用的是 ext4, XFS。非常不建议用低于ext4版本的文件系统。主流默认是ext4

      2 IO调度算法

      noop anticipatory deadline cfg四中算法 下面会分别介绍

      1)CFQ(完全公平排队I/O调度程序)

      CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求并不一定能被满足,可能会出现饿死的情况。

      可以看出 并不是按照先后请求的顺序来进行处理,你可以想象成基于成本花销

      2)NOOP(电梯式调度程序)

      该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求。可以看出 大体是按照顺序IO处理,然后可能会实时的合并     相邻IO

       3)Deadline(截止时间调度程序)

       DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队    列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:

       FIFO(Read) > FIFO(Write) > CFQ 可以看出 这种算法会优先处理读IO和写IO

       Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择.

       4)AS(预料I/O调度程序)

       CFQ和DEADLINE考虑的焦点在于满足零散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO都设置了6ms的等待时间窗     口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足。

      在传统的SAS盘上,CFQ、DEADLINE、ANTICIPATORY都是不错的选择;对于专属的数据库服务器,DEADLINE的吞吐量和响应时间都表现良好。然而在新兴的固态硬盘比如SSD、Fusion IO上,最简单的NOOP反而可能是最好的算法,因为其他三个算法的优化是基    于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且IO响应时间非常短。

      3 系统最大打开文件数

      最大文件打开数与文件句柄有关,一旦打开的文件数(比如表文件)过多,会导致程式错误。所以提倡设置成最大打开数 65535

      4 NUMA

       NUMA的访问策略默认是local,优先使用本地内存,内存跟cpu 是有绑定的。numa会分配多个numa节点,数据库本身是很吃内存的,所以会导致单个numa节点内存很容易耗尽,内存不够时虚拟内存频繁与硬盘交换数据,导致性能急剧下降。而默认的测试是不允许从  其他numa节点获取内存的。这点对于mongodb服务尤其影响严重,可能会导致CPU暴涨。所以最好关闭NUMA

      5 swap占用比

      mysql对于服务器内存的使用要避免使用大量的swap空间,否则很容易造成性能问题。此参数的调节可以控制linux可能使用swap的频率,越小 代表越使用swap的频率会降低。但是注意设置了swappiness=0并不代表一定没有swap发生,同时设为0也确实会可能发生OOM。

     6 文件缓存参数

       dirty_ratio与dirty_background_ratio

       简单来说就是刷新脏页比

        1 当脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_background_ratio时,内核的flusher线程开始回写脏页数据。所有可用内存不等于总的系统内存。

        2 脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_ratio时,执行磁盘写操作的进程会自己开始回写脏数据。所有可用内存不等于总的系统内存。

       这两个参数并不矛盾,会先触发参数2 然后 如果系统脏页数量继续增长会触发参数1

    二 脚本检测和建议

     #!/usr/bin/python
     #coding=utf-8
     import commands
     def zhixing(a,b,c):
     (status, output) = commands.getstatusoutput(a)
     print "######%s#######" %(b,)
     print output
     print "*******%s*******" %(c,)
     zhixing("df -Th|awk '{print $1,$2}'|grep -v 'tmpfs'","查看文件系统","建议data分区为xfs")
     zhixing("cat /sys/block/sda/queue/scheduler","查看IO调度算法","建议采用deadline算法,不要用cfg算法")
     zhixing("ulimit -a|grep 'open files'","查看文件打开数","建议设置为系统最大65535")
     zhixing("grep -i numa /var/log/dmesg","NUMA是否开启","强烈建议关闭NUMA")
     zhixing("sysctl -a | grep swappiness","swap占用比","建议值设置为1-10")
     zhixing("sysctl -a | grep dirty_ratio","dirty刷新脏页比1","设置为20比较好")
     zhixing("sysctl -a | grep dirty_background_ratio","dirty刷新脏页比2","设置为5-10比较好")

    三 相关解决办法

     1 如何关闭numa

         1.硬件层,在BIOS中设置关闭;

         2.OS内核,启动时设置numa=off;

         3.可以用numactl命令将内存分配策略修改为interleave(交叉)

     2 修改IO调度算法

       echo 'deadline' > /sys/block/sdb/queue/scheduler

     3 修改swap占用比

       /etc/sysctl.conf

    4 修改文件缓存参数

       /etc/sysctl.conf

    以上就是我对于linux参数优化的一些建议,对于硬件和raid磁盘组不在讨论范围内

  • 相关阅读:
    C#2.0新特性
    .NET Framework 4.5新特性
    C#4.0 中的新特性
    C#3.0中的新特性
    开始使用Mac OS X——写给Mac新人
    关于WF4 State Machine 状态机工作流的发布问题.
    C# 3.5新特性
    libssh2编译错误(configure error: cannot find OpenSSL or Libgcrypt)解决方法
    程序员转产品经理的思考
    升级PHP版本
  • 原文地址:https://www.cnblogs.com/danhuangpai/p/7526569.html
Copyright © 2011-2022 走看看