`

系统性能瓶颈定位浅谈

阅读更多

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

系统的性能优化可以说是一个比较大的开放性话题,可以说的有很多。本文就试着介绍下性能瓶颈的定位的一些工具,这些工具一般都是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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics