• 系统性能调优


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

    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

  • 相关阅读:
    二值形态学——开、闭运算
    二值形态学——腐蚀与膨胀 及 C语言代码实现
    数学形态学处理-基本符号和术语
    【OpenCV】图像增强---灰度变换、直方图均衡化
    【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】
    【OpenCV】三种方式操作图像像素
    【OpenCV】透视变换矫正
    数字图像处理基础
    Voronoi图及matlab实现
    粒子群优化算法PSO及matlab实现
  • 原文地址:https://www.cnblogs.com/pass-ion/p/15226660.html
Copyright © 2020-2023  润新知