zoukankan      html  css  js  c++  java
  • 高并发&性能优化(二)------系统监控工具使用

    上一篇主要从总体介绍了高并发&性能优化的相关思路和方法,本篇主要介绍系统监控工具。

       

    CPU查看工具】

    ------top命令(性能)

    进入top命令后,按1即可看到每核CPU的运行指标与详细指标:

    咱们依次说明下红框里面的参数:

    Load Average

    一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟

    us

    用户态所占用的 CPU 百分比,即引用程序所耗费的 CPU

    sy

    内核态所占用的 CPU 百分比,可配合 vmstat 命令,查看上下文切换是否频繁

    ni

    高优先级应用所占用的 CPU 百分比

    id

    空闲 CPU 百分比

    wa

    等待 I/O 设备所占用的 CPU 百分比,经常使用它来判断 I/O 问题,过高输入输出设备可能存在非常明显的瓶颈

    hi

    硬中断所占用的 CPU 百分比

    si

    软中断所占用的 CPU 百分比

    st

    虚拟机等待宿主机 CPU 的时间占比,在一些超售的云服务器上,经常发生

       

    ?硬中断&软中断

    硬中断是由与系统相连的外设(网卡,硬盘等)产生的,如当网卡收到一个数据包。

    软中断是正在运行的应用产生的,通常指的是一些对于I/O的操作,软中断可放到中断之后执行。

       

    一般情况下,我们会比较关心id(空闲 CPU 百分比),可以从整体上大致看出CPU真实利用率

       

    ------uptime(负载)

    其实,在top里面,已经可以看出平均负载的具体数值。

    但是我们也有另外一种方式,分别显示最近 1min5min15min 的数值:

       

    一般负载达到1*CPU核数,我们可以认为系统负载达到了极限。

       

    ------vmstatCPU 繁忙程度)

    查看CPU的繁忙程度,可以通过vmstat查看:

    图中红框需要特别关注一下:

    r

    运行队列

    正在运行的队列长度,一般体现任务总量

    b

    阻塞队列

    等待资源的任务队列,如果系统负载有问题,可以专注一下b列(Uninterruptible Sleep),指的是等待I/O,可能读写盘操作比较多。

    cs

    每秒钟上下文切换(Context Switch

    如果上下文切换过于频繁,就需要考虑是否是进程或者线程数开的过多

    si/so

      

    显示了交换分区的一些使用情况,交换分区对性能的影响比较大,需要格外关注

       

    如果我们想进一步查看固定进程的上下文切换数量,可以通过以下命令查看:

       

    【内存查看工具】

    首先,我们从操作系统层面看一下内存的基本结构:

    先简单解释下上面几个名词:

    ------逻辑内存

    当我们写了一个程序,然后去查看它的底层汇编实现的时候,看到的内存地址,其实不是真正的物理内存地址,叫逻辑内存,逻辑内存是通过MMU映射到真实的物理内存地址上的。

       

    ------MMU

    内存管理单元

    虚拟地址和物理地址的映射关系存储在页表中,页表是分级的64位系统一般都是3~5级。

    在硬件上会有一个叫做页表基地址寄存器,它存储PGD页表的首地址

    MMU就是根据页表基地址寄存器从PGD页表一路查到PTE,最终找到物理地址(PTE页表中存储物理地址)

       

    ------TLB

    translation lookaside buffer地址转换后援缓冲器(快表)

    TLB其实就是一块高速缓存,缓存虚拟地址和其映射的物理地址,避免了每次都需要一级一级查找页表获取物理地址。

       

    ------虚拟内存

    逻辑地址可以映射到两个内存段上:物理内存和虚拟内存

    虚拟内存就是物理内存不够用的时候把一些很少访问的内存数据转存到硬盘上,然后把这部分内存腾出来分配给其它应用。

       

    ------top

    了解了基本概念之后,我们再来了解一下top在内存查看中的应用:

    红框中的三个参数是内存相关的:

    VIRT

    虚拟内存,一般比较大

    RES

    代表了进程实际占用的内存,平常在做监控时,主要监控的也是这个数值;
    需要着重注意。

    SHR

    共享内存,一块内存空间可以被多个应用查看,里面是一些可以复用的内容。

       

    I/O

    I/O 设备可能是计算机里速度最慢的组件了,它指的不仅仅是硬盘,还包括外围的所有设备。

    I/O设备和内存之间的速度差是非常大的,如何去缓解这个问题呢?

    缓冲!缓冲区是现在解决速度差的唯一方法,不论是cpu->内存,还是内存->硬盘。

       

    首先,我们回顾一下之前说过的"top"和"vmstat",里面有一个参数,叫"wa",它是最能体现I/O的繁忙程度了。如果你的应用有大量写入文件的操作(比如日志),I/O wait就可能会非常高。

       

    ------iostat

    当然,查看I/O也有一个很好的工具,就是iostat,可以通过sysstat安装。

    我们来大概了解一下主要参数:

    %util

    通常情况下,要先check这个数值;
    这个数字超过 80%,就证明 I/O 的负荷已经非常严重了

    Device

    会列举你所有的硬盘

    avgqu-sz

    平均请求队列的长度

    await

    响应时间包含了队列时间和服务时间,它有一个经验值。
    通常情况下应该是小于 5ms 的,如果这个值超过了 10ms,则证明等待的时间过长了。

    svctm

    表示操作 I/O 的平均服务时间
    svctm
    await 是强相关的,如果它们比较接近,则表示 I/O 几乎没有等待,设备的性能很好;
    但如果 await svctm 的值高出很多,则证明 I/O 的队列等待时间太长,进而系统上运行的应用程序将变慢。

       

    ------零拷贝

    说到I/O了,我们再衍生一下,讲一个通常的优化手段。

       

    比如,我们在java里面进行一个简单的文件拷贝,在内核的支持下,零拷贝少了一个步骤,那就是内核缓存向用户空间的拷贝,这样既节省了内存,也节省了 CPU 的调度时间,让效率更高。

       

    本篇先到这里,下一篇,咱们介绍性能测试工具。

  • 相关阅读:
    获取MAC地址的几种方式
    从0到100——知乎架构变迁史
    CSS3必须要知道的10个顶级命令
    leetcode: 3Sum Closest
    leetcode: 3Sum
    leetcode: Longest Common Prefix
    leetcode: Roman to Integer
    leetcode: Integer to Roman
    leetcode: Container With Most Water
    leetcode: Regular Expression Matching
  • 原文地址:https://www.cnblogs.com/liufarui/p/13559821.html
Copyright © 2011-2022 走看看