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

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Linux的strace命令的用法  

来自hzxiaowu   2014-03-25 20:17:16|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    vmstat监控到sys比例比较高时,系统中断不高,但是cs比较高,怀疑是系统调用比较频繁时,需要分析系统执行了哪些系统调用。Linux下的strace命令方便的帮助我们记录进程所执行的系统调用。在介绍strace命令怎么用之前,先了解下strace是如何工作的。

一.strace是如何工作的

strace的实现原理是基于Linux所提供的一个强大的系统调用ptrace()ptrace提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像(包括寄存器)的值。其基本原理是当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED。而父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行。    

其原型为:    
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
ptrace
有四个参数
1). enum __ptrace_request request
:指示了ptrace要执行的命令。
2). pid_t pid:
指示ptrace要跟踪的进程。
3). void *addr:
指示要监控的内存地址。
4). void *data:
存放读取出的或者要写入的数据。


二.strace的输出内容是什么


root@ubuntu:/usr# strace cat /dev/null
execve(
"/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(
0)                                  = 0xab1000
access(
"/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL,
8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access(
"/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
brk(
0) = 0xab1000
brk(
0xad2000) = 0xad2000
fstat(
1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open(
"/dev/null", O_RDONLY) = 3
fstat(
3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(
3, "", 32768) = 0
close(
3) = 0
close(
1) = 0
close(
2) = 0
exit_group(
0) = ?

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。strace 显示这些调用的参数并返回符号形式的值.具体的系统调用可以查看相关的介绍文档


三.性能测试中strace的几种常见的用法


1.记录进程的系统调用

运用下面的命令来跟踪进程的系统调用

strace -f -p PID  -o file

PID为进程号,file为自定义的文件,运行一段时间后按ctrl+c退出,这段时间内的系统调用会记录在自定义的文件中



2.统计系统的各种系统调用的占比以及时间分布

strace -c  -p  PID  运行一段时间后按ctrl+c退出 

[root@* ~]# strace -c  -p  PID 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
82.50   17.985054         749     24027           read
17.50    3.813752         159     24028           write
  0.00    0.000138          69         2           munmap
  0.00    0.000000           0         7         6 open
  0.00    0.000000           0         4         1 close
  0.00    0.000000           0         1           fstat
  0.00    0.000000           0         1           mmap
  0.00    0.000000           0         1           clock_gettime
------ ----------- ----------- --------- --------- ----------------
100.00   21.798944                 48071         7 total


两者结合起来用,先获得哪些系统调用次数多,耗时,在1中的记录文件中找具体的系统调用。再进行后续的分析

  评论这张
 
阅读(1068)| 评论(2)
推荐 转载

历史上的今天

评论

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

页脚

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