我没有 strace 技能和知识,但我试图解决我的客户端应用程序非常慢的问题。我试图找出瓶颈/问题可能在哪里。
所以我跑了
/etc/init.d/apache2 stop && strace -Tf -o /tmp/trace.txt /etc/init.d/apache2 start
Run Code Online (Sandbox Code Playgroud)
通过/tmp/trace.txt,我看到了很多以下内容。
2540 poll([{fd=21, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) <0.000052>
Run Code Online (Sandbox Code Playgroud)
有人会取悦我所看到的,以及我将如何将其与问题所在的位置联系起来。该站点确实使用了 MySQL,这是否意味着无法建立与 MySQL 的连接?民意调查甚至与数据库相关。
对其中一个 apache 子进程执行 strace,它显示两次系统调用之间的时间间隔为 24 秒。我如何确定导致此行为的原因。看起来两个子进程花费的时间几乎相同(24.7 和 23.92)秒。
我们使用 apache prefork 与 php5 和 mysql 5
/var/lib/php5/ 是 php 会话文件夹
带有 processid -20539 的 apache Children1 的 strace 输出
ps -u www-数据 | grep apache2 | awk '{print"-p " $1}' | xargs strace -o /strace/strace.log -ff -s4096 -r
20539 0.000064 关闭(13) = 0
20539 0.000060 打开(“/var/lib/php5/sess_9t2cvnvdoruh666rjpm515idm0”,O_RDWR|O_CREAT,0600)= 13
20539 0.000065 羊群(13, LOCK_EX) = 0
20539 24.711888 fcntl(13, F_SETFD, FD_CLOEXEC) = 0
20539 0.000056 fstat(13, {st_mode=S_IFREG|0600, st_size=211, ...}) = 0
20539 0.000080 …
我有以下 strace 输出,我正在通过这些输出自学更多关于程序流程的知识。这是让我困惑的部分:
16:08:02 open("/lib/libncurses.so.5", O_RDONLY) = 3 <0.000046>
16:08:02 read(3, "\x7f\"..., 512) = 512 <0.000048>
16:08:02 fstat64(3, {st_dev=makedev(202, 0), st_ino=16548, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=464, st_size=231576, st_atime=2011/02/06-15:37:43, st_mtime=2011/01/04-06:05:23, st_ctime=2011/02/06-15:37:43}) = 0 <0.000038>
Run Code Online (Sandbox Code Playgroud)
通过读取前 512 个字节获得了什么?似乎这种模式在共享库中很常见。
更新:我刚刚得到了一个很好的答案,澄清了 512 字节的长度。具体来自 elf/dl-load.c 中的评论:
ELF 标头 32 位文件的长度为 52 字节,而 64 位文件的长度为 64 字节。每个程序头条目的长度分别为 32 和 56 字节。即,即使文件有 10 个程序头条目,我们也只需要分别读取 372B/624B。为程序注释添加一点余量,分别读取 32 位和 64 位文件的 512B 和 832B 就足够了。
运行 ltrace 并非易事。这个 RHEL 5.3 系统基于 Tomcat Catalina(servlet 容器),它使用文本脚本将所有内容联系在一起。当我试图在这里找到一个可执行文件时,我陷入了困境:
/etc/init.d/pki-ca9 调用 dtomcat5-pki-ca9
#Path to the tomcat launch script (direct don't use wrapper)
TOMCAT_SCRIPT=/usr/bin/dtomcat5-pki-ca9
Run Code Online (Sandbox Code Playgroud)
/usr/bin/dtomcat5-pki-ca9 调用看门狗程序
/usr/bin/nuxwdog -f $FNAME
Run Code Online (Sandbox Code Playgroud)
我用包装器替换了 nuxwdog
[root@qantas]# cat /usr/bin/nuxwdog
#!/bin/bash
ltrace -e open -o /tmp/ltrace.$(date +%s) /usr/bin/nuxwdog.bak $@
[root@qantas]# service pki-ca9 start
Starting pki-ca9: [ OK ]
[root@qantas]# cat /tmp/ltrace.1295036985
+++ exited (status 1) +++
Run Code Online (Sandbox Code Playgroud)
这是丑陋的。如何在 tomcat 中运行 strace 或 ltrace?
更新
这是tomcat的“进程”
[root@qantas]# ps -ef | grep tomcat
pkiuser 21767 21766 0 10:10 ? 00:00:09 …Run Code Online (Sandbox Code Playgroud) 我有一个运行 php 的 ubuntu apache/php 服务器,每秒执行 appx 100 次点击,还有一个在后台运行的 PHP cron。
我偶尔会在其中一个 Apache 进程上获得高 CPU 负载,无论流量或 cron 活动如何,它都会保持高负载。在我看来,它陷入了某种循环或某事。
您将在下面找到顶部和跟踪信息。
如何找到错误代码的位置以及导致这种情况的原因?
top - 14:45:24 up 3 days, 3:38, 1 user, load average: 5.10, 5.88, 5.85
Tasks: 163 total, 5 running, 158 sleeping, 0 stopped, 0 zombie
Cpu(s): 47.8%us, 18.5%sy, 0.0%ni, 10.2%id, 0.0%wa, 0.0%hi, 1.8%si, 21.6%st
Mem: 7885012k total, 3858484k used, 4026528k free, 177444k buffers
Swap: 0k total, 0k used, 0k free, 1037868k cached
PID USER PR NI VIRT RES SHR S …Run Code Online (Sandbox Code Playgroud) 我有一台安装了 cifs 共享(Azure 存储文件)的服务器。有时 ls 返回缓慢(20 秒)。经过一番调试后,我到目前为止发现:
ls /data/some/symlink/directory20秒内返回ls .需要 0.02 秒ls /data/original/location/that/symlinkpoints/to/directory也返回亚秒ls 的 20 秒返回时间似乎受到目录中文件数量的影响。目录越大,花费的时间就越多。
这让我认为这与 ls 处理符号链接的方式有关。就像它必须为每个文件或其他东西解决它一样。
为了调试这个,我想通过 strace 运行 ls 来看看我是否可以看到不同情况之间的系统调用有什么区别。但是如果我跑
strace ls /data/some/symlink/directory it also returns sub second suddenly.
Run Code Online (Sandbox Code Playgroud)
关于为什么通过 strace 运行它会使其速度更快以及如何进一步调试有什么想法吗?
我正在调试MoinMoinCentOS 上抛出权限错误的问题,但我无法追踪有问题的文件/目录在哪里。
我strace -vp <pid>在 apache pid 上运行;当我遇到问题时,我看到了这个:
epoll_wait(10, {{EPOLLIN, {u32=3487534344, u64=140367313734920}}}, 2, 10000) = 1
accept4(6, {sa_family=AF_INET6, sin6_port=htons(52621), inet_pton
(AF_INET6, "::ffff:105.193.30.91", &sin6_addr), sin6_flowinfo=0,
sin6_scope_id=0}, [28], SOCK_CLOEXEC) = 11
## Later on...
read(7, 0x7fffa658ad7f, 1) = -1 EAGAIN (Resource temporarily
unavailable)
Run Code Online (Sandbox Code Playgroud)
但是,由于 apache 已经在运行,因此我open()在称为7;的文件中没有看到对应的文件。因此我看到权限问题,但我仍然不知道哪个文件有问题。
我知道当我重生 apache 时我可以尝试捕获所有打开的文件,但我希望有一种方法可以将文件映射7到真实的文件名......有没有办法做到这一点?
编辑 1:
使用@lain 的指导,我跑了lsof | grep 266474069,但结果不清楚......
[root@lnxlmf moin]# ls -la /proc/9707/fd/7
lr-x------. 1 root root 64 Aug 28 …Run Code Online (Sandbox Code Playgroud)