发表于: 2017-09-01 17:08:29
1 986
今天完成的事情:
用环绕通知来统计数据库响应时间
先弄一个新的类
public class LogAdvice {
private static org.apache.log4j.Logger loggerAdvice = org.apache.log4j.Logger.getLogger(LogAdvice.class);
public void before() {
System.out.println("前置通知");
}
public void after() {
System.out.println("这是后置通知");
}
public Object around (ProceedingJoinPoint pip)throws Throwable{
//获取组件类名
String className = pip.getTarget().getClass().getName();
//获取调用方法名
String method = pip.getSignature().getName();
//取得数据库连接前时间
long begin = System.currentTimeMillis();
// 当前系统时间
String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss") .format(new Date());
Object obj = pip.proceed();
//取得数据库连接后时间
long end = System.currentTimeMillis();
//sqlTime为数据库响应时间
int sqlTime = (int)(end - begin);
String msg = date + " ,执行了" + className + "." + method + "()";
loggerAdvice.info(msg + "\t响应时间: "+ sqlTime);
return obj;
}
public void afterException(){
System.out.println("这是异常通知");
}
public void afterAdvice(){
System.out.println("这是一个后置异常通知");
}
}
然后在配置文件里加一个bean就行了,实现起来很简单
<!-- 声明方面组件 -->
<bean id="LogAdvice" class="com.jnshu.util.LogAdvice"/>
<aop:config>
<aop:aspect id="myAspect" ref="LogAdvice">
<!--确定执行什么类进行通知-->
<aop:pointcut id="impl" expression="execution(* com.jnshu.service.Impl.StudentServiceImpl.*(..))"/>
<!--确定类中的那个方法(由method确定)进行通知-->
<!--before前置通知-->
<!--<aop:before method="before" pointcut-ref="aspect"/>-->
<!--after为后置通知-->
<!--<aop:after method="after" pointcut-ref="aspect"/>-->
<!--后置异常通知 -->
<!--<aop:after-returning method="afterAdvice" pointcut-ref="aspect"/>-->
<!-- 出现异常通知 -->
<!--<aop:after-throwing method="afterException" pointcut-ref="aspect"/>-->
<!--环绕通知-->
<aop:around method="around" pointcut-ref="impl"/>
</aop:aspect>
</aop:config>
aop原理参考这篇
http://www.cnblogs.com/liuhongfeng/p/4736947.html
以及博涛大佬的日报
执行结果
剩下的方法还没想好。。
在shell里用TOP命令查看web服务信息
第一行,当前时间,系统运行时间,当前用户,load average后面分别是1分钟、5分钟、15分钟的负载情况
第二行,共有83个进程,1个在运行,82个在休眠,0个停止,zombie0个
第三行,cpu状态,0.3%us用户空间占用cpu的百分比,0.3%sy内核空间占用CPU的百分比,0.0%ni改变过优先级的进程占用cpu的百分比,99.3%id空闲cpu百分比,0.0%waIO等待占用cpu百分比,0.0%hi硬中断占用cpu百分比
第四行,内存状态,1019984k tatal物理内存总量,933824k used使用中的内存总量,86160k free空闲内存总量,93960 buffers缓存的内存量
第五行,swap交换区,和第四行内容一样
第六行是空行,然后第七行
PID 进程pid;USER 进程的所有者;PR 进程优先级;NI nice值,负值表示高优先级,正值表示低优先级;VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES;RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA;SHR 共享内存大小,单位kb;S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程;%CPU 上次更新到现在的CPU时间占用百分比;%MEM 进程使用的物理内存百分比;TIME+ 进程使用的CPU时间总计,单位1/100秒
然后按1可以监控每个cpu的情况
我这里就一个cpu0,所以没啥区别
然后我把项目传到了svn上,task3
在服务器上用脚本运行一下,然后我用子域名一登,咔!
我屮艸芔茻,什么鬼又是..我配的本地host啊,根本和服务器应该是一样用啊。。
重启一下nginx看看吧
然后,还是不行。。博韬说是这个域名被查出来了,不让用了。。好吧,不弄了,没什么意义
最终统计的时间的脚本如下
#!/bin/bash
echo "将项目中的日志提取"
cat /logs/log.log |grep "执行了" > /root/mydata/task3/DB.txt
echo "将Nginx中的日志提取"
cd /usr/local/nginx/logs
cat access.log |grep "task3" > /root/mydata/task3/nginx.txt
echo "定位到/root/mydata/task3"
cd /root/mydata/task3
echo "再次抽取项目日志的数据库连接时间"
cat DB.txt | awk '{print $12}' >DBTime.txt
echo "数据库连接时间小于20ms"
cat DBTime.txt | awk 'BEGIN{sum=0}{if($1<20) sum++;}END{print sum}'
echo "数据库连接时间大于20ms小于50ms"
cat DBTime.txt | awk 'BEGIN{sum=0}{if(($1>20)&&($1<50)) sum++;}END{print sum}'
echo "数据库连接时间大于50ms小于100ms"
cat DBTime.txt | awk 'BEGIN{sum=0}{if(($1>50)&&($1<100)) sum++;}END{print sum}'
echo "数据库连接时间大于100ms"
cat DBTime.txt | awk 'BEGIN{sum=0}{if($1>100)sum++;}END{print sum}'
echo "抽取Nginx中的延迟时间"
cat nginx.txt | awk '{print $9}' > nginxTime.txt
echo "nginx延迟时间小于20ms"
cat nginxTime.txt | awk 'BEGIN{sum=0}{if($1<20/1000) sum++;}END{print sum}'
echo "数据库连接时间大于20ms小于50ms"
cat nginxTime.txt | awk 'BEGIN{sum=0}{if(($1>20/1000)&&($1<50/1000)) sum++;}END{print sum}'
echo "数据库连接时间大于50ms小于100ms"
cat nginxTime.txt | awk 'BEGIN{sum=0}{if(($1>50/1000)&&($1<100/1000)) sum++;}END{print sum}'
echo "数据库连接时间大于100ms"
cat nginxTime.txt | awk 'BEGIN{sum=0}{if($1>100/1000)sum++;}END{print sum}'
运行一下
额,肯定哪里写错了,我去日志里找找
这里共9个请求,访问时间都是毫秒,明显在100毫秒以上的就两个,它显示9个应该是按秒算了吧
额,其实不是。。是我的脚本里几个地方写错了,主要是抽取的文件里参数位置不太对,改了之后就可以了。
我随便发了几次请求来看看结果是怎样的
应该没什么问题了
深度思考:
1,nginx服务器有什么用,什么是反向代理?
反向代理,负载均衡,HTTP服务器,高并发,正向代理。反向代理前边说过了
2,什么是SSH,如何在服务器上从网上下载文件?
SSH就是一种建立在应用层基础上的安全协议,专为远程登录会话和其他网络服务提供安全性的协议,可以防止信息泄密。
下东西可以用wget+url,或者直接用xftp软件
3,如何写shell脚本
最近写了好几个脚本了,我打算整理一下弄个小课堂啥的
4,tomcat、hetty、resin各容器有什么区别,如何优化容器配置?
讲不清楚..见程远大佬简书
http://www.jianshu.com/p/8465131bcabf
明天计划的事情:
任务3有几个地方还不太懂,再看看就开始任务4
遇到的问题:
暂无
收获:
Life's A Struggle
评论