1. 日志类
1.1. 正常消息流程跟踪
MO消息匹配流程
3种消息类型:MO、MOSR、MO状态报告
2个匹配过程:
1)3与5,匹配点在网关,3发送的fwd包中Msg_id字段表示匹配ID,5接收的fwd包中msg_content字段中带有Msg_id字段,用于匹配,格式请参考点对点互通协议。
2)2与7,匹配点在SMSC,5流程中的MOSR的状态会在7流程中发送给SMSC,实现SMPP协议到点对点协议的互通,2发送的deliver_rsp包中message_id字段表示匹配ID,为十六进制,7发送的submit包中short_message字段带有id字段用于匹配,为十进制,格式“id:IIIIIIIIII sub:SSS dlvrd:DDD submit date: YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err: E Text:……”。
MT消息匹配流程
3种消息类型:MT、MTSR、MT状态报告
2个匹配过程:
1)4与5,匹配点在网关,4接收的submint_rsp包中message_id字段表示匹配ID,为十六进制,5接收的deliver包中short_message字段中带有id字段用于匹配,为十进制,格式请参考SMPP3.3或SMPP3.4协议。
2)1与7,匹配点在SMG,5流程中的MTSR的状态会在7流程中发送给SMG,实现点对点协议到SMPP协议的互通,1接收的fwd包中message_id字段表示匹配ID,7发送的fwd包中msg_content字段带有id字段,用于匹配,格式请参考点对点互通协议。
1.2. 流速统计
1.1.
常用流速统计脚本
#!/bin/awk -f
BEGIN{
FS=":";
mo=0; mosr=0; srmo=0; mt=0; mtsr=0; srmt=0;
date=""; hour_old=""; min_old="";second_old="";
print"----------------------------------------------------------------------------------------";
print "发送时间\t\t\tMO\tMOSR\tSRMO\tMT\tMTSR\tSRMT";
print"----------------------------------------------------------------------------------------";
}
{
if (NF < 2) next;
date=substr($1,2,10);
hour_new=substr($1,13,2);
min_new=substr($2,1,2);
second_new=substr($3,1,2);
if(hour_new==hour_old && min_new==min_old ) {
if($6~/接收MO成功/) mo+=1;
if($6~/发送MT成功/) mt+=1;
if($6~/接收MTSR成功/) mtsr+=1;
if($6~/发送SRMO成功/) srmo+=1;
}
else{
if (hour_old != "")print date""hour_old":"min_old":"second_old"\t\t"mo"\t"mosr"\t"srmo"\t"mt"\t"mtsr"\t"srmt;
hour_old=hour_new;min_old=min_new; second_old=second_new;
mo=0; mosr=0; srmo=0; mt=0;mtsr=0; srmt=0;
if(hour_new==hour_old&& min_new==min_old ) {
if($6~/接收MO成功/) mo+=1;
if($6~/发送MT成功/) mt+=1;
if($6~/接收MTSR成功/) mtsr+=1;
if($6~/发送SRMO成功/) srmo+=1;
}
}
}
END{
print date""hour_old":"min_old":"second_old"\t\t"mo"\t"mosr"\t"srmo"\t"mt"\t"mtsr"\t"srmt;
print "第一秒和最后一秒统计分析因记录不全,可能不准!"
}
统计某个网元的流速
grep 发送MT成功*SMSC*.log|grep 13000202443|grep 17:21:40 |wc -l
grep 接收MTSR成功*SMSC*.log|grep 13000202443|grep 17:21:40 |wc -l
这样就可以统计出该网元是否正常回复状态报告,多个核心模块都需要进行统计。
1.3. 积压量统计
1.2.
按网元组织队列
<2013/11/12 17:23:52:279707(1165900001)INFO>:|___________________________________
<2013/11/12 17:23:52:279721(1165900001)INFO>:| Total message in core: [0]
<2013/11/12 17:23:52:279736(1165900001)INFO>:| total msg in trashbox: [0]
<2013/11/12 17:23:52:279749(1165900001)INFO>:| total SR in M : [0]
<2013/11/12 17:23:52:279761(1165900001)INFO>:| mosr pending is: [0]
<2013/11/12 17:23:52:279780(1165900001)INFO>:| [MT] remain expired_idx: [0]
<2013/11/12 17:23:52:279797(1165900001)INFO>:| [MT] remain msgid_idx: [0]
<2013/11/12 17:23:52:279818(1165900001)INFO>:| [MO] remain expired_idx: [0]
<2013/11/12 17:23:52:279848(1165900001)INFO>:| [MO] remain msgid_idx: [0]
<2013/11/12 17:23:52:279893(11659 00001)INFO>:|[CACHE] total msg in cache [0]
<2013/11/12 17:23:52:279912(1165900001)INFO>:| [LOG]msg in logfile_pool: [55]
<2013/11/12 17:23:52:279925(1165900001)INFO>:|___________________________________
<2013/11/12 17:23:52:279941(1165900001)INFO>:| total msg in smsc(202442):MT[0],MOSR[0]
<2013/11/12 17:23:52:279960(1165900001)INFO>:| total msg in smsc(202443):MT[0],MOSR[0]
<2013/11/12 17:23:52:279974(1165900001)INFO>:| total msg in smsc(202441):MT[0],MOSR[0]
<2013/11/12 17:23:52:279988(1165900001)INFO>:| total msg in smsc(202412):MT[0],MOSR[0]
<2013/11/12 17:23:52:280003(1165900001)INFO>:| total msg in smsc(202421):MT[0],MOSR[0]
<2013/11/12 17:23:52:280021(1165900001)INFO>:| total msg in smsc(202411):MT[0],MOSR[0]
<2013/11/12 17:23:52:280036(1165900001)INFO>:| total msg in smsc(202431):MT[0],MOSR[0]
<2013/11/12 17:23:52:280051(1165900001)INFO>:| total msg in smsc(202413):MT[0],MOSR[0]
<2013/11/12 17:23:52:280067(1165900001)INFO>:| total msg in smsc(202422):MT[0],MOSR[0]
<2013/11/12 17:23:52:280086(1165900001)INFO>:| total msg in smsc(202423):MT[0],MOSR[0]
<2013/11/12 17:23:52:280101(1165900001)INFO>:| total msg in smsc(202432):MT[0],MOSR[0]
<2013/11/12 17:23:52:280116(1165900001)INFO>:| total msg in smsc(202433):MT[0],MOSR[0]
<2013/11/12 17:23:52:280135(1165900001)INFO>:| total msg in smg(002404):MO[0],MTSR[0]
<2013/11/12 17:23:52:280150(1165900001)INFO>:| total msg in SR(SR3):MO[0],MT[0],SR[0]
<2013/11/12 17:23:52:280165(1165900001)INFO>:| total msg in SR(SR1):MO[0],MT[0],SR[0]
<2013/11/12 17:23:52:280185(1165900001)INFO>:| total msg in SR(SR2):MO[0],MT[0],SR[0]
<2013/11/12 17:23:52:280199(1165900001)INFO>:|___________________________________
采用按网元组织队列结构能够清楚的发现哪个外部网元异常。
按消息类型组织队列
<2013/11/12 16:46:50:327658(15175:47260371758816)INFO>:[采集]:___________________________________
<2013/11/1216:47:20:327529(15175:47260371758816)INFO>: [采集]:(M01)MO[1880],MT[0],SR[0],TOTAL[1880]
<2013/11/1216:47:20:327600(15175:47260371758816)INFO>: [采集]:MO[0]
<2013/11/1216:47:20:327704(15175:47260371758816)INFO>: [采集]:SMG(1)(104301)MO[0],MTSR[0],SEND[0],RECV[0]
<2013/11/1216:47:20:327766(15175:47260371758816)INFO>: [采集]:MT[0]
<2013/11/1216:47:20:327831(15175:47260371758816)INFO>: [采集]:SMSC(1)(13800871500)MT[0],MOSR[0],SEND[0],RECV[0]
<2013/11/1216:47:20:327890(15175:47260371758816)INFO>: [采集]:SMSC(2)(13800871501)MT[0],MOSR[0],SEND[0],RECV[0]
<2013/11/1216:47:20:327981(15175:47260371758816)INFO>: [采集]:SMM(1)MO[0],MT[0],SEND[0]
<2013/11/1216:47:20:328088(15175:47260371758816)INFO>: [采集]:CR(1)MO[1880],MT[0],SR[0],SEND[0]
<2013/11/1216:47:20:328150(15175:47260371758816)INFO>: [采集]:TRASH[0],RETRANS[0],CACHE[0],LOGFILE[0]
<2013/11/1216:47:20:328212(15175:47260371758816)INFO>: [采集]:RRULE(0) [0]
<2013/11/1216:47:20:328267(15175:47260371758816)INFO>: [采集]:RRULE(1) [0]
<2013/11/1216:47:20:328333(15175:47260371758816)INFO>: [采集]:RRULE(99) [0]
<2013/11/1216:47:20:328386(15175:47260371758816)INFO>: [采集]:___________________________________
采用按消息类型组织队列具有明显优势,所有同类型外部网元共享队列,只要有一个网元正常就不会造成消息积压。
1.4. 单模块性能不足问题
由于现网模块部署在各种不同平台下,春节期间经常会出现T2000的机器上出现消息积压,而HP刀片上运行正常,
此时,最简单的处理方法是减少T2000平台的对外连接,可以通过动态更新指定模块功能实现。
2. 脚本类
1.
2.
2.1. .cshrc脚本解析
set filec #添加该定义后可以按“esc”键补全文件名
setenv EDITOR vi #定义crontab编辑器
setenv TIMEZONE 'CST' #定义时区
setenv LANG 'zh' #定义本地语言
setenv LC_ALL 'zh' #定义本地语言,它们之间优先级的关系:LC_ALL > LC_* >LANG
setenv NLS_LANG 'Simplified Chinese' #以下3项为数据库入库编码方式
setenv NLS_CHARACTERSET 'ZHS16CGB231280'
setenv NLS_NCHAR_CHARACTERSET 'ZHS16CGB231280'
setenv MIBS ALL #snmp库告警用
set path = ( /usr/bin /usr/local/bin/usr/sfw/bin ) #sparc+Solaris
set path = ( /usr/sfw/bin /usr/bin /usr/local/bin) #x86+Solaris,x86平台下需要用usr/sfw/bin下面的软件
另外,项目相关的环境变量,建议以PROJECT为根进行设置
2.2. .bashrc脚本解析
export TERM='linux' #定义终端类型,可以带颜色
export EDITOR='vim' #定义crontab编辑器
export TIMEZONE='CST' #定义时区
export LANG='zh_CN.GB2312' #定义本地语言
export LC_ALL='zh_CN.GB2312' #定义本地语言,它们之间优先级的关系:LC_ALL> LC_* >LANG
export NLS_LANG='Simplified Chinese' #以下3项为数据库入库编码方式
export NLS_CHARACTERSET='ZHS16CGB231280'
exportNLS_NCHAR_CHARACTERSET='ZHS16CGB231280'
export MIBS=ALL #snmp库告警用
另外,项目相关的环境变量,建议以PROJECT为根进行设置
2.3. crontab定时任务
crontab命令格式:M H D m d cmd(分 时 日 月 周 命令)
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)
crontab file [-u user]-用指定的文件替代目前的crontab.
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录.
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpdrestart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * */usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpdrestart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * */usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpdrestart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpdrestart
每一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpdrestart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed/usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpdrestart
一月一号的4点重启apache
2.4. FTP上传话单标准做法
作用:以临时文件方式上传文件,完毕后改回原名
缺点:当网络异常时,可能会造成文件丢失
#!/bin/bash
IP=10.10.18.8
USER=com30
PASSWD=com30
myftp(){
ftp-n $IP <<END_SCRIPT
quoteUSER $USER
quotePASS $PASSWD
cd./nm
bin
put$1 $2
rename$2 $1
quit
END_SCRIPT
echo"ftp" $1 $2>> ftp.log
}
file_list=`find . -name "*.CDR"-type f |sort`
for file in $file_list
do
if[ "${file##*.}" = "CDR" ]
then
tmp_file=${file/%"CDR"/"tmp"}
myftp$file $tmp_file
mv$file ../boss
fi
done
exit 0
2.5. 批量修改文件内容
作用:用于批量修改目录下所有文件中指定的内容
#!/bin/bash
file_list=`find $1 -name "*.c" -typef `
for fn in $file_list
do
ffnt="$fn.temp"
echo "Processing $fn ...... "
sed "s/$2/$3/g" $fn > $ffnt
mv -f $ffnt $fn
done
2.6. 批量删除SHM共享内存
作用:由于ipcrm命令不支持多个一起删除功能,需要用脚本实现
ipcs -m|grep $USER|awk '{print $2}'|xargs-t -I{} ipcrm -m {}
2.7. 输出2个文本文件中相同的行
作用:用于比较乱序的话单文件
#/bin/awk
awk -F, 'NR==FNR{a[$0]==$0} NR!=FNR{if($0 in a){print}}' file1 file2
3. 网络连接类
1.
2.
3.
3.1. 网络带宽计算方法
TCP包头:54字节
MO/MT消息包+确认包:313字节+54字节=367字节
应答包+确认包:23字节+54字节=77字节
MO/MT状态报告包+确认包:233字节+54字节=287字节
2.
3.
3.1.
专线带宽理论最大计算方法
假设:峰值时MO和MT各一半
OUT:(峰值/2)*(367+54+ 77+54 + 77+54 + 287+54)*8/1024/1024
IN :(峰值/2)*(77+54+ 287+54 + 367+54 + 77+54)*8/1024/1024
总结:1000条/秒需要4M专线
专线带宽理论最小计算方法
假设:
(1)所有的确认包都与后续消息包合并
(2)消息内容字段采用最大值140字节的中间值70
计算如下:
OUT:(峰值/2)*(367 +77 + 77+ 287 - 70)*8/1024/1024
IN :(峰值/2)*(77 +287 + 367 + 77 - 70)*8/1024/1024
总结:1000条/秒需要2.8M带宽
注:
(1)现网普遍带宽部署要比理论小是因为:
a)消息包中内容字段按140字节计算,实际值会小一些,但是不太多。
b)1.b确认包可以与1.c消息包合并,但是是否合并由操作系统根据发包速度决定,计算带宽时最好分开计算。
(2)TCP包头大小并非固定54字节,有的设备包含校验码就会大一些,例如河南网关TCP包头为66字节。
(3)总结:500条/秒 < 2M专线最大消息速度 < 714条/秒
3.2. Solaris系统下采用snoop抓包
文本命令格式:snoop -ta -x54 [hostip地址] and [port 端口号]
二进制命令格式:snoop -ta -x54 [hostip地址] and [port 端口号] -o snoop.cap
注:一般情况下链路层14字节,IP层20字节,TCP层20字节,所以snoop抓包时偏移54字节不输出TCP头部,
但是有的省份TCP层包含校验码长度可能会较多,例如河南TCP层就是32字节,
另外,Solaris与Linux系统间通信是偏移量也是66字节。
当然也可以采用全部显示的方式:snoop -ta -x0 [hostip地址] and [port 端口号]
3.1.
3.2.
Solaris与Solaris通信
10:35:57.85118 Intel-01 -> 10.10.125.94 TCP D=40883S=7214 Push Ack=1088642243 Seq=3083418559 Len=67 Win=49640
0: 0000 0043 0000 0005 0000 0000 0000 0015 ...C............
16: 0000 0031 3332 3132 3334 3030 3030 0000 ...13212340000..
32: 0031 3338 3030 3030 3132 3334 0000 0001 .13800001234....
48: 0000 0000 0800 0c65 e06c d562 535f 0096 .......e.l.bS_..
64: 1f52 17 .R.
以上为应用层内容,本例中是SMPP协议包。
Solaris与Linux通信
10:32:30.82028 Intel-01 -> 10.10.126.182 TCP D=11069S=7208 Push Ack=108675516 Seq=3022344739 Len=73 Win=49232 Options=<nop,nop,tstamp225335803 939347037>
0: 0101 080a 0d6e 59fb 37fd 4c5d 00000049 .....nY.7.L]...I
16: 0000 0005 0000 0000 0000 0059 0000 0031 ...........Y...1
32: 3337 3132 3334 3030 3836 0000 0031 3331 3712340086...131
48: 3030 3030 3132 3334 0000 0001 0000 0000 00001234........
64: 0800 1265 e06c d562 535f 0000 4300 4400 ...e.l.bS_..C.D.
80: 5296 1f52 17 R..R.
红色12个字节多余
3.3. Linux系统下采用tcpdump抓包
文本命令格式:tcpdump [host ip地址] and [port端口] -X -s 0
二进制命令格式:tcpdump [host ip地址] and [port端口] -X -s 0 -w tcpdum.cap
注:抓本机回环地址的包可以用:tcpdump -i lo port 端口 -X -s0
10:18:30.496739 IP 10.10.125.92.gyang-m-smsc> com182.com.28713: P 2679151877:2679151950(73) ack 2922530279 win 49232<nop,nop,timestamp 225191773 937906636>
0x0000: 4500 007d 7887 4000 3f06b2cd 0a0a 7d5c E..}x.@.?.....}\
0x0010: 0a0a 7eb6 1c28 7029 9fb09d05 ae32 45e7 ..~..(p).....2E.
0x0020: 8018 c050 fe10 0000 0101 080a 0d6c 275d ...P.........l']
0x0030: 37e7 51cc 0000 0049 00000005 0000 0000 7.Q....I........
0x0040: 0000 001c 0000 0031 33373132 3334 3030 .......137123400
0x0050: 3836 0000 0031 3331 30303030 3132 3334 86...13100001234
0x0060: 0000 0001 0000 0000 08001265 e06c d562 ...........e.l.b
0x0070: 535f 0000 4300 4400 52961f52 17 S_..C.D.R..R.
3.4. 网络丢包典型案例
一般情况下判断网络问题可以用ping命令定期发送大包测试丢包率,
也可以通过网络抓包提供更直接有利的证据。
9:37:19.93979 211.90.83.254 ->SXTY-PS-ISMG-SV-LTAPP01 TCP D=28122 S=52951 Push Ack=976503152 Seq=2220767726Len=313 Win=65535
0: 0000 0139 0000 0009 0e8b e9de 3130 3335 ...9.....?.1035
16: 3131 3033 3531 3032 0100 3fcb c901 fbd1 11035102..?.....
32: ea7a 0101 0100 0000 0000 0000 0000 0000 .z..............
48: 0100 0000 0000 0000 0000 0000 0000 0000 ................
64: 0000 0000 0000 0000 0800 0000 0000 0030 ...............0
80: 3200 0000 0000 0000 0000 00000000 0000 2...............
96: 0000 0000 0000 0000 0000 0000 0000 0000 ................
112: 0000 0000 0000 0000 0038 3631 3330 3830 .........8613080
128: 3334 3930 3935 0000 0000 0000 0000 0138 349095.........8
144: 3631 3532 3334 3434 3334 3134 0000 0000 615234443414....
160: 0000 0000 8c00 3467 0800 3100 3900 2d00 ....?4g..1.9.-.
176: 2d00 3200 3165 e54e cb4f 115f 2051 7065 -.2.1e.N.O._ Qpe
192: b065 e575 3552 a88f 6665 b06b 3e5c5579 .e.u5R?fe.k>\Uy
208: 3a66 a84e e565 e763 6265 b096 8691 cd54 :f∟.e.cbe.....T
224: 2f52 a830 0267 004f 4e63 628d 2d4e f700 /R?.g.ONcb.-N..
240: 3900 3800 3900 2c65 e764 6962 5875 3552 9.8.9.,e.dibXu5R
256: a862 9800 3100 3000 3000 3065 e75b b675 ╞..1.0.0.0e.[.u
272: 3562 4b67 3a62 9800 3600 3000 3030 0257 5bKg:b..6.0.00.W
288: 3057 405f 2051 7053 9f90 ae65 3f5c 4065 0W@_ QpS...e?\@e
304: c100 0000 0000 0000 00 .........
9:37:19.94052 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 Push Ack=2220768039 Seq=976503152 Len=23Win=49640
0: 0000 0017 8000 0009 0e8b e9de 3fcb c901 .........?.?...
16: fbd1 ea7a 0101 00 ...z...
9:37:20.02117 211.90.83.254 ->SXTY-PS-ISMG-SV-LTAPP01 TCP D=28122 S=52951 Push Ack=976503175 Seq=2220768039Len=233 Win=65535
0: 0000 00e9 0000 0009 0e8b 9061 3130 3335 .........?a1035
16: 3131 3033 3531 3032 0102 3fcb c901 fc03 11035102..?.....
32: ea83 0101 0100 0000 0000 0000 0000 0000 ................
48: 0100 0000 0000 0000 0000 0000 0000 0000 ................
64: 0000 0000 0000 0000 0000 0000 00000030 ...............0
80: 3200 0000 0000 0000 0000 0000 0000 0000 2...............
96: 0000 0000 0000 0000 0000 0000 0000 0000 ................
112: 0000 0000 0000 0000 0031 3535 3336 3032 .........1553602
128: 3237 3738 0000 0000 0000 0000 0000 0131 2778...........1
144: 3532 3334 3036 3631 3539 0000 0000 0000 5234066159......
160: 0000 0000 3c49 2654 0012 c00f c044 454c ....<I&T.....DEL
176: 4956 5244 3133 3034 3138 3039 3337 3133 IVRD130418093713
192: 3034 3138 3039 3337 3135 3533 3630 3232 0418093715536022
208: 3737 3800 0000 0000 0000 0000 0000 9b07 778...........?
224: ea00 0000 0000 0000 00 .........
9:37:20.02162 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 Push Ack=2220768272 Seq=976503175Len=23 Win=49640
0: 0000 0017 8000 0009 0e8b 9061 3fcb c901 .........?a?...
16: fc03 ea83 0101 00 .......
9:37:20.03821 211.90.83.254 ->SXTY-PS-ISMG-SV-LTAPP01 TCP D=28122 S=52951 Ack=976503175 Seq=2220768272 Len=1460 Win=65535
0: 0000 0123 0000 0009 0e8a 9283 3130 3335 ...#........1035
16: 3131 3033 3531 3032 0100 3fcb c901 fbd1 11035102..?.....
32: ea8c 0101 0100 0000 0000 0000 0000 0000 .?.............
48: 0100 0000 0000 0000 0000 0000 0000 0000 ................
64: 0000 0000 0000 0040 f500 0000 0000 0030 .......@.......0
省略….
1392: 0000 0001 2300 0000 090e 8bf9 0931 3033 ....#.....?.103
//这条消息是不完整的,后面没有继续
1408: 3531 3130 3335 3130 3201 003f cbc9 01fb 511035102..?....
1424: d1ea ba01 0101 0000 0000 0000 0000 0000 ................
1440: 0001 0000 0000 0000 0000 0000 0000 0000 ................
1456: 0000 0000 ....
9:37:20.05827 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 Ack=2220769732 Seq=976503198Len=0 Win=48180
9:37:20.36149 211.90.83.254 ->SXTY-PS-ISMG-SV-LTAPP01 TCP D=28122 S=52951 Ack=976503198 Seq=2220770434 Len=1460 Win=65535
//发送端丢包,没有继续使用seq=2220769732,中间丢了702个字节
0: 0000 012d 0000 0009 0e8b 860b 3130 3335 ...-.....?.1035
16: 3131 3033 3531 3032 0100 3fcb c901 fbd1 11035102..?.....
32: ead5 0101 0100 0000 0000 0000 0000 0000 ................
48: 0100 0000 0000 0000 0000 0000 0000 0000 ................
64: 0000 0000 0000 0040 f500 0000 0000 0030 .......@.......0
80: 3200 0000 0000 0000 0000 0000 0000 0000 2...............
96: 0000 0000 0000 0000 0000 0000 0000 0000 ................
省略...
1296: 0000 0000 e900 0000 090e 8c0d 1931 3033 ..........?.103
1312: 3531 3130 3335 3130 3201 023f cbc9 01fc 511035102..?....
1328: 03eb 0201 0101 0000 0000 0000 0000 0000 ................
1344: 0001 0000 0000 0000 0000 0000 0000 0000 ................
1360: 0000 0000 0000 0000 0000 0000 0000 0000 ................
1376: 3032 0000 0000 0000 0000 0000 0000 0000 02..............
1392: 0000 0000 0000 0000 0000 0000 0000 0000 ................
1408: 0000 0000 0000 0000 0000 3133 3239 3337 ..........132937
1424: 3638 3938 3100 0000 0000 0000 0000 0001 68981...........
1440: 3133 3735 3336 3338 3230 3700 0000 0000 13753638207.....
1456: 0000 0000 ....
9:37:20.36156 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 Push Ack=2220769732Seq=976503198 Len=115 Win=49640
//网关一直在等待2220769732后续的包
0: 0000 0017 8000 0009 0e8a 9283 3fcb c901 ............?...
16: fbd1 ea8c 0101 0000 0000 1780 0000 090e ...?...........
32: 8be4 913f cbc9 01fb d1ea 9501 0100 0000 ?.?............
48: 0017 8000 0009 0e8b f810 3fcb c901 fbd1 .......?.?.....
64: eaa0 0101 0000 0000 1780 0000 090e 8bda .?...........?
80: e13f cbc9 01fb d1ea 9e01 0100 0000 0017 .?......?......
96: 8000 0009 0e8b eca4 3fcb c901 fbd1 eab1 .....嬱?.......
112: 0101 00 ...
9:37:20.36160 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 Ack=2220769732Seq=976503313 Len=0 Win=49640
//网关一直在等待2220769732后续的包
9:37:20.56903 211.90.83.254 ->SXTY-PS-ISMG-SV-LTAPP01 TCP D=28122 S=52951 Push Ack=976503313 Seq=2220771894Len=881 Win=65535
0: 003c 4926 5380 12c0 1791 4445 4c49 5652 .<I&S.....DELIVR
16: 4431 3330 3431 3830 3933 3731 3330 3431 D130418093713041
32: 3830 3933 3731 3332 3933 3736 3839 3831 8093713293768981
48: 0000 0000 0000 0000 0000 0047 ef5d 0000 ...........G.]..
64: 0000 0000 0000 0000 00e9 0000 0009 0e8b ...............?
80: 91df 3130 3335 3131 3033 3531 3032 0102 ..103511035102..
省略....
9:37:20.56908 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 Ack=2220769732Seq=976503313 Len=0 Win=49640
//网关一直在等待2220769732后续的包
9:37:25.12164 SXTY-PS-ISMG-SV-LTAPP01 ->211.90.83.254 TCP D=52951 S=28122 RstSeq=976503313 Len=0 Win=49640
//5秒超时后断开连接
注:判断哪一方先断连的依据是谁发送的Fin包或Rst包。
3.5. 网络监听重要工具netstat
常用命令:
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
[comm1@com182 bin]$ netstat -a
Active Internet connections (servers andestablished)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0localhost.localdomain:2208 *:* LISTEN
tcp 0 0 *:dlip *:* LISTEN
tcp 0 0 *:nfs *:* LISTEN
tcp 0 0 *:834 *:* LISTEN
tcp 0 0 *:gyang-smg *:* LISTEN
[comm1@com182 bin]$ netstat -an
Active Internet connections (servers andestablished)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:7201 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:834 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:7203 0.0.0.0:* LISTEN
[comm1@com182 bin]$ netstat -anp
(Not all processes could be identified,non-owned process info
willnot be shown, you would have to be root to see it all.)
Active Internet connections (servers andestablished)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:7201 0.0.0.0:* LISTEN 31158/com
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:834 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:7203 0.0.0.0:* LISTEN 31171/com
LN-HTSMG-APP6<comm1>1:netstat -rn
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- ------------------------- ----- ---------- ---------
default 10.34.29.129 UG 1 45869
10.34.29.128 10.34.29.155 U 1 5515387 bge0
10.34.29.128 10.34.29.155 U 1 0 bge0:1
10.34.29.128 10.34.29.155 U 1 29745 bge1
10.64.79.25 10.34.29.134 UGH 1 40
10.66.254.128 10.34.29.134 UG 1 0
10.77.9.10 10.34.29.134 UGH 1 66
10.77.9.30 10.34.29.134 UGH 1 86
10.77.9.50 10.34.29.134 UGH 1 47
10.77.9.70 10.34.29.134 UGH 1 38
192.168.250.1 192.168.250.2 UH 1 1 sppp0
127.0.0.1 127.0.0.1 UH 3 81466 lo0
其中,
U 该路由可以使用
G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地址是直接相连的。
H 该路由是到一个主机。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:网络号,或者网络号与子网号的组合。
4. 进程管理类
3.
4.
4.1. Make编译程序
Make程序的版本必须是GNU Make 3.81
高版本的Make与目前的核心程序不兼容
t2000-2<g-yang>:make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source forcopying conditions.
There is NO warranty; not even forMERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built forsparc-sun-solaris2.10
4.2. Gdb调试
常用的gdb命令:
backtrace(bt) 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint(b) 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue(c) 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list(l) 列出相应于正在执行的程序的原文件内容
next(n) 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable给变量赋值
signal 将一个信号发送到正在运行的进程
step(s) 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until(u) 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型
1.
2.
3.
4.
4.1.
4.2.
多线程进程调试
[comm1@com182 bin]$ pstree -p 22147
com(22147)-+-com(22149)---{com}(22157)
|-com(22150)-+-{com}(22159)
| |-{com}(22160)
| |-{com}(22161)
| |-{com}(22165)
| `-{com}(22166)
|-com(22151)
|-com(22152)
|-com(22153)
|-com(22154)---{com}(22167)
|-com(22155)
|-com(22156)
|-com(22158)
|-com(22162)-+-{com}(22186)
| |-{com}(22188)
| |-{com}(22189)
[comm1@com182 bin]$gdb com 22162
GNU gdb (GDB) Red Hat Enterprise Linux(7.0.1-32.el5)
Copyright (C) 2009 Free SoftwareFoundation, Inc.
License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>
This is free software: you are free tochange and redistribute it.
There is NO WARRANTY, to the extentpermitted by law. Type "showcopying"
and "show warranty" for details.
This GDB was configured as"x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) info thread
5Thread 0x4f01d940 (LWP 22208) 0x0000003f3d60e1c1 in nanosleep () from /lib64/libpthread.so.0
4Thread 0x4fa1e940 (LWP 22209) 0x0000003f3d60e1c1 in nanosleep () from /lib64/libpthread.so.0
3Thread 0x5041f940 (LWP 22210) 0x0000003f3d60e1c1 in nanosleep () from /lib64/libpthread.so.0
2Thread 0x50e20940 (LWP 22211) 0x0000003f3ca9a541 in nanosleep () from /lib64/libc.so.6
* 1 Thread 0x2b221f846ee0 (LWP 22162) 0x0000003f3cacb2e6 in poll () from/lib64/libc.so.6
(gdb) t 1
[Switching to thread 1 (Thread0x2b221f846ee0 (LWP 22162))]#0 0x0000003f3cacb2e6 in poll () from /lib64/libc.so.6
(gdb) bt
#0 0x0000003f3cacb2e6 in poll () from /lib64/libc.so.6
#1 0x0000000000477c80 in accessor_run (pipefd=17) at accessor.c:209
#2 0x00000000004777c5 in accessor_main (pm=0x1d607050, pipefd=17) ataccessor.c:114
#3 0x00000000004a8d40 in core_server_module_startup (cs=0x7fff4ada5490,pchld=0x1d607730, sock=17) at dpl_core_server.c:82
#4 0x00000000004a8e21 in dpl_core_server_startup (cs=0x7fff4ada5490) atdpl_core_server.c:122
#5 0x00000000004a8e6c in dpl_core_server_run (cs=0x7fff4ada5490,timeout=-1) at dpl_core_server.c:140
#6 0x0000000000430380 in mp_run (mode=0) at mp_main.c:127
#7 0x00000000004302b6 in main (argc=1, argv=0x7fff4ada56b8) atmp_main.c:102
(gdb)f 1
Linux系统下跟踪子进程
有些程序启动后直接进入守护进程模式,此时若需要跟踪子进程的运行情况可以使用set follow-fork-mode child
[comm1@com182 bin]$ gdb cms-1.3.2
GNU gdb (GDB) Red Hat Enterprise Linux(7.0.1-32.el5)
Copyright (C) 2009 Free SoftwareFoundation, Inc.
License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>
This is free software: you are free tochange and redistribute it.
There is NO WARRANTY, to the extentpermitted by law. Type "showcopying"
and "show warranty" for details.
This GDB was configured as"x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/comm1/com3.0/cms/cms-1.3/bin/cms-1.3.2...done.
(gdb) b read_cfg_and_init
Breakpoint 1 at 0x423094: file cms_init.c,line 100.
(gdb) setfollow-fork-mode child
(gdb) r
Starting program: /home/comm1/com3.0/cms/cms-1.3/bin/cms-1.3.2
warning: no loadable sections found inadded symbol-file system-supplied DSO at 0x2aaaaaaab000
[Thread debugging using libthread_dbenabled]
_______________________________________________________
| |
| NEU Common Message-processing System |
| (Ver 1.3) |
| |
| Copyright (c) NEU CommTech Co., Ltd. 2005-2006 |
| AllRights Reserved. |
|_______________________________________________________|
请等待...
系统运行 HOME 路径: [/home/comm1/com3.0/cms/com20_bd_1.3]
[New process 24540]
[Thread debugging using libthread_dbenabled]
[New process 24541]
系统转为后台运行, 进程号[24541].
[Thread debugging using libthread_dbenabled]
[Switching to Thread 0x2aaaac3edcb0 (LWP24541)]
Breakpoint 1, read_cfg_and_init () atcms_init.c:100
100 struct dirent *dirp = NULL;
函数调用栈中errno覆盖问题
由于errno属于单线程内的静态变量,该变量应该以当前栈顶值f 0的设置为准,在其他栈中打印errno变量的值是无效的。
(gdb) bt
#0 0x0000003eff4cb2e6 in poll () from /lib64/libc.so.6
#1 0x00000000004b6d8a in dpl_milli_poll ()
#2 0x00000000004b25a3 in wait_for_io_or_timeout ()
#3 0x00000000004b2790 in dpl_socket_send ()
#4 0x00000000004ab3c2 in dpl_reactor_notify ()
#5 0x000000000047ed58 in handle_msg_module ()
#6 0x0000003effc0673d in start_thread () from /lib64/libpthread.so.0
#7 0x0000003eff4d40cd in clone () from /lib64/libc.so.6
(gdb) f 3
#3 0x00000000004b2790 in dpl_socket_send (socket=17, buf=0x427d409b <incomplete sequence \321>,len=0x427d4090, timeout=-1)
at dpl_socket.c:254
254 arv =wait_for_io_or_timeout(socket, 0, timeout);
(gdb) l
229 dpl_status_t dpl_socket_send(dpl_socket_t socket, const char *buf, \
230 dpl_size_t*len, dpl_second_t timeout)
231 {
232 int rv=0;
233 dpl_status_t arv;
234
235 do {
236 errno = 0;
237 rv = send(socket, buf,(*len), 0);
238 } while (rv == -1 && errno== EINTR);
239
240 if(rv > 0){
241 (*len) = rv;
242 return DPL_SUCCESS;
243 }
244 else if(!rv){
245 (*len) = 0;
246 return DPL_EOF;
247 }else{
248 if(errno != EAGAIN){
249 (*len) = 0;
250 return errno;
251 }
252 }
253
(gdb) p rv
$6 = -1
(gdb) p errno
$2 = 4
查看socket接收缓冲区当前缓存字节数
(gdb) p ioctl(4, 0x541B,&numbytes)
$1 =0
(gdb) p numbytes
$2 =46
(gdb) p ioctl(4, 0x541B,&numbytes)
$3 =0
(gdb) p numbytes
$4 =57
(gdb) p ioctl(4, 0x541B,&numbytes)
$5 =0
(gdb) p numbytes
$6 =69
(gdb) p ioctl(4, 0x541B,&numbytes)
$7 =0
(gdb)p numbytes
$8 =120
其中,
4是需要读取的文件描述符,
0x541B是固定参数,#defineFIONREAD 0x541B
numbytes是当前上下文的临时变量。
4.3. 进程管理
对于处在阻塞状态或无法恢复状态的进程,可以采用暴力手段将其杀掉,前提是阻塞时不能占用共享锁。
由于子进程一般忽略TERM信号,所以采用kill pid的方式不起作用,需要用kill -9 pid
4.3.
4.4.
Solaris进程管理
pstop 停止进程
prun pid 重新启动进程
ptime pid 使用微状态计算进程时间
pwait pid 等待指定的进程终止
pcred pid 显示可信度
pfiles pid 显示已打开文件的
fstat和fcntl 信息
pflags pid 显示每个lwp的/proc跟踪标志,等待和持有信号量以及其他状态信息
pldd pid 显示链接到每个进程的动态链接库
pmap pid 显示地址映射空间
psig pid 显示信号操作
pstack pid 显示每个lwp的十六进制与符号堆跟踪
ptree pid 显示包含指定PID的进程树
pwdx oid 显示当前工作目录
Solaris查看进程打开描述符
bash-3.00$ pfiles 23926
23926: com
Current rlimit: 256 file descriptors
0:S_IFCHR mode:0666 dev:284,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_RDWR|O_LARGEFILE
/devices/pseudo/mm@0:null
1:S_IFCHR mode:0666 dev:284,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_RDWR|O_LARGEFILE
/devices/pseudo/mm@0:null
2:S_IFCHR mode:0666 dev:284,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_RDWR|O_LARGEFILE
/devices/pseudo/mm@0:null
3:S_IFREG mode:0644 dev:30,199 ino:1311017 uid:122 gid:1 size:5
O_WRONLY|O_CREAT|O_LARGEFILE
advisory write lock set by process 23890
/export/home2/g-yang/com2.5.4/com/locks/com20.lock
4:S_IFREG mode:0644 dev:30,199 ino:1212071 uid:122 gid:1 size:3551388
O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
/export/home2/g-yang/com2.5.4/com/m-fifo/m-lost.log
5:S_IFSOCK mode:0666 dev:291,0 ino:59033 uid:0 gid:0 size:0
O_RDWR
SOCK_STREAM
SO_SNDBUF(16384),SO_RCVBUF(5120)
sockname: AF_UNIX
6:S_IFSOCK mode:0666 dev:291,0 ino:59178 uid:0 gid:0 size:0
O_RDWR|O_NONBLOCK
SOCK_STREAM
SO_SNDBUF(16384),SO_RCVBUF(5120)
sockname: AF_UNIX
7:S_IFSOCK mode:0666 dev:291,0 ino:44609 uid:0 gid:0 size:0
O_RDWR
SOCK_STREAM
SO_SNDBUF(49152),SO_RCVBUF(49152),IP_NEXTHOP(0.192.0.0)
sockname: AF_INET 10.10.125.92 port: 33675
peername: AF_INET 10.10.125.92 port: 7208
Solaris下查看端口占用进程
Linux系统下可以简单的用lsof -i:port,Solaris系统下如果没有安装lsof,可以安装下面命令获取。
-bash-3.00# cd /proc
-bash-3.00# for i in *
> do
> echo ------ process $i ---------
> pfiles $i | grep -i "port:28123"
> done
process 18325
peername: AF_INET 10.87.172.62 port: 51242
process 24243
peername: AF_INET 10.87.172.62 port: 50563
process 24244
peername: AF_INET 10.87.172.62 port: 50565
process 24602
peername: AF_INET 10.87.172.62 port: 50582
process 25506
peername: AF_INET 10.87.172.62 port: 51312
process 2743
peername: AF_INET 10.87.172.62 port: 32861
HN-M5-LT<comm5>:netstat -an|grep10.87.172.62
10.87.172.56.28123 10.87.172.62.32861 49640 0 49640 41 ESTABLISHED
10.87.172.56.28124 10.87.172.62.51242 49640 0 49640 0 ESTABLISHED
10.87.172.56.28123 10.87.172.62.51312 49640 0 49640 41 ESTABLISHED
10.87.172.56.28123 10.87.172.62.50563 49640 0 49640 0 ESTABLISHED
10.87.172.56.28123 10.87.172.62.50565 49640 0 49640 0 ESTABLISHED
10.87.172.56.28123 10.87.172.62.50582 49640 0 49640 0 CLOSE_WAIT
也可以通过IP查看
pfiles $i | grep -i "peername: AF_INET10.87.172.62"
Linux进程管理
lsof语法格式是: lsof [options] filename
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46][protocol][@hostname|hostaddr][:service|port]
46 -> IPv4 or IPv6
protocol -> TCP or UDP
hostname -> Internet host name
hostaddr -> IPv4地址
service -> /etc/service中的 servicename (可以不只一个)
port -> 端口号 (可以不只一个)
1) lsof test.txt 显示开启文件test.txt的进程
2) lsof -i :80 显示80端口现在运行什么程序
3) lsof -c httpd 显示httpd进程现在打开的文件
4) lsof -g gid 显示归属gid的进程情况
5) lsof +d /usr/local/ 显示/usr/local目录下被进程开启的文件
6) lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
7) lsof -d 4 显示使用fd为4的进程
lsof -i [i] 用以显示符合条件的进程情况
语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 -> IPv4 or IPv6
protocol -> TCP or UDP
hostname -> Internet host name
hostaddr -> IPv4位置
service -> /etc/service中的 servicename (可以不只一个)
port -> 端口号 (可以不只一个)
例子: TCP:25 - TCP and port 25
@1.2.3.4 - Internet IPv4 host address1.2.3.4
tcp@ohaha.ks.edu.tw:ftp - TCP protocolhost:ohaha.ks.edu.tw service name:ftp
9) lsof -n 不将IP转换为hostname,缺省是不加上-n参数
例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n
10) lsof -p 12 看进程号为12的进程打开了哪些文件
11) lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新
-r,lsof会永远不断的执行,直到收到中断信号
+r,lsof会一直执行,直到没有档案被显示
例子:不断查看目前ftp连接的情况:lsof -i tcp@ohaha.ks.edu.tw:ftp -r
12) lsof -s 列出打开文件的大小,如果没有大小,则留下空白
附对lsof –p pid出来的字段说明:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 4523 vmail mem REG 8,6 143336 737809 /usr/lib64/libexpat.so.0.5.0
httpd 4523 vmail mem REG 8,6 181832 1092244 /usr/lib64/libapr-0.so.0.9.4
httpd 4523 vmail mem REG 8,6 56885 3457249 /lib64/tls/librt-2.3.4.so
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
[comm1@com182 bin]$ lsof -p 24697
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
com 24697 comm1 0u CHR 1,3 1331 /dev/null
com 24697 comm1 1u CHR 1,3 1331 /dev/null
com 24697 comm1 2u CHR 1,3 1331 /dev/null
com 24697 comm1 3w REG 3,2 5 22947998 /home/comm1/com3.0/com/lock/com20.lock
com 24697 comm1 4w REG 3,2 158448 22915225 /home/comm1/com3.0/com/fifo/com_main.fifo
com 24697 comm1 5w REG 3,2 5 22947998 /home/comm1/com3.0/com/lock/com20.lock
com 24697 comm1 6w REG 3,2 441 22915390 /home/comm1/com3.0/com/fifo/com_smg_recv.fifo
com 24697 comm1 7u IPv4 295082 TCP *:rasadv (LISTEN)
com 24697 comm1 24u unix 0xffff810024320700 295031 socket
5. 系统参数调整
1.
2.
3.
4.
5.
5.1. Solaris系统调整参数
在project文件中添加该主机所有帐户的限制信息
$vi etc/project
添加如下信息(每个模块添加一条记录):(里面的红色色部分需要修改,com1修改为实际的帐户名,1000表示ID,必须在该文件中唯一,需要修改为一个与其他行不同的值)
user.com1:1000::::project.max-shm-memory=(privileged,85899345920,deny)
系统V共享内存是已知的Unix /Linux系统中最快的进程间通信方式,那么要想采用SHM方式申请共享内存需要做哪些操作呢?
在Solaris9中,需要在/etc/system中设置如下参数:
setnoexec_user_stack=1
setsemsys:seminfo_semmni=100
setsemsys:seminfo_semmns=1024
setsemsys:seminfo_semmsl=256
setsemsys:seminfo_semvmx=32767
setshmsys:shminfo_shmmax=4294967295
setshmsys:shminfo_shmmni=100
在Solaris10中,部分设置已无效:
其中,
shmsys:shminfo_shmmax 共享内存段(shared memorysegment)最大值
shmsys:shminfo_shmmin 共享内存段(shared memorysegment)最小值
shmsys:shminfo_shmmni 共享内存标志符(shared memoryidentifiers)的数量,系统中共享内存段的最大个数。
semsys:seminfo_semmni 系统中semaphoreidentifierer的最大个数。
semsys:seminfo_semmsl 一个set中semaphore的最大个数。设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。
shmsys:shminfo_shmseg 每个用户进程可以使用的最多的共享内存段的数目。
semsys:seminfo_semopm 每个semop调用的大操作数
project.max-shm-memory是属于同一个project的用户所能够创建的共享内存总和最大值,
修改操作系统参数
bl480g1<g-yang>:su – root
口令:
#vi /etc/system
添加
set shmsys:shminfo_shmmax= 8589934592
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=300
set shmsys:shminfo_shmseg=120
set semsys:seminfo_semmni=3320
set semsys:seminfo_semmsl=256
set semsys:seminfo_semmns=6640
set semsys:seminfo_semopm=100
set semsys:seminfo_semvmx=32767
set noexec_user_stack=1
set noexec_user_stack_log=1
修改用户project参数
bl480g1<g-yang>:su – root
口令:
#projadd -U g-yang user.g-yang
#projmod -a -K"project.max-shm-memory=(priv,4g,deny)" user.g-yang
验证参数
/export/home/g-yang>prctl -n project.max-shm-memory $$
process: 22448: -csh
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-memory
privileged 4.0GB - deny -
system 16.0EB max deny
结论
在2台x86主机中测试后得出结论:
1. shmsys:shminfo_shmmax配置均未生效,即单个共享内存段最大为2G-pagesize;
2. project.max-shm-memory配置默认值为1/4物理内存;设置大于此值后立即生效。
5.2. Linux系统调整参数
修改系统核心参数
修改/etc/sysctl.conf文件,增加下面行到这个文件最后,系统重起后生效,或者使用/sbin/sysctl –p生效。
kernel.sem = 250 32000 100 128
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144
kernel.core_uses_pid = 0
net.ipv4.tcp_wmem = 4096 65536 4194304
【说明】
sem: 表示设置的信号量,有4个值(semmsl,semmns,semopm,semmni)。
net.core.rmem_default:缺省接收buffer大小。
net.core.rmem_max:接收buffer最大值。
net.core.wmem_default:缺省发送buffer大小。
net.core.wmem_max:发送buffer最大值。
kernel.core_uses_pid:产生的core文件名是否加进程id后缀。
可以使用/sbin/sysctl –a|grep shmmni来检查重新启动后的参数符合要求。
修改用户限制
/etc/security/limits.conf
#允许用户打开文件最大数
* - nofile 65535
#允许用户创建进程最大数
* - nproc 65535
pam中加入配置使生效
/etc/pam.d/login增加一行配置:
session required pam_limits.so
关闭防火墙
通过setup图形界面配置,关闭防火墙。
关闭SELinux
修改配置文件/etc/sysconfig/selinux ,将SELINUX设定为disable, 重启机器使之生效。
检查IP配置
默认是主机名对应127.0.0.1地址,需要加上一条网卡IP地址和主机名对应关系
127.0.0.1 apptest localhost.localdomainlocalhost 把这里的主机名删除
::1 localhost6.localdomain6 localhost6
10.10.10.10 apptest
1.
2.
3.
4.
5.
5.1.
5.3. 快速回收TIME_WAIT状态socket
为了使网关能够快速回收TIME_WAIT状态的socket,避免短连接频繁断连导致达到系统最大文件描述符大小,可以进行如下修改:
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 1000
以下为WEB服务器常用参数修改方法
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
执行以下命令使配置生效:
/sbin/sysctl -p
5.4. 限制core.pid文件生成大小
RELH5.6版本系统配置core文件不带pid功能kernel.core_uses_pid=0对单线程有效,对多线程失效。
限制core文件大小方法:
在.bashrc文件中增加ulimit -c 0
5.5. FTP工具一定选择vsftp
Linux自带的gssftp与其他系统通讯时容易出问题,需要在安装操作系统时指定安装vsftp
运行ntsysv命令,把vsftpd服务选中
运行/etc/init.d/vsftpd start启动服务
5.6. Solaris系统性能监控工具
CPU
mpstat是solaris系统自带的实时监控工具,可以查看每个CPU处理器的统计信息。mpstat命令以表格形式报告每个处理器的统计信息,表格中的每一行代表一个处理的活动情况。mpstat可以确定每一个CPU都在花时间做什么:比如,分配给体系、用户、等待、空闲时间、体系调用、锁竞争、中断、错误、交织调用。
t2000-2<g-yang>:mpstat
CPU minf mjf xcal intr ithr csw icsw migr smtx srwsyscl usr sys wt idl
0 10 0 873 320 200 188 0 31 33 1 155 1 2 0 97
1 3 0 39 128 0 213 0 44 19 1 155 3 1 0 97
内存
vmstat 命令详解
procs:进程相关
r 在运行队列中等待的进程数
b 在等待io的进程数
w 可以进入运行队列但被替换的进程
memoy:内存相关
swap 现时可用的交换内存(k表示)
free 空闲的内存(k表示)
pages:内存页面相关
re 回收的页面
mf 非严重错误的页面
pi 进入页面数(k表示)
po 出页面数(k表示)
fr 空余的页面数(k表示)
de 提前读入的页面中的未命中数
sr 通过时钟算法扫描的页面
disk:显示每秒的磁盘操作
s表示scsi盘,0表示盘号
fault :显示每秒的中断数
in 设备中断
sy 系统中断
cy cpu交换
cpu:表示cpu的使用状态
cs 用户进程使用的时间
sy 系统进程使用的时间
id cpu空闲的时间
t2000-2<g-yang>:vmstat
kthr memory page disk faults cpu
r bw swap free re mf pi po fr de sr s0 s1 s2 -- in sy cs us sy id
0 01 13169312 1940888 12 48 9 6 7 0 1 1 33 -0 0 1363 1617 2223 1 0 98
磁盘IO
t2000-2<g-yang>:iostat
tty sd0 sd1 sd2 nfs1 cpu
tintout kps tps serv kps tps serv kps tps serv kps tps serv us sy wt id
0 273 12 1 26 614 33 395 0 0 6 0 0 0 1 0 0 98
总体
t2000-2<g-yang>:top
top: no termap entry for a `xterm-color'terminal
load averages: 0.54, 0.59, 0.60; up 57+13:59:18 15:31:59
284 processes: 283 sleeping, 1 on cpu
CPU states: 97.8% idle, 1.2% user, 0.9% kernel, 0.0% iowait, 0.0% swap
Memory: 8184M phys mem, 1014M free mem, 16G totalswap, 10G free swap
PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
19817 tags2 200 53 2 667M 484M sleep 25:34 0.86% java
1791 g-yang 1 44 03712K 2720K cpu/9 0:00 0.34% top
5.7. Linux系统性能监控工具
总体
top
top - 15:49:30 up 18 days, 2:07, 1 user, load average: 0.00, 0.00,0.00
Tasks: 148 total, 1 running, 147 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2003096k total, 1975052kused, 28044k free, 397264k buffers
Swap: 4192956k total, 0kused, 4192956k free, 1297732k cached
PIDUSER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5374comm1 15 0 12768 1136 824 R 0.3 0.1 0:00.02 top
1root 15 0 10372 692 584 S 0.0 0.0 0:00.58 init
内存
[comm1@com182 ~]$ free -m
total used free shared buffers cached
Mem: 1956 1928 27 0 387 1267
-/+ buffers/cache: 272 1683
Swap: 4094 0 4094
注:剩余内存为free+buffers+cache,swap空间还未用
6. 数据库类
4.
5.
6.
6.1. 查询这2个表空间包含的表
select tablespace_name,table_name fromuser_tables
where tablespace_name in ('COM_CDR_IDX_TS','COM_CDR_TS ');
结果为空
6.2. 查询这2个表空间包含的分区表
select table_name||' '||partition_name||' '||tablespace_name
from user_tab_partitions
where tablespace_name='COM_CDR_TS'
order by partition_name;
结果形如:
COM_CDR_MO_T MO20100910 COM_CDR_TS
COM_CDR_MO_T MO20100911 COM_CDR_TS
COM_CDR_MO_T MO20100912 COM_CDR_TS
6.3. 查询分区表数量
select distinct table_name
from user_tab_partitions wheretablespace_name='COM_CDR_TS';
共5个分区表
COM_CDR_MO_T
COM_CDR_MTSR_T
COM_CDR_MOSR_T
COM_CDR_MT_T
COM_CDR_SENDF_MTSR_T
6.4. 查询分区表大小
select segment_Name,sum(bytes)/1024/1024
from user_extents where tablespace_name='COM_CDR_TS'
group by segment_name ;
SEGMENT_NAME SUM(BYTES)/1024/1024
--------------------------------------------------
COM_CDR_MO_T 27490
COM_CDR_MT_T 27948
COM_CDR_MTSR_T 222
COM_CDR_MOSR_T 222
COM_CDR_SENDF_MTSR_T 222
可见COM_CDR_MO_T、COM_CDR_MT_T较大
6.5. 查询每个分区大小
select sum(bytes)/1024/1024,partition_name
from user_extents where segment_name='COM_CDR_MT_T'
group by partition_name;
结果形如:
SUM(BYTES)/1024/1024 PARTITION_NAME
--------------------------------------------------
278 MT20101129
248 MT20101218
246 MT20100912
322 MT20100917
298 MT20100929
可知每个分区大小约200~300m
6.6. 查询最大、最小分区
selectmin(partition_name),max(partition_name)
from user_tab_partitions where table_name =upper('COM_CDR_MO_T')
order by partition_name desc;
MIN(PARTITION_NAME) MAX(PARTITION_NAME)
------------------------------------------------------------
MO20100910 MO20101229
可见,mo大表中保存了3个月分区数据,mt大表查询方法相同
6.7. 查询这两个表空间的分区索引(导入分区后,索引会自动创建)
select index_name||' '||partition_name||' '||tablespace_name
from user_ind_partitions
where tablespace_name='COM_CDR_IDX_TS'
order by partition_name;
结果形如:
COM_MTSR_ARRIVE_TM_IDX MTSR20101216 COM_CDR_IDX_TS
COM_MTSR_ARRIVE_TM_IDX MTSR20101217 COM_CDR_IDX_TS
COM_MTSR_ARRIVE_TM_IDX MTSR20101218 COM_CDR_IDX_TS
6.8. 查询业务
select count(*),m_state,err_code,r_resultfrom com_cdr_mo_t where state_tm>=20120122000000 andstate_tm<20120123000000 group by m_state,err_code,r_result;
COUNT(*) M_STATE ERR_CODE R_RESULT
---------- ---------- ---------- ----------
59210069 0 0 0
27812 0 1 0
33784 0 3 0
5750758 0 4 0
693 0 6 0
6133 0 8 0
8 4 0 0
943315 6 0 0
40184 6 0 1009
24406 6 0 1010
2048 6 0 1076
6.9. 后台启动查询脚本
LN-SY-HTSMG-APP3<comms>10:db.sh &
[1] 24220
LN-SY-HTSMG-APP3<comms>11:cat db.sh
#!/bin/sh
sqlplus -S com20/2yhlfsl@com20 <<EOF>mo20090512
set head off feedback off verify off
set wrap off
set heading off
set newpage none
set linesize 175
select count(*),substr(state_tm,1,8) from com_cdr_mo_twhere m_state=0 and err_code=0 and target_gw=137111 and state_tm >=20090301000000 and state_tm<20090501000000 group by substr(state_tm,1,8);
exit
EOF
7. 其他
7.
7.1. grep精确查找
grep '\<data_init\>' */*/*.c
7.2. 查看二进制文件内容
xxd file
od -c file
注:不要用vi/vim编辑二进制或文本文件,保存后会在文件后加入一个字节0x0a