马上春节假期,总算有点时间写点东西了。过去了一年总是跟scf打交道,所以总结一下scf在测试过程中的问题。ps:scf实质是tcp协议的服务
1.在此强调一下出现问题,telnet检查自己服务的使用,最关键的就是检查你发送到服务端的数据是否正确,尤其是客户端调用别人的服务,即可不用服务提供者帮助查看。
telnet 192.168.1.1 26001 //ip为服务ip, 端口为服务端口最高位加1。
如,服务端口16001, 则telnet监测端口:16001 + 10000 = 26001
time|grep 127.0.0.1 //grep搜索的字符串即是下面字符串里的内容, 如,你搜索ip,搜索方法,也可以 time | grep abc | grep 127.0.0.1 //多重grep在新版scf中提供
结果:
time:2ms--key:InvokeRealService_NewsService.getNewsByCateID--description:protoco l version:1
fromIP:127.0.0.1
lookUP:NewsService
methodName:getNewsByCateID
params:
--key:int
--value:10
--key:String
--value:shenqi
SCF Service
1 找不到方法 localProxy is null (接口测试时候经常遇到)
如果遇到这种问题,请查看以下几点:
1、方法没有注解
2、方法名错了
3、传入参数错误
4、tcp://demo//NewService 这个URL是接接口实现类,而不是接口。
主要查看方式是:打开服务日志的debug权限,方法调用后,看打印出来的方法名,类名,参数是不是跟你预想的是一样的,有出入的,一般即为问题产生的原因。
2 scf Response过滤器中调用别的服务,返回数组越界错误
问题可能的原因:
配置文件中配置自己服务的过滤器覆盖了scf容器所需的过滤器
解决办法:
<property>
<name>scf.filter.global.response</name>
<value append ="true">自己的过滤器</value>
</property
*注:自己的过滤器切记不要忘记添加append="true"属性
3. SCF web项目中,实体类序列化问题,typeId错误
问题可能的原因:
项目放到tomcat下,实体类以.class形式存在,scf序列化实体类,只能正确解析jar包,而不能解析.class
解决方法:
请将没有提供scf服务的实体类,.class的文件类中的scf序列化注释去掉。 如果提供服务,请打包为jar包即可。
随着公司流量增大很多scf服务会出现问题,以下一些排查方式可以做为参考,虽然都是很简单的命令但当服务出问题的时候可以快速的定位(非scf服务也可以借鉴)
一.查看系统负载 cpu mem io load average ... 这些信息都可以通过 top, iostat, ifstat, jstat, xxstat... 命令来查看
二.查看服务进程情况
1.进程cpu占用情况:
- 按cpu占用率排序: ps Hh -eo pid,tid,pcpu |sort -nk3|tail
- 定位哪个线程占用cpu top -> shift + h 列出线程列表(这里看到的tid是10进制的)
- shift + t 按照time排序
- jstack pid(进程号) > 输出到文件
- 然后去找16进制的线程号
- jstack命令 jstack12345> jstack_dump
- pstree查看进程的所有线程 pstree12345
2.mem使用情况
通过jmap输出的内容可以查看是否有内存"泄露"的问题,哪个实例占的资源多 jmap 还可以把整个进程的内存dump出来
jmap –histo12345> mem_dump
jstat –gcutil pid 时间间隔(详细使用见附件)
jstat –gcutil123451000
3.文件打开情况(linux下所有东西都是文件)
例: lsof –p pid |wc –l 查看进程打开的文件数, 这条命令可以查看程序中是否有资源没有关闭如:socket file .... java服务中常用的httpclient很容易忘记关闭,通过该命令可以快速定位
lsof -p12345|wc -l
4.查看网络情况
例:查看16003端口的连接数:
netstat –na|grep16003|wc –l
列出所有连接16003的每个ip的连接数
netstat -an|grep16003|awk'{print $5}'|awk -F :'{print $4}'|sort|uniq -c
输出结果:
1*210.3.12.15410.3.12.203192.168.10.223192.168.10.233192.168.10.24
#只显示来源和目的端口为80的TCP分节
tcpdump'tcp and port 80'#只显示来源和目的端口为80,并且设置了SYN标志的TCP分节
tcpdump'tcp and port 80 and tcp[13:1] & 2 != 0'#只显示来源端口为7001~7005之间的TCP分节
tcpdump'tcp and tcp[0:2]>7000 and tcp[0:2]<=7005'
#抓http包
telnet10.58.120.11880> http_dump
GET /test/n_16170701962244.jpgHTTP/1.1Host: pic.58.comConnection: Keep-Alive
#scf状态**
#交互式
telnet10.58.120.11026003> 26003_dump
count
#管道式(echo -e"count";sleep10)|telnet10.58.120.11026003#通过linux的fd进行网络通讯
exec6<>/dev/tcp/10.58.120.110/26003#连接10.58.120.110:26003关联的fd=6echo -e"count">&6#写count
cat<&6#查看接收的结果
exec6>&- #关闭输入输出流
exec6<&-
三.scf服务提供的分析功能
*******************************************************************
count[|second num|method methodName]* show method call times in num seconds
* second : in num seconds statistics once(numdefault1)* method :forstatistics method
* example : count
* example : count|second3* example : count|second3|method getInfo
time|grep abc[|group num|column -tkda]* show method execute time
* grep : condition
* group : method called num times show statistics once
* column : show column a->all t->time k->key d->description
* example: time|grep getInfo
* example: time|grep getInfo|group10|column -tk
exec|top
|netstat -na
* exec command(at present only allow:top or netstat)* example: exec|top
control * useforcontrol scf-server
help * show help
quit * quit monitor
*******************************************************************
使用方式以imc为例,imc对外提供的**端口为26003,该端口可以通过查看 scf/service/deploy/服务名/scf_config.xml
<!-- telnet server listent port -->
<property>
<name>scf.server.telnet.listenPort</name>
<value>26003</value>
</property>
telnet10.58.120.11026003
time|grep getInfo
time|grep _
输出结果如下:
time:3ms--key:InvokeRealService_InfoProviderWithIndex.GetInfo--description:protocol version:1fromIP:/10.3.12.20:49545lookUP:InfoProviderWithIndex
methodName:GetInfo
params:
--key:Long[]--value:[Ljava.lang.Long;@40880562--key:String--value:*
--key:String--value:
--key:String--value:
count
输出类似:
#all#738#all#877#all#930#all#956#all#936#all#893#all#949#all#962#all#873#all#822#all#907
quit
- 6.要想保存结果可以在telnet的时候把输出重定向到一个文件中
例:
telnet10.58.120.11026003> tmp
四.查看udp日志,scf容器对所有执行时间超过100ms的方法都做了udp日志该日志在 9.112上的 /app/udpserver/log 一天一个文件
grep',imc'out.2012-02-08|grep'time: [0-9]\{4,\}'> imc_dump
五.shell管道功能前一个程序的输出做为后个程序的输入, awk,grep ...通过这些命令可以对结果进行各种各样的过虑,最终输出自己想看的东西