因为当出现吞吐远远不能够满足我们客户或者我们需要的呼叫了指标的时候因为出现了这么一次情况,虽然没有给用户没有给公司带来什么损失,但是该现象从侧面已经反应出了系统某些方面的问题,或许系统参数需要优化一番,或许系统设计交互需要优化一番,或许等等等的可能,才有了后续系统调优的历程。
流程相关分析优化:看看哪些流程可以同步转异步处理,可以梳理一下哪些请求可以合并起来,Server服务端的哪些业务场景需要补偿机制等。
数据库相关分析优化:哪些Sql耗时较长,哪些方法可以去除事务且去除事务后的带来的问题场景分析,数据库连接池参数是否合理,数据库本身相关参数的阈值情况的一些综合考虑;
内存使用情况分析优化:新老年代内存使用率及回收情况,CPU使用率,磁盘使用率,swap区使用情况, 线程dump,堆dump。
JVM参数分析调优:YGC的平均耗时,YGC的平均间隔,FGC的平均耗时,FGC的平均间隔等等,根据具体情况反映具体问题;
TCP/Tomcat参数分析调优:这个得根据实际压测情况来相应评估是否需要调整;
每n秒采集一次,一共采集m次
vmstat n m
[root@svr01]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 206944 633564 29876 1252176 0 0 10 27 0 0 1 1 98 0 0
0 0 206944 634232 29876 1252192 0 0 0 0 811 1504 1 1 98 0 0
0 0 206944 634480 29876 1252264 0 0 0 0 951 1458 6 1 93 0 0
最近1分钟,5分钟,15分钟的系统平均负载。
[root@svr01]$ uptime
21:27:44 up 207 days, 11:15, 1 user, load average: 26.45, 16.76, 7.50
主要看us和sy,其中us<=70,sy<=35,us+sy<=70说明状态良好,同时可以结合idle值来看,如果id<=70 则表示IO的压力较大。
[root@svr01]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 206944 633564 29876 1252176 0 0 10 27 0 0 1 1 98 0 0
0 0 206944 634232 29876 1252192 0 0 0 0 811 1504 1 1 98 0 0
0 0 206944 634480 29876 1252264 0 0 0 0 951 1458 6 1 93 0 0
Use%:已使用占比,Use% <= 90% 表示还勉强接受正常
[root@svr01]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LVroot
17737040 4286920 12542448 26% /
tmpfs 1893300 0 1893300 0% /dev/shm
/dev/sda1 194241 127341 56660 70% /boot
/dev/mapper/VolGroup00-LVhome
487652 2348 459704 1% /home
/dev/mapper/VolGroup00-LVcloud
3030800 260440 2613076 10% /opt/cloud
/dev/mapper/VolGroup00-LVtmp
8125880 18724 7687728 1% /tmp
/dev/mapper/VolGroup00-LVvar
25671996 848996 23512280 4% /var
/dev/mapper/VolGroup1-LVdata1
41149760 33707952 5344864 87% /wls/applogs
sar -d 1 1
:查看磁盘报告 1 1 表示间隔1s,运行1次
如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘请求饱和,可能存在瓶颈。
idle小于70% I/O压力就较大了,也就是有较多的I/O。
[root@svr01]$ sar -d 1 1
Linux 2.6.32-642.6.2.el6.x86_64 (SHB-L0044551) 07/20/2018 _x86_64_ (1 CPU)
03:00:23 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
03:00:24 PM dev252-0 23.00 808.00 80.00 38.61 9.88 375.35 43.48 100.00
03:00:24 PM dev252-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:00:24 PM dev253-0 4.00 448.00 0.00 112.00 1.11 222.00 249.50 99.80
03:00:24 PM dev253-1 50.00 400.00 0.00 8.00 24.40 523.20 20.00 100.00
03:00:24 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:00:24 PM dev253-3 3.00 32.00 0.00 10.67 0.99 242.33 331.67 99.50
03:00:24 PM dev253-4 0.00 0.00 0.00 0.00 1.61 0.00 0.00 100.00
03:00:24 PM dev253-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:00:24 PM dev253-6 3.00 0.00 24.00 8.00 1.30 393.67 261.33 78.40
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev252-0 23.00 808.00 80.00 38.61 9.88 375.35 43.48 100.00
Average: dev252-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-0 4.00 448.00 0.00 112.00 1.11 222.00 249.50 99.80
Average: dev253-1 50.00 400.00 0.00 8.00 24.40 523.20 20.00 100.00
Average: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-3 3.00 32.00 0.00 10.67 0.99 242.33 331.67 99.50
Average: dev253-4 0.00 0.00 0.00 0.00 1.61 0.00 0.00 100.00
Average: dev253-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-6 3.00 0.00 24.00 8.00 1.30 393.67 261.33 78.40
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
在不考虑系统负载、CPU、内存等情况下,netstat监控大量ESTABLISHED连接与Time_Wait连接
[root@svr01]$ netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
265 TIME_WAIT
45 ESTABLISHED
38 CLOSE_WAIT
18 LISTEN
8 FIN_WAIT2
2 SYN_SENT
1 Foreign
1 established)
注意:有些命令通用,有些是我根据系统的日志文件格式利用awk/sed两个命令结合写出来的。
netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn ( 查看TCP连接状态 )
netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20( 查找较多time_wait连接 )
netstat -anlp|grep tcp |awk ‘{print $5}’ |awk -F’:’ ‘{print $1}’ |uniq -c |sort -nr | head -n3( 查出访问靠前的IP地址 )
cat hmilyylimh_sql.log | awk ‘{print $6}’ | awk -F’ms’ ‘{print $1}’ | awk -F’=’ ‘{print $2 | “sort -r -n” }’ | head -n5( 查询sql文件中耗时最高的前5个耗时数据值 )
cat hmilyylimh_supp.log | awk ‘{print $10}’ | awk -F’timeConsuming=’ ‘{print $2 }’ | awk -F’ms’ ‘{print $1 | “sort -r -n” }’ | head -n5( 查看supp文件中耗时最高的前5个耗时数据值 )
cat hmilyylimh_sql.log | grep ‘sql:=’ | awk ‘{print $5}’ | uniq -c | sort -rn | head -n2( 查询sql文件总共打印了多少条SQL日志 )
cat hmilyylimh_sql.log | grep ‘NormalTimeConsuming’ | awk ‘{print $5}’ | uniq -c | sort -rn | head -n2( 查看sql文件成功执行了多少条SQL日志 )
cat hmilyylimh_sql.log | grep ‘BadTimeConsuming’ | awk ‘{print $5}’ | uniq -c | sort -rn | head -n2( 查看sql文件失败或者异常执行了多少条SQL日志 )
cat hmilyylimh_supp.log | grep ‘sendReqSupp start’| awk ‘{print $6$7$8}’ | uniq -c | sort -nr | head -n2( 查询supp文件sendReqSupp start字符串出现的次数 )
lsof -n | awk ‘{print $1,$2}’ | sort | uniq -c | sort -nr | head -n10( 统计持有各个进程持有句柄数最高的10个 )
lsof -n | awk ‘{print $1,$2}’ | sort | uniq -c | sort -nr | awk '{ sum+=$1 };END { print sum } '( 计算所有进程持有句柄数的总和,ulimit -n命令查看最大句柄数 )
lsof | awk ‘NF == 9 { print $0}’ | sort +6 -7nr | head -n10( 查看系统打开的大文件列表 )
top -b -n 1 | grep -E ‘Cpu(s)|Mem|Swap’( 一次性查出系统当前的CPU、内存、交换区的情况 )
iostat -p sda | awk -F’Device’ ‘{ print $1 }’( 查看cpu的统计信息(平均值) )
cat access_log.date +%Y%m%d
.txt | awk ‘{print $6}’ | uniq -c | sort -k2 -r | head -n10( 统计每秒请求并发,按照时间降序排列 )
cat access_log.date +%Y%m%d
.txt | awk ‘{print $6}’ | uniq -c | sort -rn | head -n10( 统计每秒并发,按照并发量降序排列 )
cat access_log.date +%Y%m%d
.txt | awk ‘{ sum+=$NF }; END { print sum*2/8/1024/1024, “M” }’( 查看访问hmilyylimh服务器每天的总流量 )
cat gc.log | tail -n20|awk ‘{print $4}’| awk -F’->’ ‘{print $1, $2, $3 }’| awk -F’(’ ‘{print $1, $2, $3}’ | awk -F’)’ ‘{print $1}’ | awk -F’K’ ‘{print $1/$3100, "% used -> " ,$2/$3100, "% used " , 100-$2/$3*100, "% free ", $3/1024, “M total — 新生代” }’( 查看gc指标,新生代最后n条记录的新生代内存变化率 )
cat gc.log | tail -n20 | awk ‘{print $7}’ | awk -F’->’ ‘{print $1, $2, $3 }’ | awk -F’(’ ‘{print $1, $2, $3}’ | awk -F’)’ ‘{print $1}’ | awk -F’K’ ‘{print $1/$3100, "% used -> " ,$2/$3100, "% used " , 100-$2/$3*100, "% free ", $3/1024, “M total — 堆内存” }’( 查看最后10条GC日志的堆内存已使用转化率 )
cat /etc/sysctl.conf | grep ‘tcp_’( 查看TCP参数设置信息 )
cat hmilyylimh.log | awk ‘{if($2>“15:17:00.236”) print $0}’ | grep “max_user_connections” | wc -l( 查看具体时间点后某个字符串出现的次数 )
1、echo "<<<<<<<<<<<<<< 线程阻塞等待计数: "`less hmilyylimh_error.log | grep "with callerRunsPolicy" | wc -l`", ""db事务嵌套锁AcquireLock计数: "`less hmilyylimh_error.log | grep "CannotAcquireLockException" | wc -l`", ""创建事务异常计数: "`less hmilyylimh_error.log | grep "CannotCreateTransactionException" | wc -l`", ""db连接池溢出计数: "`less hmilyylimh_error.log | grep "more than 'max_user_connections'" | wc -l`", ""Pool Empty计数: "`less hmilyylimh_error.log | grep "Unable to fetch a connection" | wc -l`" >>>>>>>>>>>>>>"
2、echo "<<<<<<<<<<<<<< UnknownHostException计数: "`less hmilyylimh_error.log | grep "UnknownHostException" | wc -l`", ""ConnectionPoolTimeout计数: "`less hmilyylimh_error.log | grep "ConnectionPoolTimeout" | wc -l`", ""ConnectException计数: "`less hmilyylimh_error.log | grep "ConnectException" | wc -l`", ""ConnectTimeoutException计数: "`less hmilyylimh_error.log | grep "ConnectTimeoutException" | wc -l`", ""SocketTimeoutException计数: "`less hmilyylimh_error.log | grep "SocketTimeoutException" | wc -l`", ""OtherException计数: "`less hmilyylimh_error.log | grep "OtherException" | wc -l`" >>>>>>>>>>>>>>"
3、echo "<<<<<<<<<<<<<< Sql耗时最高的前5个数值: "`cat hmilyylimh_sql.log | awk '{print $6}' | awk -F'ms' '{print $1}' | awk -F'=' '{print $2 | "sort -r -n" }' | head -n5`", ""Supp耗时最高等待前5个数值: "`cat hmilyylimh_supp.log | awk '{print $10}' | awk -F'timeConsuming=' '{print $2 }' | awk -F'ms' '{print $1 | "sort -r -n" }' | head -n5`" >>>>>>>>>>>>>>"
4、echo "<<<<<<<<<<<<<< Http请求耗时最高前10个数值: "`less hmilyylimh.log | grep "timeConsuming=" | awk '{print $9}' | awk -F'=' '{print $2}' | awk -F'ms' '{print $1 | "sort -r -n" }' | head -n10`" >>>>>>>>>>>>>>"