zoukankan      html  css  js  c++  java
  • 服务器优化

    服务器优化

    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都不用经常手动释放内存

  • 相关阅读:
    deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
    deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
    deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
    deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
    deeplearning.ai 改善深层神经网络 week2 优化算法
    deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
    cs231n spring 2017 lecture8 Deep Learning Networks
    cs231n spring 2017 lecture7 Training Neural Networks II
    cs231n spring 2017 lecture6 Training Neural Networks I
    cs231n spring 2017 Python/Numpy基础
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10245575.html
Copyright © 2011-2022 走看看