2023性能测试工作积累
一 理论
性能调优流程:
确定调优范围:服务器CPU、内存、IO、网络是否已被充分利用,是否存在瓶颈点。
系统调优:目的是充分利用服务器资源,避免资源冲突,提升吞吐量。调优效果:硬件<系统配置<数据库表结构
SQL调优:通过analyze语句生成表统计信息;通过explain分析执行计划;优化sql写法;
2、was性能调优;
3、并不是cpu满才是瓶颈,到40、50就会有少量cpu队列等待。如果增加机器,cpu会下降,tps会提升,说明单台机器的连接数是潜在的瓶颈。
二 数据库
1、Oracle Database 12c DBA官方手册(第8版)-Bob Bryla-微信读书 (qq.com)
2、mysql
2.1 造数时,innodb_flush_log_at_trx_commit = 1 造数时改为0,造完改为1,这个在配置文件mysql配置文件里,改为0表示每秒写入一次log,而不是每次事务提交就写入。这样可以加速造数的速度。
2.2 正常写for循环一条条insert,速度是3小时1000万,insert select limit 10000 ,速度是1小时3000万
2.3 mysql数据库给日期变量p_create_time加d天
DATE_ADD(p_create_time,INTERVAL d day);
2.4 mysql对比两个数据库的索引,用临时表当媒介,注意临时表只存在于当前会话,会话一关,临时表就没了
create temporary table test_tmp as select index_name,table_name from information_schema.STATISTICS;
然后通过子查询,看哪些索引是在a库里有,b库里没有的
select * from a where (table_name,index_name) not in (select table_name,index_name from b)
3、oracle
3.1 oracle数据库给日期变量
declare p_create_time DATE; p_create_time2 VARCHAR2(20); begin p_create_time:=to_date('2018-01-01','YYYY-MM-DD'); for i in 1 .. 100 loop p_create_time2:=to_char(p_create_time,'YYYY-MM-DD'); if mod(i,20) = 0 then p_create_time := p_create_time + 1; end if; end loop; end;
oracle把test表的aa字段,修改为从10000开始,每10笔加1
update test set aa = trunc(10000+(rownum-1)/10,0) 如果不加trunc,会得到一个有很多小数位的浮点数,会超出字段长度限制
3.2 Oracle查看一张表的执行计划,发现有索引还触发了全表扫描,原因如下:
如果优化器确定查询需要表中的大部分块,即使索引是可用的,它仍将使用全表扫描。全表扫描会使用更大的I/O调用。较少的大型IO调用比许多较小的调用更划算。
三 linux
1、Linux 三剑客实例详解「grep、sed 、awk」 - 知乎 (zhihu.com)
2、从今天被修改的日志文件中,找某个关键字 find /tmp/log -mtime 0 | xargs grep -10 '关键字'
3、在linux服务器上远程传输文件
scp xx.log root@192.168.1.2:/root
使用scp命令,把当前机器上的xx.log文件传输到192.168.1.2服务器上root用户的/root目录下
4、看cpu
sar -u 1 5
vmstat 1 -w r是等待cpu的进程,b是等待io的进程
5、看网络
ip a 看有哪些网卡
ethtool eth0(网卡名) 里面的speed就是带宽上限
sar -n DEV 1 10 看各个网卡的实时带宽,1秒输出一次,共10次
iftop -i eth0(网卡名) -P 看哪个端口在用网络
iotop -p $PID -d 1
6、看磁盘
iostat -x -k %util 一秒钟之内,有多少时间用于io,如果100,说明太多io
iostat -x 1 10 w_wait一般不超过2毫秒,磁盘使用率小于60%
iotop -oP 看哪个进程使用io高 或pidstat -d 1
pidstat -p $PID -d 1 用启动这个进程的用户启动pidstat,若用其他用户是没有查看权限的,只能看到显示-1
看磁盘读写速度
dd bs=1k count=1000k if=/dev/zero of=~/test_default.txt conv=fsync
写速度 time dd if=/dev/zero of=/tmp/test bs=8k count=10000 conv=fsync // 测完以后记得删文件
读速度 time dd if=/tmp/test of=/dev/null bs=8k
7、看内存
free -g -g是单位,默认是字节
top执行shift+m看线程对内存的占用
8、设置crontab定时
suse linux重启crontab的命令是: /sbin/service cron restart
使用crontab一般是用root用户,有些用户没有使用crontab的权限
cron -l 看目前的定时
cron -e 修改目前的定时
设置每10秒运行一次:
* * * * * sleep 10; /tmp/xx.sh
* * * * * sleep 20; /tmp/xx.sh
设置每分钟运行一次
*/1 * * * * /tmp/xx.sh
9、火焰图
看当前一段时间内,某个进程占用cpu的线程函数及其调用栈,最下面是栈底
cd /tmp/async-profiler-2.9-linux-x64
sh profiler.sh -d 120 -f profiler.html 12345 120是截取当前120秒时间内,12345是分析的进程号
10、arthas 看jvm 以及函数调用链耗时
cd /tmp/arthas-packaging-3.5.2-bin
sh as.sh 进程号
dashboard 就能看实时jvm了
看函数调用链耗时,得知道入口函数类名、方法名
sh as.sh 进程号之后
trace com.test.testClass testFunc '#cost > 500' -n 200 追踪testClass类testFunc函数里,耗时大于500毫秒的函数,并列出前200个
然后找到耗时比较长的,再用trace命令看他里面又调用了什么
四 性能分析工具
1、IBM官方的jvm分析工具,分析是否有内存泄漏风险,和占用jvm过多的对象及其所在类或函数,比visualVM更直观,能定位某个基本类型是哪个类,visualVM只知道基本类型占内存多,但不知道这些基本类型是哪个类的。
工具名:
IBM HeapAnalyzer
IBM Thread and Monitor Dump Analyzer for Java
启动工具命令:
java -Xmx6g -jar jca464.jar 6g是自己指定的启动这个工具的jvm大小,如果dump文件5个g,jvm分析工具必须大于5g,它才能打开dump文件
java -Xmx6g -jar ha457.jar
五 压测工具