1. 性能优化是什么?

1.1 性能优化就是发挥机器本来的性能

1.2 性能瓶颈在哪里,木桶效应。

 

CPU占用过高

1、现象重现

CPU占用过高一般情况是代码中出现了循环调用,最容易出现的情况有几种:

a)递归调用,退出机制设计的不够合理;

b)定时器启动过频繁;

c)代码出现死循环

 GC频繁也可能导致CPU占用过高

我用最简单的死循环来举例:

while (true){
        ...
}

执行后用top 命令查看系统情况

cpu过高优化 ios cpu占用优化_html

这个时候可以看大pid 21270 的进程 cpu占用率为100%

这里有一个小细节,就是总体cpu占用率却为6.8

原因是服务器为多核的,而示例代码为单线程,只会一直占用其中一核

cpu过高优化 ios cpu占用优化_响应时间_02

 

假如在while 里面不断创建线程就会把整个CPU占满

while (true){
    Thread thread = new Thread(new MyRunnable());
    thread.start();
}

2、定位方法

首先可以确定占用CPU的进程pid为21270

cpu过高优化 ios cpu占用优化_html_03

然后按shift + h 可以切换成tid(线程id)

cpu过高优化 ios cpu占用优化_html_04

可以看到占用cpu的tid为21318

也可以用命令# top -H -p21270 说明: -H 指显示线程,-p 是指定进程

或者用命令ps -mp pid -o THREAD,tid,time 查看pid的线程

cpu过高优化 ios cpu占用优化_linux_05

 

cpu过高优化 ios cpu占用优化_linux_06

再将得到的tid转换成16进制

printf %x 21318 得到 5346

 

执行

jstack -l pid > test.txt

得到线程信息

然后再在test.txt中查找5346会看到一个nid=ox5346的异常信息

cpu过高优化 ios cpu占用优化_响应时间_07

这里可以很清晰的看到是TestController类的28行有问题(此处是一个死循环)

 

 以上是一次代码导致cpu占用过高的问题排查过程

 

GC过于频繁也会导致CPU占用过高

 

 

 

 

 

===================================待完善===============================================

2. 性能的几个唯度

2.1 CPU

2.2 Memory

2.3 IO

2.4 network 网络

 

2.1

命令 vmstat

http://www.man7.org/linux/man-pages/man8/vmstat.8.html

首先检查 cpu,cpu 使用率要提升而不是降低

CPU 空闲并不一定是没事做,也有可能是锁或者外部资源瓶颈。

命令 Top

http://man7.org/linux/man-pages/man1/top.1.html

 

2.2 Memory

命令 free -h

http://www.man7.org/linux/man-pages/man1/free.1.html

 

 

 

2.3 IO

命令 iostat -dx 1

http://www.man7.org/linux/man-pages/man1/iostat.1.html

rrqm/s:队列中每秒钟合并的读请求数量

wrqm/s:队列中每秒钟合并的写请求数量

r/s:每秒钟完成的读请求数量

w/s:每秒钟完成的写请求数量

rsec/s:每秒钟读取的扇区数量

wsec/s:每秒钟写入的扇区数量

avgrq-sz:平均请求扇区的大小

avgqu-sz:平均请求队列的长度

await:平均每次请求的等待时间

svctm:平均每次请求的服务时间

util:设备的利用率

注:建议对照源代码来记忆这些参数都是如何计算出来的。

 

 

2.4 Network

命令 nicstat (需要安装)

wget http://sourceforge.net/projects/nicstat/files/nicstat-1.92.tar.gz

tar -zxvf nicstat-1.92.tar.gz

sudo vim Makefile

CFLAGS = $(COPT) -m32#将此行修改为如下:

CFLAGS = $(COPT)

sudo make -f Makefile install

 

3. 术语

吞吐量:对单位时间内完成的工作量的度量

平均响应时间:提交请求和返回该请求的响应之间使用的时间

平均响应时间越短,系统吞吐量越大;平均响应时间越长,系统吞吐量越

小;但是,系统吞吐量越大,未必平均响应时间越短;因为在某些情况(例

如,不增加任何硬件配置)吞吐量的增大,有时会把平均响应时间作为牺牲,

来换取一段时间处理更多的请求。

 

 

4、top找到CPU过高的那行代码

4.1、top 找到Pid,shift+h,找到tid

4.2、jstack pid > p.txt 导出线程dump

4.3、把线程号找到16进制 printf "%x \n" tid

4.4、在p.txt中找到16进制对应的线程信息

 

 

5、heap内存分析

jmap -heap 23451

jmap -dump:format=b,file=aa 23451

获取文件之后使用MAT去查看内存被占用的对象。

http://www.importnew.com/28916.html