发表于: 2017-07-27 20:12:17
3 1161
一.今天完成的主要事情
1.编写脚本,统计访问DB和controller的时间
运行脚本
[xiaowenhou@iZwz9d3x7jbzmneba352nmZ warnLog]$ sh count.sh
#前一部分是Nginx的相关数据,主要是访问次数和响应时间,响应时间按不同时间段划分
Nginx相关数据:
所有访问次数为:
61
Nginx响应时间(划分时间段):
响应时间为0.050ms以内的次数是:
50
响应时间为(0.050ms-0.100ms)之间的次数是:
1
响应时间为(0.100ms-0.150ms)之间的次数是:
0
响应时间为(0.150ms-0.200ms)以内的次数是:
0
响应时间超过0.200ms的次数是:
10
#第二部分是访问DB的时间,分段划分
项目相关数据:
访问DB用时(划分时间段):
访问DB时间为20ms以内的次数是:
23
访问DB时间为(20ms-40ms)之间的次数是:
17
访问DB时间为(40ms-60ms)之间的次数是:
2
访问DB时间为(60ms-80ms)之间的次数是:
1
访问DB时间为(80ms-100ms)之间的次数是:
0
访问DB时间为100ms以上的次数是:
3
#第三部分是访问Controller的时间(这里的时间都是controller中一个方法执行的时间,所以会包含访问DB的时间,不是单纯的controller业务逻辑所花费的时间,不过两者在日志中基本是成对出现,所以计算单纯的业务逻辑时间也很简单)
访问Controller用时(划分时间段):
访问Controller时间为20ms以内的次数是:
23
访问Controller时间为(20ms-40ms)之间的次数是:
15
访问Controller时间为(40ms-60ms)之间的次数是:
4
访问Controller时间为(60ms-80ms)之间的次数是:
1
访问Controller时间为(80ms-100ms)之间的次数是:
0
访问Controller时间为100ms以上的次数是:
3
[xiaowenhou@iZwz9d3x7jbzmneba352nmZ warnLog]$
下面是nginx该脚本的代码:
#!/bin/sh
LOG_PATH=/usr/local/nginx/logs/resinlog/resin.log
PROJECT_LOG_PATH=/var/resin/webapps/hello/log/warnLog/warnLog.log
echo "Nginx相关数据:"
echo "所有访问次数为:"
cat ${LOG_PATH} | wc -l //这一句是统计访问Nginx中该服务的次数
echo "Nginx响应时间(划分时间段):"
echo "响应时间为0.050ms以内的次数是:"
cat ${LOG_PATH} | awk 'BEGIN{sum=0} {if($13<0.050) sum++;} END {print sum}'
//根据时间分段统计,使用awk命令自带的if语句和BEGIN,END代码块
echo "响应时间为(0.050ms-0.100ms)之间的次数是:"
cat ${LOG_PATH} | awk 'BEGIN{sum=0} {if(($13>=0.050)&&($13<0.100)) sum++;} END {print sum}'
echo "响应时间为(0.100ms-0.150ms)之间的次数是:"
cat ${LOG_PATH} | awk 'BEGIN{sum=0} {if(($13>=0.100)&&($13<=0.150)) sum++;} END {print sum}'
echo "响应时间为(0.150ms-0.200ms)以内的次数是:"
cat ${LOG_PATH} | awk 'BEGIN{sum=0} {if(($13>0.150)&&($13<=0.200)) sum++;} END {print sum}'
echo "响应时间超过0.200ms的次数是:"
cat ${LOG_PATH} | awk 'BEGIN{sum=0} {if($13>0.200) sum++;} END {print sum}'
echo ""
echo "项目相关数据:"
echo "访问DB用时(划分时间段):"
echo "访问DB时间为20ms以内的次数是:"
cat ${PROJECT_LOG_PATH} | awk 'BEGIN{sum=0} {if($12~/com.putaoteng.task2.dao.BasicDao*/ && $14<20) sum++;} END {print sum}'
//根据时间分段统计,同上,使用awk命令自带的if语句和BEGIN,END代码块,同时使用//匹配字符串的形式确定是执行访问DB方法的行
echo "访问DB时间为(20ms-40ms)之间的次数是:"
cat ${PROJECT_LOG_PATH} | awk 'BEGIN{sum=0} {if($12~/com.putaoteng.task2.dao.BasicDao*/ && $14>=20 && $14<40) sum++;} END {print sum}'
echo "访问DB时间为(40ms-60ms)之间的次数是:"
cat ${PROJECT_LOG_PATH} | awk 'BEGIN{sum=0} {if($12~/com.putaoteng.task2.dao.BasicDao*/ && $14>=40 && $14<60) sum++;} END {print sum}'
echo "访问DB时间为(60ms-80ms)之间的次数是:"
cat ${PROJECT_LOG_PATH} | awk 'BEGIN{sum=0} {if($12~/com.putaoteng.task2.dao.BasicDao*/ && $14>=60 && $14<80) sum++;} END {print sum}'
echo "访问DB时间为(80ms-100ms)之间的次数是:"
cat ${PROJECT_LOG_PATH} | awk 'BEGIN{sum=0} {if($12~/com.putaoteng.task2.dao.BasicDao*/ && $14>=80 && $14<100) sum++;} END {print sum}'
echo "访问DB时间为100ms以上的次数是:"
cat ${PROJECT_LOG_PATH} | awk 'BEGIN{sum=0} {if($12~/com.putaoteng.task2.dao.BasicDao*/ && $14>=100) sum++;} END {print sum}'
controller的统计基本和访问DB统计相同,就不全贴出来了
以下是部分项目日志,加粗部分是脚本抓取的数据
2017-07-27 19:16:54 [ 10333506 ] - [ WARN ] 执行 List com.putaoteng.task2.dao.BasicDao.queryAll() 用时: 11 ms
2017-07-27 19:16:54 [ 10333507 ] - [ WARN ] 执行 String com.putaoteng.task2.controller.Task2UserControllerDemo.queryAll(Model) 用时: 12 ms
2017-07-27 19:16:55 [ 10334539 ] - [ WARN ] 执行 List com.putaoteng.task2.dao.BasicDao.queryAll() 用时: 13 ms
2017-07-27 19:16:55 [ 10334539 ] - [ WARN ] 执行 String com.putaoteng.task2.controller.Task2UserControllerDemo.queryAll(Model) 用时: 13 ms
2017-07-27 19:16:57 [ 10336491 ] - [ WARN ] 执行 BasicVo com.putaoteng.task2.dao.BasicDao.queryOneById(long) 用时: 12 ms
以下是部分Nginx日志,加粗部分是脚本抓取的数据:
www.hello2.com 113.116.213.242 [27/Jul/2017:16:06:36 +0800] "GET /hello/a/student/list HTTP/1.1" 200 5000 "-" "120.77.169.243:8080" 0.021 0.021
www.hello2.com 113.116.213.242 [27/Jul/2017:16:06:38 +0800] "GET /hello/a/student/list HTTP/1.1" 200 5000 "-" "120.77.169.243:8080" 0.026 0.026
www.hello2.com 113.116.213.242 [27/Jul/2017:16:06:39 +0800] "GET /hello/a/student/id/10? HTTP/1.1" 200 1362 "-" "120.77.169.243:8080" 0.019 0.019
www.hello2.com 113.116.213.242 [27/Jul/2017:16:06:44 +0800] "POST /hello/a/student/id/4 HTTP/1.1" 200 2387 "-" "120.77.169.243:8080" 0.019 0.019
这里也向师兄探讨一个问题,nginx的响应时间和请求时间应该是毫秒为单位吧,我看文档是以毫秒为单位,但是又感觉这个时间有点太少了...
2.使用Top命令查看WEB服务占用内存和CPU。
分为两个步骤,首先,用 sudo netstat -tunlp | grep web程序端口号,找出web程序的进程ID(pid).
然后用top -p pid命令查看该web服务占用的内存和cpu
例子中使用的是Jetty的端口号,可以看到jetty服务占用cpu较少,占用内存为16%左右,而resin相对来说占用内存较多,为35%左右,所以Jetty相对resin来说更轻量级一些
3.完成深度思考
1. java的war包、jar包分别是什么?有什么区别
jar:即Java Archive,Java的包,Java程序编译好之后会生成许多class文件,如果直接发布这些class文件的话会很不方便,所以就把许多的class文件打包成一个jar,jar中除了class文件还可以包括一些资源和配置文件,比如maven就可以选择是否将源码也打到包里,通常一个jar包就是一个java程序或者一个java库。
war:Web application Archive,与jar基本相同,但它通常表示这是一个Java的Web应用程序的包,其中必须要包括WEB-INF,tomcat,jetty,resin等Servlet容器会认出war包并自动部署。
2. nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?
Nginx是一个轻量级高性能的HTTP和反向代理服务器,支持高并发和负载均衡.反向代理就是外网不直接访问内部服务器,而是先访问一个中间服务器,该中间服务器再去访问内部服务器,这种方式就叫反向代理,中间服务器就是反向代理服务器.使用这种方式的主要好处其一是安全,外部网络上的请求访问的是代理服务器,代理服务器上不负责存储资源,这样如果有攻击,代理服务器瘫痪,也不会影响到内部服务器上的资源.其二是代理服务器可以有效的掌控内部服务器的状态,可以灵活的根据内部服务器的状态调整负载均衡策略.
3. 什么是ssh?如何在linux服务器上从网站下载文件?
SSH 为 Secure Shell 的缩写,是建立在应用层基础上的安全协议,用于远程登录会话和其他网络服务提供安全性的协议。SSH协议比较可靠,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。所以我们一般用SSH来登陆远程服务器,它提供两种级别的安全验证,其中之一是基于口令的安全验证,即平时常用的,这种方式传输的数据会加密,但是不能保证和你交互的一定是你想链接的服务器,可能会有别的服务器冒充真正的服务器在和你交互.第二种级别是基于密匙的安全验证,你自己创建一对密匙,公用密匙放在服务器上,你用客户端链接服务器时需要验证密匙,使用这种方式更为安全,基本杜绝了”中间人”攻击的可能性.
在linux服务器上可以使用命令来下载文件,常用的下载文件命令有:
wget:支持后台下载,断点续传,递归下载等,是最常用的下载命令
prozilla:支持多线程下载和断点续传功能
myget:有界面的多线程下载工具
linuxdown:命令行多线程下载工具,最多可支持30线程的下载
curl:命令行下载工具,优点是小巧,高速,缺点是不支持多线程下载(调试时也会用到).
axel:命令行下载工具,支持多线程和断点续传.
4. 如何写shell脚本?尝试自己编写一个简单脚本。
首先用vim新建一个文件,然后在文件的第一行写上#!/bin/bash,/bin/bash是这个脚本使用的shell名称,可以根据自己需要写入.第二行以下就是用来说明整个程序的基本数据.除了第一行之外,其他的#都是用于注释.至于简单的脚本,已经在前面的日报中展示过.
5. tomcat、jetty、resin各容器有什么区别?如何优化这些容器配置?
Tomcat在处理少数非常繁忙的链接上更有优势,也就是说链接的生命周期如果比较短的话,Tomcat的总体性能更高.而Jetty刚好相反,Jetty可以同时处理大量连接而且可以长时间保持这些链接.比如聊天应用就非常适合做Jetty服务器.Jetty的架构比较简单,作为服务器可以按需加载组件,这样可以去掉不需要的组件,这样无形可以减少服务器本身的内存开销,所以性能会更好一些,另外,Jetty在处理静态资源时也比Tomcat更好一些.Resin和Tomcat相比,稳定性,性能都差不多,在linux环境下启动时tomcat相比resin更臃肿一些,resin只要一条命令就可以启动,停止,在开发环境中 tomcat可以根据需要配置是否修改后自动重启,resin则在更新class及jsp文件之后都会自动重新部署.而在生产环境下resin对热部署的支持更好一些.
总之,选择容器配置时要根据自己的需求选择,网站服务器的生产环境可以用resin,处理少数繁忙链接时可以使用tomcat,处理大量长时间链接时可以使用jetty.
二.明天的计划
如果任务审核通过,就开始任务四.
三.遇到的问题
暂无
四.收获
总结一下,感觉到这里基本上整个开发的流程都简单的体验了一遍,回顾几个任务,任务一是熟悉链接数据库的相关操作和框架,任务二是和web层的交互,任务三是项目上线之后需要关注的一些事情,中间还夹杂着单元测试,日志管理,接口测试,代码版本管理等等事务.老实讲,自己其实有很多地方都只是简单的达到任务要求而已,并没有很好的细抠细节,比如说DB的设计,Controller层中接口的设计,都非常粗糙,所以这也导致了我在查看日志时发现有时访问数据库的一个操作会达到1000ms,说明整个结构还是存在很多问题.正好借着任务四,将前面的内容再整体回顾一遍,多加入一些细节上的考量,巩固之前所学的知识.
ps:师兄,我今天就提交任务三了,师兄如果要查看任务结果可以在本地hosts文件中加入对域名的解析:
然后访问具体数据用该域名:http://www.hello1.com/a/student/list,相关代码也会放在GitHub上以及学院的svn上,如果说提示没有备案,师兄可以q我,我再改下配置就可以.
评论