发表于: 2017-09-01 17:08:29

1 988


今天完成的事情:

用环绕通知来统计数据库响应时间

先弄一个新的类

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

禅道链接:http://task.ptteng.com/zentao/project-task-286.html


返回列表 返回列表
评论

    分享到