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

【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里面,已经可以看出平均负载的具体数值。

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

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

------vmstat(CPU 繁忙程度)

查看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 的调度时间,让效率更高。

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

高并发&性能优化(二)------系统监控工具使用的更多相关文章

  1. 用Netty开发中间件:高并发性能优化

    用Netty开发中间件:高并发性能优化 最近在写一个后台中间件的原型,主要是做消息的分发和透传.因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本.Net ...

  2. 用Netty开发中间件:高并发性能优化(转)

    用Netty开发中间件:高并发性能优化 最近在写一个后台中间件的原型,主要是做消息的分发和透传.因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本.Net ...

  3. GNU Linux高并发性能优化方案

    /*********************************************************** * Author : Samson * Date : 07/14/2015 * ...

  4. SpringCloud高并发性能优化

    1. SpringCloud高并发性能优化 1.1. 前言 当系统的用户量上来,每秒QPS上千后,可能就会导致系统的各种卡顿,超时等情况,这时优化操作不可避免 1.2. 优化步骤 第一步:优化大SQL ...

  5. Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战

    视频课程内容包含: 高级 Java 架构师包含:Spring boot.Spring cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.Zer ...

  6. 高并发&性能优化(一)------总体介绍

    [开篇词] 本文主要通过一些经典的高并发场景,以及一些基本的运维工具来讲述一些关于高并发以及性能优化相关的内容,主要包括性能瓶颈的定位,性能调优的思路和技巧等. [性能的衡量指标] ?什么是性能 性能 ...

  7. EMW 性能优化二之---并发配置

    EMW 性能优化二之---并发配置 在前一个日志中写到交货的异步更新,对于RFUI RF的前台操作会提升效率,异步更新不用等待更新状态的返回,启用更新队列的方式执行(SM13). 下面再补全性能相关的 ...

  8. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

    Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一.写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这 ...

  9. MySQL性能优化(二):优化数据库的设计

    原文:MySQL性能优化(二):优化数据库的设计 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.n ...

随机推荐

  1. Hexo 静态博客指南:建站教程(中)

    本文最初发布于我的个人博客Bambrow's Blog,采用 BY-NC-SA 许可协议,转载请注明出处.若有后续更新,将更新于原博客.欢迎去我的博客阅读更多文章! 本文详细记录一下站点建立过程,以便 ...

  2. Python os.removedirs() 方法

    概述 os.removedirs() 方法用于递归删除目录.像rmdir(), 如果子文件夹成功删除, removedirs()才尝试它们的父文件夹,直到抛出一个error(它基本上被忽略,因为它一般 ...

  3. PHP is_string() 函数

    is_string() 函数用于检测变量是否是字符串. PHP 版本要求: PHP 4, PHP 5, PHP 7高佣联盟 www.cgewang.com 语法 bool is_string ( mi ...

  4. PHP strpbrk() 函数

    实例 在字符串中搜索字符 "oe",并返回字符串中从指定字符第一次出现的位置开始的剩余部分: <?php高佣联盟 www.cgewang.comecho strpbrk(&q ...

  5. C/C++编程笔记:C++入门知识丨运算符重载

    本篇要学习的内容和知识结构概览 运算符重载使用场景 常规赋值操作 我们现在有一个类 想要实现这种赋值操作 具体实现如下: 所以说呢,我们在使用运算符进行运算的时候, 实际上也是通过函数来实现运算的. ...

  6. Spring的事务抽象

    Spring提供了一致的事务管理抽象,该抽象能实现为不同的事务API提供一致的编程模型.无视我们使用jdbc.hibernate.mybatis哪种方式来操作数据,无视事务是jta事务还是jdbc事务 ...

  7. 使用Flask开发简单接口(4)--借助Redis实现token验证

    前言 在之前我们已开发了几个接口,并且可以正常使用,那么今天我们将继续完善一下.我们注意到之前的接口,都是不需要进行任何验证就可以使用的,其实我们可以使用 token ,比如设置在修改或删除用户信息的 ...

  8. RxJS 中的观察者和迭代器模式

    目录 前言 观察者模式 迭代器模式 RxJS 中两种模式的结合和实现 小结 参考 1. 前言 RxJS 是一个库,它通过使用observable(可观察对象)序列来编写异步和基于事件的程序.其结合了观 ...

  9. “随手记”APP与已经发布的记账软件“鲨鱼记账”的差距

    我们使用并观察了“鲨鱼记账”APP,发现,我们的软件真的还有很多不足的地方.就功能这方面来说:“鲨鱼记账”APP有更多的收入.支出分类:就界面来说:“鲨鱼记账”APP有比我们优美太多的页面和背景.但是 ...

  10. 异步文件通道Java NIO你需要了解多少,来看看这篇文章

    在Java 7,AsynchronousFileChannel 被添加到了Java NIO中.使用AsynchronousFileChannel可以实现异步地读取和写入文件数据. 创建一个Asynch ...