JAVA优化篇 如何找到运行缓慢的线程
引入
JAVA提供了一些分析DUMP的工具,比如jmap,visualvm 等
JAVA还有寻找线程状态的工具,jstack等
数据库也有检查连接数,连接状态的命令,status,processlist等
代码中也可以添加一些时间的信息,对比信息发现可优化的地方
但这些都不是今天要记录的内容,今天要做的是使用一个比较暴力的方式查找出高并发模式下运行缓慢的线程
正文
写高并发的时候经常会遇到的问题:
单独观察每个分支线程或者主线程时,都执行地非常快,但是总体上运行的TPS却并不高,没有达到期望的值
更换环境,或者调大运行内存和CPU后,情况仍然不见好转
这时候有个办法是,找出每个线程的运行过程,寻找出耗时较大的代码段,再对代码进行分析
脚本我已经写好了:
#!/bin/bash
parseLog(){
##初始值
upLine="blank"
last_time_pre="blank"
last_time_post="blank"
cat "$1" | while read line
do
time_pre=`echo "$line" | awk '{print$1}'`
time_post=`echo "$line" | awk '{print$2}'`
if [[ `echo "$time_post" | grep ":"` != "" ]]
then
if [[ "$upLine" == "blank" ]]
then
upLine=${line}
last_time_pre=`echo "$line" | awk '{print$1}'`
last_time_post=`echo "$line" | awk '{print$2}'`
total2="$last_time_pre"" $last_time_post"
last_time_pre=`date +%s -d "$total2"`
last_time_pre=`expr "$last_time_pre" \* `
last_time_post=`echo ${last_time_post::}`
else
total="$time_pre"" $time_post"
time_pre=`date +%s -d "$total"`
time_pre=`expr "$time_pre" \* `
time_post=`echo ${time_post::}`
time_end=`expr "$time_pre" + "$time_post"`
time_begin=`expr "$last_time_pre" + "$last_time_post" + "$2"`
last_time_pre=${time_pre}
last_time_post=${time_post}
if [[ "$time_end" -gt "$time_begin" ]]
then
echo ${upLine} >> result.log
echo ${line} >> result.log
fi
upLine=${line}
fi
fi
done
} if [[ ! -n "$1" ]] || [[ ! -n "$2" ]] || [[ ! -n "$3" ]]
then
echo [log file] [interval millis] [key words]
exit
fi awk '{num[$4]++}
END{for(k in num)print k,"----",num[k]|"sort -k 3 -rn"}' "$1" |
head -n | awk '{str[$1]++} END{for (s in str)print s}'| grep "$3" > thread.log ##对上述输出的每一个线程做分析处理,调用parseLog
cat thread.log | while read line
do
grep "\""${line}"\"" "$1" > temp.log
parseLog temp.log $
done
exit
这个脚本有个基础条件是,分析的日志必须得是按照一定规范输出的日志,输出字段中带有时间和线程名
脚本传参:
获得可以分析的所有线程,按照数量排序,并只获得前15个
接下来对每一个过滤出来的线程做分析处理
最后就是分析日志的方法了
主要思路是,用下一行的时间减去上一行的时间,如果超过给定的值,就将两行都输出到指定文件。
执行效果:
[utap@host145 logs]$ sh pick_thread.sh bb.log timer
timerQ_3-service-#]
[utap@host145 logs]$ cat result.log
-- ::00.371 [DEBUG] [TaskRule:][printExpr] [timerQ_3-service-#] [] - TaskRule printExpr i-j=-, expr[i].elementAt(j).m_min=, m_max=
-- ::00.373 [DEBUG] [TaskRule:][printExpr] [timerQ_3-service-#] [] - TaskRule printExpr i-j=-, expr[i].elementAt(j).m_min=, m_max=^C
方便再次使用到吧,地址在 https://github.com/garfieldcgf/notes/tree/master/operations/bin
JAVA优化篇 如何找到运行缓慢的线程的更多相关文章
- java中如何使正在运行中的线程退出
终止线程的三种方法 有三种方法可以使终止线程. 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2. 使用stop方法强行终止线程(这个方法不 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Java语言中System.out.print与Log的比较
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 前言 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外 ...
- JAVA高级篇(二、JVM内存模型、内存管理之第二篇)
本文转自https://zhuanlan.zhihu.com/p/25713880. JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充 ...
- Java基础篇(JVM)——字节码详解
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...
- MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象
我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...
- MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题
我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...
- Java提高篇(二六)-----hashCode
在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最 ...
随机推荐
- Redis源码解析:08对象
前面介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合等.然而Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一 ...
- Python3.6正向解析与反向解析域中主机
公司最近接手的一家跨国企业的项目,该企业单域.多站点,且遍布美国.巴西.日本.东京.新加坡等多个国家,服务器及客户端计算机数量庞大.由于处理一些特殊故障,需要找出一些不在域中的网络设备及存储.NBU等 ...
- oracle函数 sysdate
[功能]:返回当前日期. [参数]:没有参数,没有括号 [返回]:日期 [示例]select sysdate hz from dual; 返回:2008-11-5
- oracle函数 NLS_LOWER(x[,y])
[功能]返回字符串并将字符串的变为小写; [参数]x字符型表达式 [参数]Nls_param可选,指定排序的方式(nls_sort=) . SCHINESE_RADICAL_M(部首.笔画) SCHI ...
- HZOJ 回家
这篇博客大部分在写我的错解……明明很简单的一道题,知道正解后10分钟AC,然而几个错解打的想死…… 错解1 WA40: 鬼知道这40分哪来的……这也是考试最后很无奈地交上去的代码,最后剩20分钟时发现 ...
- 3331: [BeiJing2013]压力
3331: [BeiJing2013]压力 LCA+树上差分,和之前类似的题差不多,就是多了个v-dcc缩点,唯一要注意的就是判断是否是割点,对于不是割点的点,如果他是起点或重点,ans++,和差分没 ...
- android学习——Android Layout标签之-viewStub,requestFocus,merge,include
定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...
- [转]在Windows中安装Memcached
Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度. Memcached最开始是作为 ...
- laravel-admin新手的使用
1.添加页面 配置好laravel-admin的模板后 点击管理员管理里的菜单列表,输入如下信息即可 提交之后刷新页面,左侧菜单就会显示新增的广告管理的标签 2.定义路由 配置好前端的页面显示之后就要 ...
- java 声明多个泛型类型和通配符
若一个类中多个字段需要不同的泛型声明,则在声明类的时候指定多个泛型类型即可: 格式: public interface IDAO<PK, T> { PK add(T t); void re ...