zoukankan      html  css  js  c++  java
  • 硬件性能调优

    0 硬件性能对业务的意义

      在硬件层面,主要有cpu、内存、磁盘、网络这几方面。每个方面都可能成为性能瓶颈,从而影响业务的正常运行。

    1 cpu

    1.1 load average

      系统平均负载,在特定时间间隔内运行队列中的平均进程数量。在以下爆表案例中,平均15m有33个进程在队列中,5m有31个,1m有32个,属于持续化的爆表。

      这是一台4core的机器,所以分担到每个core上,有8个进程在运行或排队。这种情况下,大量进程无法获取cpu资源,导致无法获得运行结果。

      业务基本瘫痪。

      一般来说,load average 会在5以下。

    1.2 cpu util(利用率)

      top命令下按‘1’,就会显示每个core的使用情况。需要关注的是us(user time),sy(system time),id(idel time)。

      以下是一台业务健康服务器的cpu利用率状态。

       在1.1的爆表案例中,id为0,在zabbix的cpu util图中会这样,红色是sy,蓝色是us,绿色是id。没有绿色,cpu已爆。

      %cpu一栏表示一个进程占用的cpu百分比,100%表示跑满一个core。就是说4core的机器,理论上最高可达400%。但一般来说,跑到100%已经是问题户了。有两种情况,要么业务真的负载太大,需要架构调整,要么进程出现内部错误,需要重启进程或者调整程序内部错误。

      按P可以按cpu降序排列。

    1.3 进程状态

      在1.1的图中,Tasks一栏显示,一共有201个进程,17个在运行,184个在休眠。

       在以下图中,S一栏表示进程状态,R是running,S是sleeping,一般来说,大部分时间S,小部分时间切换到R。在1.1案例中,R状态是持续性的。下判断,进程内部错误,出现死循环,持续占用cpu不释放,让队列深度飙高。杀进程-->优化程序内部逻辑。

    2 memery

    2.1 系统级内存状态 

      服务器上的内存主要服务于两个方面:支持业务进程的运行,支持系统层面的操作(比如查日志、解包等)。在内存的使用上,如果剩余内存过少,这时有一个比较大的系统操作,或者业务进程并发增多,系统可能会杀进程,所以要预留一部分内存。我定的预留量是800M。

    [root@VM ~]# free -m
                 total       used       free     shared    buffers     cached
    Mem:          7870       7474        395          0         25       2944
    -/+ buffers/cache:       4505       3365
    Swap:            0          0          0
    #total7870M内存,free395M。这是在OS层面的。有(25+2944)M被缓存起来用于了,对程序来说,实际可用的是3365M,这个数是我们需要关注的。
    

      

    2.2 进程级内存状态

    top下按M,进程按RES(内存)排序

    2.3 内存不足系统杀进程

    [root@VM_3_2_centos]# dmesg | tail
    [437421.447859] [25087]     0 25087   141212    25226   0       0             0 xxx
    [437421.447861] [25321]     0 25321    25491      150   0       0             0 YDLive
    [437421.447863] [25343]     0 25343     1016       43   1       0             0 mingetty
    [437421.447865] [25344]     0 25344     1016       44   0       0             0 mingetty
    [437421.447867] [25345]     0 25345     1016       43   0       0             0 mingetty
    [437421.447868] [25346]     0 25346     1016       43   0       0             0 mingetty
    [437421.447870] [25347]     0 25347     1016       44   0       0             0 mingetty
    [437421.447873] [25348]     0 25348     1016       42   0       0             0 mingetty
    [437421.447874] Out of memory: Kill process 4830 (xxx) score 1 or sacrifice child
    [437421.447878] Killed process 4830, UID 0, (xxx) total-vm:952616kB, anon-rss:21920kB, file-rss:1400kB
    #当系统内存不足,会随机杀进程,以保证系统正常运行。
    #在系统信息里可以看到相关杀进程信息。
    

      

    3 disk

      这里我们关注3个指标,iops,就是每秒的磁盘io次数。读写速度,就是每秒io的量。等待和磁盘利用率,说明磁盘负载情况。

    3.1 iops

      iops -x 60 5(显示详细信息,采样周期60s,次数5)

      下图,就是由于定时任务大量压缩日志而导致读io频率特别高的一个场景。db和log服务器这种依赖磁盘的服务,一般在iops上都会容易出现瓶颈。

      可以用iostat命令来查iops。下图就是采样周期为60s的数据采集,第二块磁盘的读iops为36,写io为24。

     3.2 await和%util

    await表示io的等待时间。单位是ms。一般来说,连续30s的显示信息里,平均值不会大于10ms。

    util是磁盘利用率,20%表示有1s内有80%的时间磁盘是空闲的。100%表示磁盘繁忙,满负荷运行。

    如图:服务器上运行redis,由于redis进程会在key change后fork rdb子进程来持久化内存数据,所以写操作会突然出现一个很高的峰值。

    但由于rdb子进程是非连续性的,一般几十秒就操作完毕进程消失了,然后await迅速回落。所以当采样周期为1s,会发现虽然await和util很高。但拉长采样周期,就还好。

    所以这个数据是健康的。

    如图:是一台日志集中存储服务器,await是持续大于100ms,util也是持续100%。这样,io就会阻塞并丢失数据。

    这个数据说明磁盘不行了,要么换ssd,要么使用多节点分散io压力。

    3.3 iotop

      iotop -oP(only show processes or threads actually doing I/O, only show processes, not all threads)

      iotop -p pid(监控一个进程)

      如图:是3.2中运行redis的服务器,磁盘写入会在短时间内飙高,但又很快回落。

    3.4 disk usage

      在3.1的案例中,业务服务器上会产生大量日志,日志信息很庞大。

      如图,在业务高峰期,50GB多到0,只花了3个多小时。然后剩余量为0持续了坑爹的2小时,期间日志写入必然失败。直到日志压缩定时任务启动才开始释放空间。

  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/jabbok/p/9112331.html
Copyright © 2011-2022 走看看