• 服务器优化


    服务器优化

    cpu,内存,磁盘,网卡

    服务器选型

    --少核高频,向多核低频的发展趋势明显
    --ddr4内存的普及,起始频率妖上更高的台阶
    --ssd硬盘使用越来越多,NVMe蓄势待发
    --万兆更普及,万兆条线重新选型

    DB服务器标准化配置
    2*E5 2690 V3/128 GB

    CPU优化

    cpu架构,物理硬件,在操作系统看来
    cpu生产环境,cpu多进程,多线程,cpu调度器
    #lscpu
    #cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c


    内存优化


    numa(non uniform memory access)
    numa架构内存分配不均
    #numactl --hardware
    free内存有8个G,但节点0只有314M free内存,内存分配非常不平均,当mysql需要大量free内存时,就会出现竞争
    解决free内存不足和numa架构内存分配不均
    1 .保证系统有足够多free内存,这个可以通过设置内存参数
    vm.min_free_kbytes = NNNNN --当系统free内存少于这个时,内核会启动回收内存,进程在分配内存时也会启动回收内存
    vm.extra_free_kbytes = NNNNN --当系统free内存少于这个时,内核会从pagecache回收内存(用户进程不会回收内存)
    --其他
    [root@hongquan1 3306]# cat /proc/sys/vm/panic_on_oom
    0
    vm.panic_on_oom 默认为0开启 为1时表示关闭此功能
    等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程
    当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉
    而且计算分值时主要参照 /proc/<PID>/oom_adj , oom_adj 取值范围从-17到15,当等于-17时表示在任何时候此进程都不会被 oom killer kill掉(适用于mysql)
    /proc/[pid]/oom_adj ,该pid进程被oom killer杀掉的权重,介于 [-17,15]之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。
    /proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算后的结果,是oom_killer的主要参考。
    sysctl 下有2个可配置选项:
    vm.panic_on_oom = 0 #内存不够时内核是否直接panic
      vm.oom_kill_allocating_task = 1 #oom-killer是否选择当前正在申请内存的进程进行kill

    2 在突然大量连接到来之前保留足够free内存
    3. 采用交叉内存分配模式启动mysql或其它需要大内存的系统,保持多个节点之间内存分配平衡numactl --interleave all 《command》
    4. 优化mysql的%buffer%等参数内存分配,避免过大不合理参数
    关闭numa
    grep -i numa /var/log/dmesg #如何判断一个多核机器linux是否为numa结构
    [root@mysql1 soft]# grep -i numa /var/log/dmesg
    [ 0.000000] NUMA: Initialized distance table, cnt=4

    单机单实例,建议关闭numa
    --bios中关闭
    --os内核,启动是设置numa=off
    --mysql启动时候,关闭numa特性 --interleave all
    numactl --interleave=all /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/3306/my.cnf &

    mysql 5.6.27,5.7.9有参数innodb_numa_interleave=OFF/ON
    多实例可以用numa,多实例用偶数,提供内存效率
    内存插法:2/2/1/1,2/2/2/0

    ----http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml
    1、选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑DB这种通常需要高运算量的服务就不要考虑节电了;
    2、关闭C1E和C States等选项,目的也是为了提升CPU效率;
    3、Memory Frequency(内存频率)选择Maximum Performance(最佳性能);
    4、内存设置菜单中,启用Node Interleaving,避免NUMA问题;
    ---

    IO优化


    --磁盘的访问模式
    顺序访问性能较好100M/S,磁盘吞吐率
    随机访问性能较差,iops较低
    io per second
    机械硬盘:100~200
    固态硬盘:50000+
    --磁盘的分类
    SATA II 机械磁盘 7200 RPM IOPS: ~100
    SAS 机械磁盘15K RPM IOPS: ~200
    SSDIOPS: ~50000+
    提升iops性能手段
    RAID技术--功耗高
    购买共享存储设备--价格高
    RAID卡
    1、 查看电量百分比
    # megacli-AdpBbuCmd-GetBbuStatus-aALL|grep"Relative State of Charge"
    2、 查看充电状态
    # megacli-AdpBbuCmd-GetBbuStatus-aALL|grep"Charger Status"
    查看缓存策略
    [root@test_raid~]#megacli-LDGetProp-Cache-LALL-a0
    Adapter0-VD0(targetid:0):CachePolicy:WriteBack,ReadAdaptive,Direct,NoWriteCacheifbadBBU
    SSD选择
    PCIE or SATA
    SATA益于安装与升级
    SATA与PCIE的性能差距逐渐缩小
    PCIE的性能很少有应用可以完全使用
    优先选择SATA接口的SSD
    SSD品牌推荐
    Intel
    Fusion IO
    宝存
    #lspci -nn |grep -i mass
    SSD与数据库优化
    磁盘调度算法设置为:deadline或者noop
    InnoDB存储引擎参数设置
    innodb_flush_neighbors=0
    innodb_log_file_size=4G
    查看ssd
    # cat /sys/block/sda/queue/rotational
    1 --hdd,0--sdd
    # grep ^ /sys/block/*/queue/rotational
    #lsblk -d -o name,rota
    ----
    1、使用SSD或者PCIe SSD设备,至少获得数百倍甚至万倍的IOPS提升;
    2、购置阵列卡同时配备CACHE及BBU模块,可明显提升IOPS(主要是指机械盘,SSD或PCIe SSD除外。同时需要定期检查CACHE及BBU模块的健康状况,确保意外时不至于丢失数据);
    3、有阵列卡时,设置阵列写策略为WB,甚至FORCE WB(若有双电保护,或对数据安全性要求不是特别高的话),严禁使用WT策略。并且闭阵列预读策略,基本上是鸡肋,用处不大;
    4、尽可能选用RAID-10,而非RAID-5;
    5、使用机械盘的话,尽可能选择高转速的,例如选用15KRPM,而不是7.2KRPM的盘,不差几个钱的;
    ----

    网卡优化


    bond网卡
    mode=0(balance-rr)(平衡轮循策略)
    特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,
    直到最后一个传输完毕
    mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)

    [root@mysql1 ~]# ethtool eth0
    确认有无加载bonding模块
    # lsmod | grep 'bonding'
    # modprobe bonding
    # lsmod | grep 'bonding'
    配置bond0

    1.CPU性能调优方法之一:把进程或线程绑定在单个CPU上,这可以增加进程的CPU缓存温度,提高它的内存I/O性能。
    那么如何配置一个进程只跑在单个CPU上?
    # apt-get install schedutils
    # taskset -cp 1,2,3 2345
    # taskset -c 1,2,3 /etc/init.d/mysql start
    --
    使用taskset命令指定某pid使用的cpu
    如ps -ef|grep mysqld 查找出mysql进程的pid
    taskset -p pid 查看当前使用的是哪个cpu
    taskset -pc cpu'num pid 设置该进程使用哪个cpu
    --
    2.描述基于Linux中可用内存即将耗尽内核时为了释放更多内存会采取的步骤。
    # free -m
    #cat /proc/sys/vm/drop_caches
    #sync ##使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件
    #echo 3 > /proc/sys/vm/drop_caches
    ##配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,含义:默认0—不释放,1—释放pagecache,2—释放dentries和inodes,3—释放所有缓存
    释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,
    包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

    3.逻辑I/O和物理I/O有什么区别?
    随机I/O和连续I/O有什么区别?
    物理io是从读取文件,disk device,io channel,device driver
    逻辑io是从读取内存,vol mgnt,buffer cache,file system
    逻辑IO是操作系统发起的IO,这个数据可能会放在磁盘上,也可能会放在内存(文件系统的Cache)里。
    物理IO是设备驱动发起的IO,这个数据最终会落在磁盘上。
    逻辑IO和物理IO不是一一对应的。

    随机io就是随机读取磁盘
    顺序io就是顺序的读取磁盘
    在随机 I/O 环境中(如用于数据库和通用文件服务器的环境),所有的磁盘都应花费相同的时间为 I/O 请求提供服务
    例如,假设有 40 GB 存储用于数据库应用程序。如果跨四个 10 GB 的磁盘轴进行条带化,并且 I/O 是随机且均匀地分
    散于卷中,则每个磁盘的繁忙程度一样,一般情况下会提高性能
    磁盘上最大随机 I/O 性能的目标是 35% 或更低的使用率(由 iostat 命令报告)。通常,磁盘使用率超过 65% 就会
    出现问题。磁盘使用率超过 90% 就会出现严重问题。解决磁盘使用率值太高的办法就是创建包含更多磁盘(轴)的新 RAID-0 卷。

    可以在顺序 I/O 环境(如整表扫描占支配地位的 DBMS 服务器,以及数据非常密集的环境中的 NFS 服务器)中优化配
    置的性能。要充分利用顺序 I/O 环境,请相对于一般 I/O 请求的大小将交错值设置为较小的值。

    在顺序 I/O 环境中,查找时间和旋转时间实际上都为零。优化顺序 I/O 时,磁盘的内部传输率最为重要


    4.描述一个网络接口工作超负荷会发生什么,包括对应用程序性能的影响。
    网络接口超负荷,影响网络传输,程序响应缓慢,可能会超时等。


    [root@fcbu.com ~]# free -m
    total used free shared buffers cached
    Mem: 7979 7897 82 0 30 3918
    -/ buffers/cache: 3948 4031
    Swap: 4996 438 4558

    第一行用全局角度描述系统使用的内存状况:
    total 内存总数
    used 已经使用的内存数,一般情况这个值会比较大,因为这个值包括了cache 应用程序使用的内存
    free 空闲的内存数
    shared 多个进程共享的内存总额
    buffers 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
    cached 缓存,用于已打开的文件

    第二行描述应用程序的内存使用:
    -buffers/cache 的内存数:used - buffers - cached
    buffers/cache 的内存数:free buffers cached
    前个值表示-buffers/cache 应用程序使用的内存大小,used减去缓存值
    后个值表示 buffers/cache 所有可供应用程序使用的内存大小,free加上缓存值

    第三行表示swap的使用:
    used 已使用
    free 未使用

    可用的内存=free memory buffers cached。

    为什么free这么小,是否关闭应用后内存没有释放?
    但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的
    第二行最后一个值:-/ buffers/cache: 3948 4031 ,这才是系统可用的内存大小。

    实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断
    的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffer或cache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。

    一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、
    应用获取不到可用内存、OOM错 误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应
    用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可 能只是把问题给暂时屏蔽了,所以说一般情况下linux都不用经常手动释放内存

  • 相关阅读:
    Ubuntu的防火墙UFW
    使用Xshell连接Ubuntu
    Markdown 11种基本语法
    Git Push 避免用户名和密码方法
    "git rm" 和 "rm" 的区别
    无限级分类实现思路
    1. Git 克隆代码
    Git 笔记
    git 远程分支创建与推送
    ci 笔记
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10245575.html
Copyright © 2020-2023  润新知