测试小生 Li_Hugo 微博:http://weibo.com/lz2012bj

服务(scf)最常见的异常信息,以及解决办法

上一篇 / 下一篇  2015-02-11 14:27:31 / 个人分类:问题排查

马上春节假期,总算有点时间写点东西了。过去了一年总是跟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使用情况
  • top命令
  • 查看java进程占用内存情况

通过jmap输出的内容可以查看是否有内存"泄露"的问题,哪个实例占的资源多 jmap 还可以把整个进程的内存dump出来
jmap –histo12345> mem_dump
  • 查看gc情况:

jstat –gcutil pid 时间间隔(详细使用见附件)
jstat –gcutil123451000


3.文件打开情况(linux下所有东西都是文件)
  • lsof

例: lsof –p pid |wc –l 查看进程打开的文件数, 这条命令可以查看程序中是否有资源没有关闭如:socket file .... java服务中常用的httpclient很容易忘记关闭,通过该命令可以快速定位
lsof -p12345|wc -l


4.查看网络情况
  • netstat(详细使用见附件,这条命令很无敌)

例:查看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
  • tcpdump
#只显示来源和目的端口为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'
  • telnet
#抓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>
  • 1. 先telnet进去
telnet10.58.120.11026003
  • 2. 查看getInfo方法的执行情况:
time|grep getInfo
  • 3. 查看所有方法的执行情况:
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:
  • 4.查看服务并发数:
count

输出类似:
#all#738#all#877#all#930#all#956#all#936#all#893#all#949#all#962#all#873#all#822#all#907
  • 5. 退出
quit
  • 6.要想保存结果可以在telnet的时候把输出重定向到一个文件中

例:
telnet10.58.120.11026003> tmp


四.查看udp日志,scf容器对所有执行时间超过100ms的方法都做了udp日志该日志在 9.112上的 /app/udpserver/log 一天一个文件
  • 1. 查看执行时间超过1s的方法,以imc为例:
grep',imc'out.2012-02-08|grep'time: [0-9]\{4,\}'> imc_dump


五.shell管道功能前一个程序的输出做为后个程序的输入, awk,grep ...通过这些命令可以对结果进行各种各样的过虑,最终输出自己想看的东西


TAG:

 

评分:0

我来说两句

Open Toolbar