一、测试工具
APP性能调测分析:Emmaggee
性能压测工具:jmeter ,locust,Gatling,Ngrinder
流量复制工具:tcpcopy,goreplay
数据库基准测试(属于流量压测):sysBench,HammerDB
前端性能监控—浏览器上的performance,开源的zaneperfor。
链路监控(APM监控)—链路追踪,埋点各个接口的函数或类的链接关系,请求链路。目的就是找出拿个环节消耗时间最长,那么性能瓶颈定位分析就指向哪个环节。
结论:性能瓶颈一般会在最大TPS之前出现,为了让性能问题更明显的暴露,就算TPS达到峰值了还会继续往上压,因为还要借助RT指标来分析。
二、Java分析
1、us cpu 的java的cpu过高时,线程定位:
top #查看高uscpu 的java的进程pid
top -p pid H #查看java对应的线程
printf “%x\n” 线程id # 将高线程的id转换成十六进制
2、sy cpu 的java的cpu过高时,线程定位
top #查看高uscpu 的java的进程pid
top -p pid H #查看java对应的线程
(发现分析:有两个进程很高,且处于sleep和run不断切换,确定是上下文切换)
jstack -l 进程id #输出对应进程的dump线程信息
jstack 进程id |grep 线程id -A 30 #输出对应进程下的对应线程信息
vmstat 2 10 #查看上下文切换
jstack -l 进程id|grep "java.lang.Thread.State”|awk '{print $2$3$4$5}’ | sort |uniq -c. #统计不同状态的线程数量
jstack -l 进程id |grep “on object monitor". #显示waiting on object monitor 状态的线程信息
3、java 的文件IO分析
top # 查看%iowait是否波动明显
iostat -x 2 10
pidstat -d -p java_pid 1 10. # 跟踪java进程的io
jstack -l 进程id|grep "java.lang.Thread.State”|awk '{print $2$3$4$5}’ | sort |uniq -c. #统计不同状态的线程数量
4、网络Io分析
5、内存分析
三、mysql分析:
1
缓冲池使用率=(Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free)/Innodb_buffer_pool_pages_total
缓存命中率 Innodb_buffer_pool_read_hits=(1-Innodb_buffer_reads/Innodb_buffer_pool_read_requests)*100%
2
Sq进程分析
SHOW FULL PROCESSLIST;
SELECT * FROM ‘information_schema’.’PROCESSLIST'
sql性能分析
set profiling =1;
set profiling_history_size=20;
show profiles;
show profile cpu,block_io,memory,swaps,context switches,source for query [Query_ID];
select QUERY_ID,SEQ,DURATION,CPU_SYSTEM,BLOCK_OPS_IN,BLOCK_OPS_OUT from information_schema.PROFILING where QUERY_ID=[Query_ID];
Explain sql语句
3 Mysql IO分析
iostat -d -x -k l
iotop -p mysql_pid
SHOW FULL PROCESSLIST;
mysqladmin -uroot -p123456 pr|grep -v Sleep
4 内存监控
查看是否开启监控
SELECT * FROM perormance_schema.setup_instruments
WHERE NAM LIKE ‘%memory%' and NAME not LIKE '%memory/performance_schema%';
临时开启命令:
update performance_schema.setup_instruments set enabled='yes' where NAM LIKE ‘%memory%' and NAME not LIKE '%memory/performance_schema%';
查看内存占用:
Select SUBSTRING_INDEX(envent_name,' /',2) AS code_area, sys.foramte_bytes(SUM(current_alloc)) AS current_alloc FROM sys.x$memory_global_by_current_bytes GROUP BY SUBSTRING_INDEX(event_name,' /',2) ORDER BY SUM(current_alloc)
进一步细化查询memory/innodb:
SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name Like ‘memory/innodb%';
5 内存配置项查看
查看global级共享内存分配情况:
Show variables where variable_name in ('innodb_buffer_pool_size','innodb_log_buffer_size','innodb_additonal_mem_pool_size','query_cache_size','key_buffer_size');
查看session级私有内存情况:
show variables where variable_name in ('tmp_table_size','sort_buffer_size','read_buffer_size','read_rnd_buffer_size',’join_buffer_size','thread_stack','binlog_cach_size');
6 内存计算器
http://www.mysqlcalculator.com/