注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

widebright的个人空间

// 编程和生活

 
 
 

日志

 
 

网上看到的通过proc文件系统解决进程卡死不懂的问题,(进程的内核调用栈,当前syscall号码,context switch次数等)  

2013-12-23 11:18:46|  分类: linux相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

看到网上有人转这篇文章,利用了proc文件里面来找出进程休眠的地方。很不错的几个proc文件用法,可以用里面学到几招^_^
Peeking into Linux kernel-land using /proc filesystem for quick’n'dirty troubleshooting
http://blog.tanelpoder.com/2013/02/21/peeking-into-linux-kernel-land-using-proc-filesystem-for-quickndirty-troubleshooting/


1. 
ps  -ef | grep <name>  这个我也经常用哈
top -cbp <pid>   查看进程的cpu利用率,我一般经常用top -H
strace  -cp  <pid>   attach到指定进程. strace还可以attach到已经运行的程序的,以前没这么用过


2.  ctrl + c  中断程序不行,可以ctrl +z  让他切换后台运行,在kill -9  结束进程。
   ctrl +z  这么没有用过

3. pstack 查看进程,指定调用栈。这个我也常用到


4.  ps -flp  27662  可以查看WCHAN状态。 休眠的进程这里有等待的函数记录
root@debian01:/opt/diameter/cisco/peer1#  ps -flp  27662
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
0 S root     27662     1  0  80   0 - 40406 -      09:59 pts/0    00:00:04 freeDiameterd -c /opt/diameter/cisco/peer1/freeDiameter.conf
 
cat   /proc/<pid>/wchan   (waiting  channel) 进程在其中等待的通道, 实际是一个系统 调用的地址. 可以看到休眠进程在等待的syscall调用号。
                        或者是函数的调用地址可以在/proc/kallsyms 里面查找?
ps -flp  命令里面也可以输出这一个wchan的。   ps命令好像都是读取的 /proc/<pid>/stat 文件里面的信息

还有最前面 S 等状态,是进程的当前状态,看挂起的进程也有用处。



5.  其他proc文件的状态信息

man 5 proc  查看proc文件的帮助

root@debian01:/opt/diameter/cisco/peer1# ls -l  /proc/27662
总用量 0
dr-xr-xr-x  2 root root 0 12月 23 10:00 attr
-rw-r--r--  1 root root 0 12月 23 10:00 autogroup
-r--------  1 root root 0 12月 23 10:00 auxv
-r--r--r--  1 root root 0 12月 23 10:00 cgroup
--w-------  1 root root 0 12月 23 10:00 clear_refs
-r--r--r--  1 root root 0 12月 23 09:59 cmdline
-rw-r--r--  1 root root 0 12月 23 10:00 comm
-rw-r--r--  1 root root 0 12月 23 10:00 coredump_filter
-r--r--r--  1 root root 0 12月 23 10:00 cpuset
lrwxrwxrwx  1 root root 0 12月 23 10:00 cwd -> /opt/diameter/cisco/peer1
-r--------  1 root root 0 12月 23 10:00 environ
lrwxrwxrwx  1 root root 0 12月 23 10:00 exe -> /usr/bin/freeDiameterd-1.2.0
dr-x------  2 root root 0 12月 23 10:00 fd
dr-x------  2 root root 0 12月 23 10:00 fdinfo
-r--------  1 root root 0 12月 23 10:00 io
-r--r--r--  1 root root 0 12月 23 10:00 limits
-rw-r--r--  1 root root 0 12月 23 10:00 loginuid
-r--r--r--  1 root root 0 12月 23 10:00 maps
-rw-------  1 root root 0 12月 23 10:00 mem
-r--r--r--  1 root root 0 12月 23 10:00 mountinfo
-r--r--r--  1 root root 0 12月 23 10:00 mounts
-r--------  1 root root 0 12月 23 10:00 mountstats
dr-xr-xr-x  6 root root 0 12月 23 10:00 net
dr-x--x--x  2 root root 0 12月 23 10:00 ns
-rw-r--r--  1 root root 0 12月 23 10:00 oom_adj
-r--r--r--  1 root root 0 12月 23 10:00 oom_score
-rw-r--r--  1 root root 0 12月 23 10:00 oom_score_adj
-r--r--r--  1 root root 0 12月 23 10:00 pagemap
-r--r--r--  1 root root 0 12月 23 10:00 personality
lrwxrwxrwx  1 root root 0 12月 23 10:00 root -> /
-rw-r--r--  1 root root 0 12月 23 10:00 sched
-r--r--r--  1 root root 0 12月 23 10:00 sessionid
-r--r--r--  1 root root 0 12月 23 10:00 smaps
-r--r--r--  1 root root 0 12月 23 10:00 stack
-r--r--r--  1 root root 0 12月 23 10:00 stat
-r--r--r--  1 root root 0 12月 23 10:00 statm
-r--r--r--  1 root root 0 12月 23 10:00 status
-r--r--r--  1 root root 0 12月 23 10:00 syscall
dr-xr-xr-x 21 root root 0 12月 23 10:00 task
-r--r--r--  1 root root 0 12月 23 10:00 wchan



root@debian01:/opt/diameter/cisco/peer1# cat /proc/27662/status
Name: freeDiameterd
State: S (sleeping)
Tgid: 27662
Pid: 27662
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups:
VmPeak:  161624 kB
VmSize:  161624 kB
VmLck:       0 kB
VmPin:       0 kB
VmHWM:    6652 kB
VmRSS:    6652 kB
VmData:  151068 kB
VmStk:     136 kB
VmExe:      12 kB
VmLib:    9676 kB
VmPTE:     108 kB
VmSwap:       0 kB
Threads: 19
SigQ: 0/7966
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000004a06
SigIgn: 0000000000000001
SigCgt: 0000000180004a06
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: ff
Cpus_allowed_list: 0-7
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 39    自愿context switch 次数
nonvoluntary_ctxt_switches: 3     被迫context switch 次数




root@debian01:/opt/diameter/cisco/peer1# cat /proc/27662/stack           内核调用栈,可以看出是等待在锁上面
[<c10f5223>] generic_file_buffered_write+0x193/0x240
[<c109fec9>] get_futex_key+0x129/0x270
[<c114c9c6>] generic_permission+0xe6/0x1f0
[<c109f51b>] futex_wait_queue_me+0xbb/0x120
[<c10a0257>] futex_wait+0x167/0x240
[<c115128c>] user_path_at_empty+0x4c/0x80
[<c10a194b>] do_futex+0x2fb/0x9b0
[<c10a20ff>] SyS_futex+0xff/0x170
[<c141258d>] sysenter_do_call+0x12/0x28
[<ffffffff>] 0xffffffff

root@debian01:/opt/diameter/cisco/peer1# cat   /proc/27662/sched 
freeDiameterd (27662, #threads: 19)
-------------------------------------------------------------------
se.exec_start                                :     255851046.254381
se.vruntime                                  :         88609.345466
se.sum_exec_runtime                          :            19.771597
nr_switches                                  :                   42        context switch 次数
nr_voluntary_switches                        :                   39        自动放弃cpu的context switch
nr_involuntary_switches                      :                    3        非自愿的被迫放弃cpu的context swtich
se.load.weight                               :                 1024
se.avg.runnable_avg_sum                      :                 6342
se.avg.runnable_avg_period                   :                46686
se.avg.load_avg_contrib                      :                  132
se.avg.decay_count                           :            243998572
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                  203


root@debian01:/opt/diameter/cisco/peer1# cat /proc/27662/syscall 
240 0xb773a1c4 0x80 0x1 0x0 0xb760dff4 0xbfb497c8 0xbfb4975c 0xb7780424

240 是 syscall调用好,  后面应该是函数地址和参数? 
root@debian01:/opt/diameter/cisco/peer1# grep 240   /usr/src/linux-headers-3.11-0.bpo.2-686-pae/arch/x86/include/generated/uapi/asm/unistd_32.h 
#define __NR_futex 240

这里syscall看到的函数跟 cat /proc/27662/stack 看到结果应该是对应的。





作者甚至,弄了一个脚本统计syscall和内核调用栈,当作profiler用,
export LC_ALL=C ; for i in {1..100} ; do cat /proc/29797/syscall | awk '{ print $1 }' ; cat /proc/29797/stack | /home/oracle/os_explain -k ; usleep 100000 ; done | sort -r | uniq -c 
     69 running


cat /proc/kallsyms   内核所有的导出函数地址,我也经常用到

  评论这张
 
阅读(695)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017