- 浏览: 267682 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
sunfeizhi:
感谢博主
mysqlhotcopy 缺少DBI不能使用问题解决 -
wuxiaochun:
谢谢版主提供所有依赖包的下载地址。
Memcached Session Manager 共享tomcat session设置
Linux利器 strace
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
strace使用参数
-p 跟踪指定的进程
-f 跟踪由fork子进程系统调用
-F 尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪
-o filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中
-ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
-r 打印每一个系统调用的相对时间
-t 在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间
-v 输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出
-s 指定每一行输出字符串的长度,默认是32。文件名一直全部输出
-c 统计每种系统调用所执行的时间,调用次数,出错次数。
-e expr 输出过滤器,通过表达式,可以过滤出掉你不想要输出
应用场景
#1.跟踪你的web服务器系统调用
系统调用优化,也是web性能优化的一个较为重要的方向,尤其是在I/O密集型web应用的情况。我们这里的测试环境是CentOS5.4+Nginx+FastCGI。
<?php //file:hello.php define ( 'DOCUMENT_ROOT' , dirname ( __FILE__ ) ) ; include ( "hello.inc" ) ; include ( "./hello.inc" ) ; include ( DOCUMENT_ROOT . "/hello.inc" ) ; ?>
#strace -f -F -o strace_nginx strace /wwwchroot/nginx/sbin/nginx -c /wwwchroot/nginx/nginx.conf ... (有部分不重要的数据影响排版,在这里使用...代替) //--接受来自客户端的http请求 4165 recv(16, "GET /hello.php HTTP/1.1\r\nHost: f"..., 32768, 0) = 391 4165 epoll_ctl(9, EPOLL_CTL_MOD, 16, {EPOLLIN|EPOLLOUT|EPOLLET, {u32=3081162952, u64=698098541354471624}}) = 0 //--进行DNS查找 4165 getsockname(16, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("222.73.211.214")}, [16]) = 0 //--新建一个socket,连接Fast-CGI,端口号为9000 4165 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 17 4165 ioctl(17, FIONBIO, [1]) = 0 4165 epoll_ctl(9, EPOLL_CTL_ADD, 17, {EPOLLIN|EPOLLOUT|EPOLLET, {u32=3081163048, u64=697886249710965032}}) = 0 4165 connect(17, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ) 4165 epoll_wait(9, {{EPOLLOUT, {u32=3081163048, u64=697886249710965032}}, {...}, 5\ 12, 300000) = 2 4165 gettimeofday({1295420285, 130967}, NULL) = 0 4165 recv(16, 0xbfdd7d8b, 1, MSG_PEEK) = -1 EAGAIN (Resource temporarily unavailable) 4165 getsockopt(17, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 //--将用户http请求交给Fast-CGI 4165 writev(17, [{"\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\30\0\0\21\7GATEWA"..., 832}], 1) = 832 4165 epoll_wait(9, {{EPOLLIN|EPOLLOUT, {u32=3081163048, u64=697886249710965032}}}, 512, 300000) = 1 4165 gettimeofday({1295420285, 131559}, NULL) = 0 //--接收Fast-CGI响应 4165 recv(17, "\1\6\0\1\0V\2\0X-Powered-By: PHP/5.2.10"..., 65536, 0) = 112 4165 readv(17, [{"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65424}], 1) = 0 4165 mmap2(NULL, 274432, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7514000 4165 close(17) = 0 4165 munmap(0xb7514000, 274432) = 0 //-- 响应客户端http请求,即http响应 4165 writev(16, [{"HTTP/1.1 200 OK\r\nServer: nginx/0"..., 228}, {"22\r\n", 4}, ..., 5) = 273 4165 write(5, "116.66.34.82 - - [19/Jan/2011:14"..., 191) = 191 4165 setsockopt(16, SOL_TCP, TCP_NODELAY, [1], 4) = 0 4165 recv(16, 0x9b024e8, 32768, 0) = -1 EAGAIN (Resource temporarily unavailable) ...
通过这些,我们只能够大概地了解,Nginx这里启用了epoll。同时,还可以了解到Nginx和Fast-CGI底层是如何运作的。奇 怪,hello.php文件中有三个inclue,即加载了三次文件,这里没有看到相应的i/o逻辑操作,是为什么呢?这是因为,Nginx并没解析处理 PHP脚本,而是交给Fast-CGI去做这部事情了。
#strace -f -F -o php-cgi-strace /wwwchroot/php/bin/php-cgi --fpm-config /wwwchroot/php/etc/php-fpm.conf //--接收来自Nginx发出的请求 4510 <... accept resumed> {sa_family=AF_INET, sin_port=htons(35983), sin_addr=inet_addr("127.0.0.1")}, [16]) = 3 4510 clock_gettime(CLOCK_MONOTONIC, {22638545, 869965681}) = 0 4510 poll([{fd=3, events=POLLIN}], 1, 5000) = 1 ([{fd=3, revents=POLLIN}]) 4510 read(3, "\1\1\0\1\0\10\0\0", 8) = 8 4510 read(3, "\0\1\0\0\0\0\0\0", 8) = 8 4510 read(3, "\1\4\0\1\0035\3\0", 8) = 8 4510 read(3, "\21\7GATEWAY_INTERFACECGI/1.1\17\5SERV"..., 824) = 824 4510 read(3, "\1\4\0\1\0\0\0\0", 8) = 8 4510 time(NULL) = 1295425149 //--加载请求资源文件hello.php 4510 lstat64("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 4510 lstat64("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 4510 lstat64("/var/www/ep", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 4510 lstat64("/var/www/ep/hello.php", {st_mode=S_IFREG|0644, st_size=119, ...}) = 0 4510 clock_gettime(CLOCK_MONOTONIC, {22638545, 870893872}) = 0 4510 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={60, 0}}, NULL) = 0 4510 rt_sigaction(SIGPROF, {0x835c120, [PROF], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0 4510 rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0 4510 time(NULL) = 1295425149 4510 open("/var/www/ep/hello.php", O_RDONLY) = 4 4510 fstat64(4, {st_mode=S_IFREG|0644, st_size=119, ...}) = 0 4510 time(NULL) = 1295425149 4510 chdir("/var/www/ep") = 0 4510 fstat64(4, {st_mode=S_IFREG|0644, st_size=119, ...}) = 0 4510 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe7000 4510 read(4, "\n", 8192) = 29 4510 read(4, "", 8192) = 0 4510 read(4, "", 8192) = 0 4510 close(4) = 0 //-- 加载hello.inc, 对应php代码include './hello.inc' 4510 getcwd("/var/www/ep"..., 4096) = 12 4510 time(NULL) = 1295425149 4510 open("/var/www/ep/hello.inc", O_RDONLY) = 4 4510 fstat64(4, {st_mode=S_IFREG|0644, st_size=29, ...}) = 0 4510 read(4, "\n", 8192) = 29 4510 read(4, "", 8192) = 0 4510 read(4, "", 8192) = 0 4510 close(4) = 0 4510 time(NULL) = 1295425149 //-- 加载hello.inc, 对应php代码include DOCUMENT_ROOT . '/hello.inc' 4510 lstat64("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 4510 lstat64("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 4510 lstat64("/var/www/ep", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 4510 lstat64("/var/www/ep/hello.inc", {st_mode=S_IFREG|0644, st_size=29, ...}) = 0 4510 open("/var/www/ep/hello.inc", O_RDONLY) = 4 4510 fstat64(4, {st_mode=S_IFREG|0644, st_size=29, ...}) = 0 4510 read(4, "\n", 8192) = 29 4510 read(4, "", 8192) = 0 4510 read(4, "", 8192) = 0 4510 close(4) = 0 //-- 将响结果输出给Nginx,并且关闭连接 4510 write(3, "\1\6\0\1\0V\2\0X-Powered-By: PHP/5.2.10"..., 96) = 96 4510 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={0, 0}}, NULL) = 0 4510 write(3, "\1\3\0\1\0\10\0\0\0\0\0\0\0ere", 16) = 16 4510 shutdown(3, 1 /* send */) = 0 4510 recv(3, "\1\5\0\1\0\0\0\0", 8, 0) = 8 4510 recv(3, "", 8, 0) = 0 4510 close(3) = 0
通过跟踪php-cgi,我们可以知道,相较与其它二种方法include ‘./hello.inc’的性能是最高的。这里看到strace输出都被截断了,如果你需要看到更多的输出,可以通过-s选项,让strace输出更多内容。
#2. MySQL执行语句列表
当发生个http请求的时候,很多时候希望得到这个http请求发生了多少次数据库SELECT操作,是否在同一个mysql connection连接里面完成。这里以访问本页为例子,通过strace来跟踪这些MySQL SELECT查询语句。
//-9514是mysqld的进程号,为了看到整条SQL语句,我们通过-s 1024希望输出更多内容 #strace -f -F -ff -o strace-mysqld -s 1024 -p 9514 #find . -name "strace-mysqld*" -type f -print |xargs grep -n "SELECT.*FROM wp_" ./strace-mysqld.19203:64: read(19, "\3SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'", 72) = 72 ./strace-mysqld.19203:165: read(19, "\3SELECT * FROM wp_users WHERE user_login = 'admin'", 50) = 50 ./strace-mysqld.19203:184: read(19, "\3SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 1", 63) = 63 ./strace-mysqld.19203:295: read(19, "\3SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1", 80) = 80 ./strace-mysqld.19203:311: read(19, "\3 SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.ID = 501 AND wp_posts.post_type = 'post' ORDER BY wp_posts.post_date DESC ", 136) = 136 ... (这里省去了一些)
其他
strace远不止这么强大,你可以善用之,我想你会离不开它的。同时,你还可以联合gdb和ltrace,你的工作会更加高效。
这篇文章来源http://www.perfgeeks.com/?p=501
发表评论
-
Linux 备忘常用命令
2013-07-01 10:51 711less 功能说明:分页显示。 用法说明 cat i ... -
chattr和lsattr命令详解
2012-10-29 22:07 1032转http://blog.163.com/dyc_888@12 ... -
dmidecode命令查看DELL服务器服务编号
2012-06-17 11:48 4564[root@Dell-R710 ~]# dmidecode - ... -
查看Linux下最常用的命令
2012-05-22 22:40 112# history | awk '{CMD[$2]++;cou ... -
lscpu 安装
2011-10-13 11:46 4030[root@util-linux-ng-2.18]# lscp ... -
vmstat 查看系统负载情况
2011-10-12 10:18 1595$ vmstat procs -----------m ... -
yum
2011-08-17 10:52 7891.列出所有可更新的软 ... -
vim
2011-08-01 00:41 724位置控制: h 左 j 上 k 下 l 右 G 最后 ... -
lsof 详解
2011-05-25 14:26 1074转载赛迪网 一般root用户才能执行lsof命令,普通 ... -
netstat
2011-05-16 13:39 1774功能说明: Netstat用于显示与IP、TCP、UDP和I ... -
iftop 流量监控工具
2011-05-11 17:06 255CentOS上安装所需依赖包: yum install fl ... -
luit 转换终端编码传输
2010-12-22 15:50 2017ubuntu10.10 终端下默认zh_CN.UTF- ... -
sysctl 调整系统内核
2010-10-26 17:16 1292TCP 方面调优 sysctl -a ... -
Shell 调用系统时间变量
2010-07-26 16:12 1647获取今天时期:`date +%Y%m%d` 或 `date + ... -
iconv & enca 两种文件编码转换工具对比
2010-03-22 11:34 2714enca: enca -L zh_CN test.sql ... -
crontab--计划任务管理
2010-02-03 11:27 1284cron 安装 一般情况下,cron都是系统默认,判断系统是 ... -
traceroute--命令追踪数据包传输路径
2010-01-31 00:50 2742[root@localhost ~]# trace ... -
ping--命令检查网络是否通畅
2010-01-31 00:16 1460[root@localhost ~]# ping www ... -
find
2009-11-28 23:15 1037find命令选项 -name 按照文件名查找文件。-perm ... -
watch--实时监测命令
2009-11-28 22:51 976watch 是一个非常实用的命令,基本所有的 Linux 发行 ...
相关推荐
strace-armv4l 23-Sep-2014 12:38 277K strace-armv4tl 23-Sep-2014 12:39 295K strace-armv5l 23-Sep-2014 12:39 295K strace-armv6l 23-Sep-2014 12:39 295K strace-i486 23-Sep-2014 12:37 249K strace-i586...
《strace-5.15在Android上的应用与解析》 在信息技术领域,尤其是在系统调试和性能分析中,strace是一个不可或缺的工具。它能够帮助我们跟踪和记录Linux系统调用,以及进程间的信号传递,从而揭示程序在操作系统...
标题提及的是"strace for windows 已编译 straceNT.exe",这表明我们讨论的是一个适用于Windows操作系统的strace工具,它已经被预先编译成可执行文件straceNT.exe。strace是一个在Unix-like系统中广泛使用的系统调用...
在Linux系统中,`strace`和`pstack`是两个非常重要的系统调用跟踪工具,它们对于理解和调试进程的行为有着不可替代的作用。本压缩包`strace_pstack-master.zip`包含了与这两个工具相关的脚本,旨在帮助用户深入学习...
在嵌入式Linux系统中,调试工具的使用对于开发者来说至关重要,其中`strace`是一个非常实用的系统调用跟踪工具。它可以帮助我们监控和记录应用程序执行时对系统调用的使用情况,以及相关的信号处理。这篇内容将详细...
Linux 的 Strace 命令详解 Strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。Strace 显示这些调用的参数并返回符号形式的值。Strace 从内核接收信息,而且不需要以任何特殊的方式来构建...
免安装strace [root@vmtca-2003 strace-5.1]# ldd strace linux-vdso.so.1 (0x00007ffc14ffb000) librt.so.1 => /lib64/librt.so.1 (0x00007fe620539000) libc.so.6 => /lib64/libc.so.6 (0x00007fe620174000) ...
Strace是一个在Linux环境下用于诊断、调试和跟踪系统调用和进程间通信的工具。它通过跟踪和记录指定进程对内核的调用和接收的信号,将系统调用的名字、参数、返回值打印出来,这对于解决和定位问题非常有帮助。 在...
标题"arm平台的strace"指的是在ARM架构的计算机系统上使用的strace工具。strace是一个非常实用的系统调用跟踪工具,它允许开发者监控和记录程序执行过程中的系统调用以及接收到的信号,这对于调试、性能分析以及理解...
strace 命令是一种强大的工具, 能够显示任何由用户空间程式发出的系统调用. strace 显示这些调用的参数并返回符号形式的值. strace 从内核接收信息, 而且无需以任何特别的方式来构建内核. strace 的每一行输出包括...
strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用。 Strace是一个简单的跟踪系统调用执行的工具。在其最简单的形式中,它可以从开始到结束跟踪二进制的执行,并在进程的生命周期中输出...
《深入理解strace工具:以strace-4.5.15为例》 在Linux操作系统中,strace是一个非常实用的系统调用跟踪工具,它能够帮助开发者和系统管理员了解程序在运行过程中与操作系统的交互细节,包括系统调用的使用、参数...
《深入理解strace工具:基于strace-4.5.15版本的探索》 在Linux操作系统中,strace是一个非常实用的系统调用跟踪工具,它能够帮助开发者和系统管理员深入了解程序与操作系统内核之间的交互。本文将围绕strace-...
未能加载文件或程序集“Microsoft.SqlServer.Diagnostics.STrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或它的某一个依赖项。系统找不到指定的文件。 (Microsoft.SqlServer.Dmf) ...
1.下载 strace-4.5.16.tar.bz2,不要下载最新的strace-4.5.18.tar.bz2,因为后者编译会出错。下载网址是:http://sourceforge.net/project/showfiles.php?group_id=2861&package_id=2819; 2.配置。./configure --...
“Microsoft.SqlServer.Management.Dmf.PolicyStore”的...找对版本将Microsoft.SqlServer.Diagnostics.STrace.dll复制到C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE这个目录 即可。
《深入剖析strace源码与Aarch64-Linux-GNU平台编译实践》 strace,这个在Linux世界中不可或缺的系统调用追踪工具,是开发者和系统管理员的得力助手。它允许我们监控进程对系统调用的使用情况,从而洞察程序运行的...
strace strace strace strace strace strace strace strace strace strace strace strace strace strace strace strace
各版本Microsoft.SqlServer.Diagnostics.STrace下载, 解决Management Studio打开弹错误: “Microsoft.SqlServer.Management.Dmf.PolicyStore”的类型初始值设定项引发异常。 (Microsoft.SqlServer.Dmf) 未能加载...