zoukankan      html  css  js  c++  java
  • 系统性能调优

    系统响应时间、系统吞吐量、系统并发量

    cpu、内存、IO

    cpu调优:

    linux:性能分析工具

    命令: top vmstat pidstat

    top(默认每3s刷新一次):显示系统整体的cpu和内存使用情况,以及各个进程的资源使用情况

    stat系列(vmstat、iostat、netstat、pidstat、mpstat)

    profile工具:定位代码片段(perf、ps)

    pstree:用树状形式显示所有进程间的关系

    stress 压力测试工具,模拟压力测试场景

    执行top命令获得过去1min、5min、15min的平均负载(Load Average)

    平均负载就是平均活跃进程数(理想的平均负载就是等于cpu的个数,但是在生产环境中高于CPU数量70%就要进行排查负载高的问题)

    top 命令可以动态地持续监听进程地运行状态 

    top -H  查看线程信息

    top -Hp 进程的pid  查看进程下面有多少线程

    top 查看进程信息

    使用ps命令,具体用法是 ps -xH

    这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。

    使用ps命令,具体用法是 ps -mq PID

    这样可以看到指定的进程产生的线程数目。

    top下各个参数含义:

    • 第一行为任务队列信息,具体内容如表 1 所示。

      表 1 任务队列信息
      内 容说 明
      12:26:46 系统当前时间
      up 1 day, 13:32 系统的运行时间.本机己经运行 1 天 13 小时 32 分钟
      2 users 当前登录了两个用户
      load average: 0.00,0.00,0.00 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)
    • 第二行为进程信息,具体内容如表 2 所示。

      表 2 进程信息
      内 容说 明
      Tasks: 95 total 系统中的进程总数
      1 running 正在运行的进程数
      94 sleeping 睡眠的进程数
      0 stopped 正在停止的进程数
      0 zombie 僵尸进程数。如果不是 0,则需要手工检查僵尸进程
    • 第三行为 CPU 信息,具体内容如表 3 所示。

      表 3 CPU信息
      内 容说 明
      Cpu(s): 0.1 %us 用户模式占用的 CPU 百分比
      0.1%sy 系统模式占用的 CPU 百分比
      0.0%ni 改变过优先级的用户进程占用的 CPU 百分比
      99.7%id 空闲 CPU 占用的 CPU 百分比
      0.1%wa 等待输入/输出的进程占用的 CPU 百分比
      0.0%hi 硬中断请求服务占用的 CPU 百分比
      0.1%si 软中断请求服务占用的 CPU 百分比
      0.0%st st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比
    • 第四行为物理内存信息,具体内容如表 4 所示。

      表 4 物理内存信息
      内 容说 明
      Mem: 625344k total 物理内存的总量,单位为KB
      571504k used 己经使用的物理内存数量
      53840k&ee 空闲的物理内存数量。我们使用的是虚拟机,共分配了 628MB内存,所以只有53MB的空闲内存
      65800k buffers 作为缓冲的内存数量
    • 第五行为交换分区(swap)信息,如表 5 所示。

      表 5 交换分区信息
      内 容说 明
      Swap: 524280k total 交换分区(虚拟内存)的总大小
      Ok used 已经使用的交换分区的大小
      524280k free 空闲交换分区的大小
      409280k cached 作为缓存的交换分区的大小


    我们通过 top 命令的第一部分就可以判断服务器的健康状态。如果 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。

    这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存),或者建立集群服务器。

    我们还要解释一下缓冲(buffer)和缓存(cache)的区别:

    • 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
    • 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

    简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。

    再来看 top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

      • PID:进程的 ID。
      • USER:该进程所属的用户。
      • PR:优先级,数值越小优先级越高。
      • NI:优先级,数值越小、优先级越高。
      • VIRT:该进程使用的虚拟内存的大小,单位为 KB。
      • RES:该进程使用的物理内存的大小,单位为 KB。
      • SHR:共享内存大小,单位为 KB。
      • S:进程状态。
      • %CPU:该进程占用 CPU 的百分比(所有逻辑cpu占比之和)。
      • %MEM:该进程占用内存的百分比。
      • TIME+:该进程共占用的 CPU 时间。
      • COMMAND:进程的命令名。

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l

    top 后按1 查看每个逻辑cpu的运行状况

    top 后按c  查看每个进程的详细信息

    用户(%user)、Nice(%nice)、系统(%system)、等待IO(%iowait)、中断(%irq)、软中断(%softirq)、

    用户cpu和nice cpu比较高:说明用户态进程占用了较多的cpu,应该着重排查进程的性能问题

    系统cpu较高,说明内核态占用了较多cpu,应该着重排查内核线程和系统调用的性能问题

    软中断和硬中断比较高,说明软中断和硬中断的处理程序占用了较多的cpu,应该着重排查内核中的中断服务程序

    系统变慢的原因:cpu上下文切换过多、某个进行占用的cpu资源高、某个线程io读取缓慢

    cpu上下文切换数一般正常在几百到一万

    自愿上下文切换变多,说明进程都在等待资源,有可能IO产生了问题

    非资源上下文切换变多,说明进程在被强制调度,都在争抢cpu,cpu性能成了瓶颈

    进程的pid在不断变化,说明进程在不停的重启(可能是短时进程,也可能是进程启动出错后被重启启动)

    内存调优:

    vmstat:主要用来分析系统的内存使用情况

    一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

    root@ubuntu:~# vmstat 2 1
    procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
    r b swpd free buff cache si so bi bo in cs us sy id wa
    1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0

    2表示每个两秒采集一次服务器状态,1表示只采集一次。

    实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:

    复制代码
    root@ubuntu:~# vmstat 2  
    procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
    r b swpd free buff cache si so bi bo in cs us sy id wa
    1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
    0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
    0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
    0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
    1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
    复制代码

    这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。

    好了,命令介绍完毕,现在开始实战讲解每个参数的意思。

    r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

    b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

    swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

    free   空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

    buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

    cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

    si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

    so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

    bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

    bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

    in 每秒CPU的中断次数,包括时间中断

    cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

    us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

    sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

    id  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

    wt 等待IO CPU时间。

    pidstat -w 5 查看每个进程的cpu上下文切换次数

    cswch: 每秒自愿上下文切换的次数

    nvcswch:每秒非自愿上下文切换次数

    IO调优:

    dstat

    sar

  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/pass-ion/p/15226660.html
Copyright © 2011-2022 走看看