首页 > 如何判断CPU、内存、磁盘的性能瓶颈?

如何判断CPU、内存、磁盘的性能瓶颈?

1.如何判断CPU、内存、磁盘的瓶颈?

CPU瓶颈

 

1) 查看CPU利用率。建议CPU指标如下

  a) User Time:65%~70%

  b) System Time:30%~35%

  c) Idle:0%~5%

  如果us,sy高于这个指标可以判断CPU有瓶颈

  使用top查看

  查看运行队列

  每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长。“load”用来表示运行队列,用top 命令我们可以看到CPU一分钟,5分钟和15分钟内的运行队列的大小。这个值越大表明系统负荷越大。用uptime得到的3个负载值除以逻辑CPU数,如果3个结果值均>1,则表示CPU过载。

  使用top或者uptime查看

  查看上下文切换

  每个CPU(或多核CPU中每个核心)在同一时间只能执行一个线程,Linux采用抢占式调度。即为每个线程分配一定的执行时间,当到达执行时间,线程中有IO阻塞或高优先级线程要执行时,Linux将切换执行的线程,在切换时要存储目前线程的执行状态,并恢复要执行的线程状态,这个过程称之为上下文切换。对于java应用,典型的是在进行文件IO操作,网络IO操作,锁等待或线程sleep时,当前线程会进入阻塞或者休眠状态,从而触发上下文切换,上下文切换过多会造成内核占用过多的CPU使用,使得应用的响应速度下降。

  使用vmstat查看cs

 

结论

检查system的运行队列,以及确定不要超出每个处理器3个可运行状态线程的限制.

  确定CPU 利用率中user/system比例维持在70/30

  当CPU 开销更多的时间在system mode,那就说明已经超负荷并且应该尝试重新调度优先级

  当I/O 处理得到增长,CPU 范畴的应用处理将受到影响

  ps:对于JAVA应用,CPU瓶颈可以通过jprofiler监控分析

内存瓶颈

  1.查看利用率(free)

  used:已使用多大。

  free:可用有多少。

  Shared:多个进程共享的内存总额。

  Buffers/cached:磁盘缓存的大小。

  2.查看页交换,swap交换(po,pi,so,si),磁盘IO(vmstat)

  si: 每秒从交换区写到内存的大小

  so: 每秒写入交换区的内存大小

  page in :分页(Page)从磁盘重新回到内存的过程被称作Page-In

  page out : 分页(Page)写入磁盘的过程被称作Page-Out

  另外在进行页交换的时候,会产生磁盘IO,还需注意bi,bo

  Bo 磁盘块页面从内存到文件或交换设备的总额

  Bi 磁盘块页面从文件或交换设备到内存的总额

  3.page fault(pidstat -r,sar -B )

  minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数

  majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生

  其中sar -B中fault/s表示每秒钟minflt,majflt的和。

 

结论

  监控虚拟内存性能由以下几个部分组成:

  1.当系统中出现较少的页错误,获得最好的响应时间,是因为memory caches(译注:内存高速缓存)比disk caches更快(译注:磁盘高速缓存).

  2.较少的空闲内存,是件好事情,那意味着缓存的使用更有效率.除非在不断的写入swap device和disk.

  3.如果系统不断报告,swap device总是繁忙中,那就意味着内存已经不足,需要升级了.

  zee:

  如果用做缓冲区(buff)和快速缓存(Cache)的物理内存不断地增加,而空闲的物理内存(free)不断地减少,证明系统中运行的进程正在不断地消耗物理内存。

  已经使用的虚拟内存(swpd)不断增加,而且存在着大量的页面交换(si和so),证明物理内存已经不能满足系统需求,系统必须把物理内存的页面交换到磁盘中去。

  由此可以得到这样的结论:该主机上的物理内存已经不能满足系统运行的需要,内存已成为该系统性能的一个瓶颈。

  ps:对于java程序,内存瓶颈可以通过heap dump后使用mat分析

 

磁盘瓶颈

  iostat查看IO信息。如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

  另外还需要注意iowait这个值,iowait 值高就意味着磁盘缓慢或负载过大。还有不要信任svctm这个字段。

  监控swap 和系统分区,要确保virtual memory不是文件系统I/O 的瓶颈.

  ps:磁盘瓶颈可以通过pidstat -d 定位程序

 

2.如何理解CPU、内存、磁盘的关系?

  这些子系统之间关系是彼此联系,相互彼此依赖的

  1.对于进程来说,数据是存放在内存中的,进程的运行需要使用CPU,进程读写数据需要跟磁盘打交道。

  2.当内存不足时需要跟磁盘进行页(page)交换,swap交换,从而产生磁盘IO。po,so释放物理内存,pi,si增加物理内存使用。交换分页的过程需要占用cpu时间。 (内存占用过高)

  3.当磁盘IO负载过高时,需要监控swap和系统分区,要确保virtual memory不是文件系统I/O 的瓶颈。磁盘的相当慢的,当iowait 增长,表示CPU花费大量的时间在等待磁盘IO,此时CPU Bound的应用处理将受到影响(磁盘IO过高)

  3.如何理解paging in / paging out ?

  在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。

  分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。

  当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。

  可以通过vmstat -s 查看 paged in/out 数量

  4.如何监控操作系统的资源?

  CPU监控:top(利用率), uptime(运行队列数), vmstat(上下文切换数), jprofile(方法占用cpu时间百分比)

  内存监控:top, free(利用率), vmstat(page和swap交换), pidstat -r和sar -B(page fault), jmap -heap(堆dump), mat和jprofiler(查看对象)

  磁盘监控:iostat(%util), top(iowait%), pidstat -d

  网络监控:netstat(连接数), nethogs(流量), wireshark和tcpdump(抓包)

  JVM监控:jstat(gc), jmap(堆dump), jstack(线程dump), jprofiler和visualvm(剖析工具)

  nmon(长时间全局收集数据)

  5.如何理解上下文切换(context switch)?

  每个CPU(或多核CPU中每个核心)在同一时间只能执行一个线程,Linux采用抢占式调度。即为每个线程分配一定的执行时间,当到达执行时间,线程中有IO阻塞或高优先级线程要执行时,Linux将切换执行的线程,在切换时要存储目前线程的执行状态,并恢复要执行的线程状态,这个过程称之为上下文切换。对于java应用,典型的是在进行文件IO操作,网络IO操作,锁等待或线程sleep时,当前线程会进入阻塞或者休眠状态,从而触发上下文切换,上下文切换过多会造成内核占用过多的CPU使用,使得应用的响应速度下降。

  vmstat其中cs那一列

  7.如何理解磁盘IO?

  磁盘IO速度是非常慢的,linux内核就是要尽量降低IO

  内存不足时会进行页交换,产生磁盘IO

  CPU Bound类型应用,当磁盘IO过多,iowait过大时会影响性能。

 

参考资料:https://blog.csdn.net/xihuanyuye/article/details/81740183

转载于:https://www.cnblogs.com/wx170119/p/11579234.html

更多相关:

  • 更多内容,欢迎关注微信公众号:全菜工程师小辉~前言在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理。这篇博客将针对第三个原因,进行更详细的讲解。首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。零拷贝零拷贝是指避免在用户态(User-space)...

  • 一、预备知识—程序的内存分配  一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器...

  • 我的爱机是一台ThinkPad T420,原装三星DDR 1333 4G内存一根,还剩一根内存位置,最近趁京东6.18促销,准备增加一根物理内存。为了确保兼容性,觉得仍然选购DDR 1333 4G内存,于是购买了金士顿这款,比如DDR3 1600的还贵。 这个安装过程完全参照该内存的网页提示进行 这里简单记录一下,以备...

  • 陪伴我多年的老本ThinkPad T420渐渐垂垂老矣, 我想更新一下可以更新的部分, 比如将2.5寸HDD更换为SSD, 将单条4G内存再增加一根, 凡此种种想法, 可能最后归结为如何获取该笔记本的硬件配置信息, 在windows下面使用鲁大师之类的检测软件, 也许很好搞定,但是在Ubuntu 14.04平台上如果办到呢? 很简单...

  • 一.内存错误出现的场景 这几天在重构ATS插件代码的过程中遇到了烦人的内存泄露问题, 周五周六连续两天通过走查代码的方法,未能看出明显的导致内存错误的代码, 同时也觉得C和C++混合编程得到一个动态库, 在一个.cpp主文件中,即用new又用malloc来动态分配内存, 可能会导致内存错误.后来网上调研和查资料发现, new和mal...

  • 下面的译文来自ATS官方交流博客中豪哥的一篇英文介绍,碰巧工作中又要用到,为了大家阅读方便,我特此翻译如下,不妥之处请指正: 说明: 慢速磁盘指普通的3.5寸硬盘,快速磁盘指ssd 缓存中间层 当我们考虑ATS的存储时,最原始的设计是支持具有相同容量的多块磁盘,(最适合没有做raid的块设备),由此构建分区,将每个分区...

  • 今天给主机加了一个希捷3TB硬盘,格式化是个头疼的问题,经过网上调研后,发现目前该问题已经被成功解决,现在使用希捷提供的DiscWizard可以成功解决。 下面记录一下我使用DiscWizard格式化2TB以上硬盘的基本过程。 1.首先从希捷官网下载并安装DiscWizard软件。 2.将3TB硬盘安装到主机上,并开启操作系统。...

  • df命令可以查看当前系统磁盘空间的使用情况 命令:df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够,需清理磁盘 磁盘速度测试,如果磁盘性能不好,性能测试数据会不准确(读写速度) 命令:dd if=/dev/zero of=/export/ddtest bs=8k count=1000000 oflag=dir...

  • 1. 磁盘的数据结构包括哪些内容?   答:分区,卷,磁盘分区,主分区,扩展分区,逻辑分区,逻辑驱动器,引导分区。 2. 什么是基本磁盘和动态磁盘?    (1) 基本磁盘和旧版本Windows操作系统中使用了相同的磁盘结构。    (2)动态磁盘功能最初发布于Windows2000,用于增强磁盘支持,在磁盘配置变动后需要重启动的次数...

  • 我们在重装好系统Win7系统后有时会碰到需要新建磁盘分区的情况,这时我们再重装系统进行磁盘分区就有些过于麻烦了,其实我们可以利用Win7系统自身的磁盘管理功能来新建一个磁盘分区。下面好系统重装助手就来介绍一下好系统Win7系统电脑磁盘新建分区的方法。 好系统Win7系统电脑磁盘新建分区的方法 1、右键点击我的电脑,选择管理,在计算机管...

  • linux 提供CPU调度函数,可以将CPU某一个核和指定的线程绑定到一块运行。 这样能够充分利用CPU,且减少了不同CPU核之间的切换,尤其是在IO密集型压力之下能够提供较为友好的性能。 通过sched_setaffinity 设置 CPU 亲和力的掩码,从而将该线程或者进程和指定的CPU绑定 一个CPU的亲合力掩码用一个cpu...

  • CPU 原始文件路径mind-Mapping CPU上下文切换 CPU使用率...

  • 让CPU占用率曲线听你指挥  问题  写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:  1. CPU的占用率固定在50%,为一条直线;  2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100); ...

  •   虽然驱动版的出来到现在也有好多年了,不过一直不打算发布。原因还是当初那个:CPU没有达到1%以下。       前些时候无意中在MSDN看到NDIS里数据包分配的文档,感觉之前犯了个大错误:数据包资源每次都是按申请/发送/释放的流程。文档中提到数据包资源的重用而不必申请释放,可以减少开销。原以为找到了问题的关键,可以实现当初的愿望...