`

系统性能瓶颈定位浅谈

 
阅读更多

前两天看到一个关于系统性能优化的一个帖子,感觉说的比较在理,结合自己的经历和一些资料,总结了一下,记录在此。

系统的性能优化可以说是一个比较大的开放性话题,可以说的有很多。本文就试着介绍下性能瓶颈的定位的一些工具,这些工具一般都是linux安装基本就有的,而且不需要root权限的(主要是考虑到可以让大多数人都可以使用)。

一、关于系统性能的两个基本概念

系统的性能问题,有两个比较重要的指标,

1.系统吞吐量,每秒能够处理多少的访问。这就好比去餐厅吃饭时,餐厅的容量,即:餐厅可以同时服务多人就餐。

2.响应的延迟,单个请求从发起到得到响应结果的时间。如果也拿我们就餐想对比的话,就相当于我们开始离开位置到最后吃完饭回来的时间。

很显然,这两个数据不是孤立,是有关联的。当餐厅的供餐速度越快,那么单位时间内就可以有更多的人可以完成就餐。也就是说如果访问的延迟越小,那么系统的吞吐量就会越大。当然如果单位时间内到达餐厅的人多到一定的量,就会出现排队等待的情况,这样每个人就餐所花费的时间就可能增加。也就是说系统的吞吐量越大,访问的延迟就会大。

 

二、定位性能瓶颈

一般情况下,一个系统的响应延迟是有一个规定,比如说必须小于10ms,当然这个值根据不同的业务场景是有不同的要求的。当然正常情况下系统的响应延迟的要求是跟系统的吞吐量关联在一起的,比如说一个系统要求在500w/s的并发吞吐量的情况下,要求延迟必须小宇20ms.

 

当发现我们的系统不能够达到系统的性能要求的时候,从什么地方开始分析那?

直接去分析应用系统的代码查找问题有可能是徒劳的,因为有可能就是你的系统硬件资源不够了。所以先应该分析操作系统的性能报告;查看操作系统的CPU利用率,内存利用率,操作系统的IO,网络IO,网络连接数等信息。

 

1.查看CPU的利用率。如果CPU的利用率不高,但是系统的性能出现了瓶颈,这就可能是因为IO的问题了。因为系统的CPU利用率不高,说明系统不是在忙着进行计算,而是在忙着做其他的事情,比如IO。对于的服务器还需有特别注意下调度CPU的CPU利用率,如果这个CPU核负载过高,就会影响整个CPU的负载。

系统的cpu利用率信息可以通过vmstat命令来查看,该命令一般的linux操作系统都有而且不需要root权限。

该命令详细用法可以参考 vmstat详解

查看当前系统的整体状态,从procs下的r这一列可以看到当前处于running等待cpu时间片的进程有2个,从cpu下的us列可以看到用户进程占用cpu资源99%左右。如果处于r列状态的cpu长期大于1表明cpu资源不足。

 

(这里第一行系统自开机以来的平均值)

接下来我们可以看一下,系统当前占用cpu这么多的进程是哪一个。通过ps命令倒排序cpu占用率,发现占用资源最多的是进程5207的两个线程5225和5209,占用资源分别是98.7%和93.0%(本机是双核的,表明这两个进程是处于不同处理器上的,通过进一步使用ps aux <ppid>可以进一步查看到着两个进程的父进程是eclipse)



 CalTest的代码

 

public class CalTest {
	public static void main(String...args) throws InterruptedException{
		Cal c = new Cal();
		c.start();
		long b;
		for(int i = 0;true;i++){
			b = (123456*123456)<<3;
			if(i==10000){
				i = 0;
				//Thread.sleep(1000);
			}
		}
	}
	static class Cal extends Thread{
		private String THREAD_NAME="calculator-subthread-test";
		public Cal(){
			super();
			this.setName("");
		}
		public void run(){
			long b;
			for(int i = 0;true;i++){
				b = (123456*123456)<<3;
				if(i==10000){
					i = 0;
					try {
						//Thread.sleep(100000);
					} catch (Exception e) {
						//
					}
				}
			}
		}
	}
}
 

 

2.查看IO的利用率。一般情况下IO的利用率需要查看三个数据,一个是磁盘IO,一个是内存的swap数据,一个是网络IO。


2.1先看内存数据,其实操作系统一般会尽可能多的利用内存,所以内存的使用一般都是90%以上的。关键是看swap的数据,swap数据中swpd也许会很大,但是只有si+so的值在可以接受的范围内既可以。如下图,尽管交换到磁盘的部分swpd很大,当时swap部分中si+so在大多数时间下都是0,所以内存并没有什么问题。


 2.2再看磁盘IO数据。对于IO这块的数据只要磁盘bi+bo不是太大(一般不会大于3000,不同机器硬件标准不同),而且cpu等待IO的时间占比wa不超过30%都是可以接受。

上图中间部分开始往下的这一部分的磁盘IO是非常大的每秒中读入(bi)的块在2000左右,cpu这边的wa列,占比平均在25%左右,显然这个是没有什么问题。(实际上这就是本人笔记本正常情况下打开eclipse的瞬间IO报告的抓图)


除了查看进程相关的磁盘IO情况,还可有查看整个机器的磁盘IO中给类读写操作类型的数量。

 

 

2.3.查看网络IO的报告。其实用netstat和sar更好,只是他们一般需要root权限,此处就先不说了。下边用ip命令进行查询

主要看2: eth0: 这一部分,分为RX和TX两块,分别表示通信接收和发送包的数量。正常情况下他们的error应该是0,这个一般没有问题的。但是要关注下overrun,如果overrun>0就意味着可能消息有些过多了,发送或接受小心的buffer不够用了。

下图是使用ip命令获取的截图。

4.如果前边这些项的负载都不高,就基本可以认为是系统程序的问题了(当然系统程序问题也有可能引起CPU和IO负载过高),就需要具体的工具来分析应用系统了。现在分析java应用有很多开源的profile工具可用,本次不再介绍。

===================================命令介绍================================================

1.vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat的语法:

  vmstat [-V] [-n] [delay [count]]

其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。常用的输出字段含义:

·process(procs)

r:等待运行时间的进程数量
b:处在不可中断睡眠状态的进程
w:被交换出去但是仍然可以运行的进程,这个值是计算出来的
·memoryswpd:虚拟内存的数量
free:空闲内存的数量
buff:用做缓冲区的内存数量
·swap
si:从硬盘交换来的数量
so:交换到硬盘去的数量
·IO
bi:向一个块设备输出的块数量
bo:从一个块设备接受的块数量
·system
in:每秒发生的中断数量, 包括时钟
cs:每秒发生的context switches的数量
·cpu(整个cpu运行时间的百分比)
us:非内核代码运行的时间(用户时间,包括nice时间)
sy:内核代码运行的时间(系统时间)
id:空闲时间,在Linux 2.5.41之前的内核版本中,这个值包括I/O等待时间;
wa:等待I/O操作的时间,在Linux 2.5.41之前的内核版本中这个值为0

2.常用的操作系统进程资源占用监控命令

 

   (1)显示10个消耗cpu最多的进程

   ps aux |head -1 ;ps aux |sort -rn +2 |head -10

  (2)显示10个消耗内存最多的进程

   ps vx |head -1 ;ps vx |grep -v PID |sort -rn +6 -7 |head -10

  (3)显示10个换页最多的进程

   ps vx |head -1 ;ps vx |grep -v PID |sort -rn +4 -5|head -10

  (4)显示10个消耗存储空间最多的进程

   ps aux |head -1 ;ps aux |sort -rn +3 -4 |head -10

(5) 按照占用cpu资源倒排序所有线程信息

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=-%cpu

(6) 按照占用mem资源倒排序所有线程信息

ps H -eo user,pid,ppid,tid,time,%mem,cmd --sort=-%mem

 

 

  • 大小: 23 KB
  • 大小: 71 KB
  • 大小: 42.8 KB
  • 大小: 114.5 KB
  • 大小: 78.7 KB
  • 大小: 112.8 KB
分享到:
评论

相关推荐

    浅谈Oracle数据库性能的优化

    ### 浅谈Oracle数据库性能的优化 #### 一、引言 随着信息技术的快速发展和企业对数据处理需求的增加,数据库作为数据管理的核心组件,在企业的信息化建设中扮演着至关重要的角色。Oracle数据库作为全球最广泛使用...

    linux性能调优一些整合文档打包

    这些工具可以帮助我们实时查看CPU、内存、磁盘I/O和网络资源的使用情况,为性能瓶颈的定位提供依据。 2. **CPU调优**: CPU调优主要包括进程调度策略调整(如nice值和renice命令)、内核参数优化(比如sysctl配置...

    浅谈数据库设计技巧经验

    这种设计方式简洁明了,符合3NF的要求,但存在一定的性能瓶颈。当需要展示所有类别及其子类别时,必须进行多次查询才能构建完整的层次结构。 ##### (2)优化方案 为了提高查询效率,可以采用以下优化策略: - **...

    浅谈AWR工具在oracle性能优化和故障诊断中的应用.pdf

    在Oracle性能优化中,AWR报告提供了数据库运行期间的详细信息,包括SQL语句执行情况、等待事件、资源使用情况等,这些信息对于识别性能瓶颈至关重要。 首先,AWR报告分析的关键部分包括Top 5 Timed Events,这是...

    浅谈大数据处理中的数据库I_O问题.pdf

    然而,传统的基于文件的数据库系统在处理海量数据时,经常遇到性能瓶颈,如长时间的响应延迟、操作卡顿、超时或意外错误,这些问题通常与磁盘I/O操作有关。 I/O速度和I/O效率是评估数据库性能的两个核心指标。I/O...

    浅谈IT系统运维检查的工作内容.docx

    1. **性能监控**:主动监控数据库性能,及时发现性能瓶颈。 2. **问题诊断**:快速诊断并解决数据库性能问题,确保数据访问效率。 3. **性能优化**:通过调整数据库配置和优化查询等方式提升性能。 #### 九、中间件...

    浅谈Oracle数据库的优化.pdf

    通过对这些指标的评估,可以了解数据库的性能瓶颈,并据此采取相应的优化措施。 在实际的数据库优化过程中,DBA需要综合考虑操作系统、CPU、内存、磁盘I/O等多个方面的因素,结合Oracle数据库的运行状况进行针对性...

    浅谈Arthas使用 火焰图

    通过火焰图,开发者可以直观地看到程序运行过程中CPU耗时最长的部分,从而快速定位到性能瓶颈。比如,如果发现某个热点方法被不必要地频繁调用,或者某个同步方法造成线程阻塞,都可以通过火焰图清晰地识别出来。 ...

    浅谈图书馆计算机网络系统的日常维护.pdf

    图书馆网络维护人员需要掌握一定的网络诊断和调试技能,以便在问题出现时迅速定位并解决问题。 维护图书馆计算机网络系统是一项复杂且细致的工作。维护人员必须全面考虑硬件性能、环境因素、网络配置等多种因素。...

    浅谈分布式存储与计算.docx

    传统的集中式存储系统将所有数据存放在单一服务器上,这不仅容易成为性能瓶颈,而且在数据量巨大时,对硬件的要求极高,数据迁移成本也高。分布式存储通过将数据分散存储在多台独立设备上,降低了对单台设备的依赖,...

    浅谈分布式存储与计算.pdf

    在传统的集中式存储系统中,所有的数据都存储在一个中心化的服务器上,这不仅容易成为性能瓶颈,而且一旦服务器出现问题,可能导致整个系统的瘫痪。分布式存储则将数据分散存储在多台独立的设备上,通过位置服务器...

    浅谈计算机软件工程维护措施.doc

    同时,利用性能监控工具对软件运行情况进行实时监测,发现性能瓶颈和异常行为,提前进行优化。 2.4 技术培训和支持 提供必要的技术培训,使用户和维护人员了解软件的使用和维护方法,增强他们的技能,以便更好地...

    浅谈优化Django ORM中的性能问题

    Django ORM通过Python代码与数据库进行交互,而数据库性能通常是Web应用性能瓶颈的关键。确保正确使用索引,针对频繁查询的字段创建索引可以显著提升查询速度。此外,审查和调整数据模型也很重要,避免冗余数据,...

    浅谈可视化运维在网络管理中的应用实践.docx

    (2)资源优化与预测:随着企业信息化的发展,网络数据流量日益庞大且复杂,如何掌握各部门、各区域间的流量分布,预测网络瓶颈,合理调整服务器布局,成为了一大挑战。网络运行可视化可以提供详尽的流量分析,为...

    浅谈DNS体系结构—DNS详细教程

    1. **性能瓶颈**:集中式的Hosts文件容易造成单点故障,影响网络的稳定性。 2. **数据更新**:随着网络的扩大,集中式文件的数据更新变得越来越困难。 3. **扩展性**:网络的持续增长要求DNS具有良好的可扩展性,...

    浅谈Oracle数据库基于索引的SQL语句优化方法.pdf

    在数据库应用开发过程中,经常遇到的软件运行速度瓶颈往往集中在大量查询、统计和分析等数据库操作上。为了提升数据库的性能,数据库优化是一个重要的手段,其中应用层面的优化主要依赖于索引优化。 索引对于数据库...

Global site tag (gtag.js) - Google Analytics