奇怪的是,我在任何地方都找不到它,但是当我将 strace 的输出标准输出到这样的文件中时:
strace foo.exe | & tee foo.log
Run Code Online (Sandbox Code Playgroud)
输出很短,我怎样才能使宽度更长?
目前我们的服务器存在一些问题,间歇性地,我们似乎得到了 apache 进程,这些进程只是运行和运行,占用 100% 的 CPU。
运行 top 时,我们看到以下内容:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/apache2 -k start
23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/apache2 -k start
Run Code Online (Sandbox Code Playgroud)
我想尝试找出导致这种情况的脚本(或任何脚本),所以我尝试了:
strace -p 20788
Run Code Online (Sandbox Code Playgroud)
但这根本没有显示任何输出(我已经离开了大约 10 分钟,它什么也没显示)。根据我的理解,这可能意味着它陷入了无限循环,并且没有任何“系统调用”可以显示。
我还能做些什么来显示正在发生的事情吗?
谢谢
编辑 -忘了说,这是一个随时都有几百个用户的实时服务器!所以我真的不能随意尝试更改配置选项并重新启动 apache。
编辑 2 - 当 PHP 未配置 --enable-debug 时,来自 gdb 的回溯 (bt) 似乎并不是那么有用 - 它只显示“execute()”,但我需要知道 PHP 脚本是什么实际运行..还有其他方法吗?
#0 0x00007f6c143fb0c5 …Run Code Online (Sandbox Code Playgroud) 有时一个过程来来去去的速度比我快ps aux,我试过,watch -d -n0.1 "ps aux | tail"但又一次,限制在 1/10 秒。我真正想要的是运行一个命令并在所有新进程产生时跟踪它们,每行一个。即使是运行速度很快的进程。我知道strace有与此类似的能力,但我无法让它做我想做的事。
tl;dr : 有没有办法记录所有新进程?
我不想知道太多,不超过一行ps aux会给我,对于目前的情况,我只有一个由另一个产生并消失的进程,我希望能够运行它,但我不知道命令是什么。即使知道新的 PID 就足够了,因为我可以想出一个脚本来获取这些并ps | grep在这些上运行并在进程运行时为我提供更多信息(假设希望进程在运行时仍然存在ps)
如果在 Linux 上,我 strace 一个进程,那么读取和写入将显示文件描述符句柄号。如果我查看,/proc/$PID/fd我可以看到与 fd 编号(如果适用)对应的文件的符号链接。
无论如何让strace为我做这个查找并(通过取消引用符号链接)向我显示strace输出中的文件名?它已经查找 Linux errno 并截断和编码字符串,那么它也可以这样做吗?
更新:我知道 strace 会显示open显示路径和 fd的调用。这对于短期运行的进程来说很好。但是假设我有一个很长的运行过程(以天为单位),并且没有在 strace 下运行整个过程,只是稍后使用strace -p.
我对 strace / netstat / 等很陌生。我正在使用此命令来跟踪处理我的请求 (telnet) 的 apache 进程,有没有办法稍微简化一下?
sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \
grep $(lsof -p `pidof telnet` | grep TCP | \
perl -n -e'/localhost:(\d+)/ && print $1') | grep apache2 | \
perl -n -e'/ESTABLISHED (\d+)/ && print $1')
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有几个进程占用了大量系统 CPU 时间(通过查看 vmstat 确定)。有没有一种简单的方法可以找出正在执行的系统调用类型?
我知道有 strace,但是有没有更快更简单的方法?是否存在类似于系统调用的“顶部”之类的东西?
我运行了许多 CentOS 服务器。我最近偶尔会这样做,yum update但这在少数服务器上失败了。在大多数情况下,我已经能够通过以下方式前进:
# yum clean all
# rm -f /var/lib/rpm/__db*
# rpm --rebuilddb
# yum update
Run Code Online (Sandbox Code Playgroud)
但是在一台服务器上,yum clean命令挂起。我试过运行:
# yum -v --noplugins clean all
Run Code Online (Sandbox Code Playgroud)
但我根本没有输出。百胜只是挂起,如果我让它在那里坐几个小时,不使用任何 CPU,只是停止。正在做
# strace -f yum -v --noplugins clean all
Run Code Online (Sandbox Code Playgroud)
产生相当多的输出,但随后停止:
...
stat64("/var/lib/rpm/__db.003", {st_mode=S_IFREG|0644, st_size=450560, ...}) = 0
open("/var/lib/rpm/__db.003", O_RDWR|O_LARGEFILE) = 4
fcntl64(4, F_SETFD, FD_CLOEXEC) = 0
mmap2(NULL, 450560, PROT_READ|PROT_WRITE, MAP_SHARED, 4, 0) = 0xb6b34000
close(4) = 0
stat64("/var/lib/rpm/Packages", {st_mode=S_IFREG|0644, st_size=14938112, ...}) = 0
open("/var/lib/rpm/Packages", O_RDONLY|O_LARGEFILE) = 4
fcntl64(4, F_SETFD, …Run Code Online (Sandbox Code Playgroud) 我看到tail -f在 CoreOS 的 Docker 容器内运行命令时出现了一些奇怪的行为。
我能想到的许多变量可能会导致问题,但我不确定首先需要做什么来排除故障。在 CoreOS 上,我正在运行支持 overlayfs 的最新版本,以及较新版本的 Docker (1.4.1)。
有趣的是,我能够在运行不同版本 Docker (1.3) 的不同主机操作系统 (Ubuntu 14.04) 上成功跟踪日志。
如果这有助于排除故障,我可以生成 strace 日志,它们似乎在主机之间存在显着差异。例如,在不工作的主机上,在 strace 输出中读入以下内容后,strace 停止:
04:03:03 inotify_add_watch(4, "f017f0a1-a1e9-11e4-90bc-027e0f87cac6-paster.log", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 <0.000028>
04:03:03 fstat(3, {st_mode=S_IFREG|0644, st_size=12229, ...}) = 0 <0.000022>
04:03:03 read(4, 0x7711f0, 64) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <3.101545>
Run Code Online (Sandbox Code Playgroud)
我只是对 strace 不够熟悉,无法很好地解释结果。
今天我注意到我的 LDAP 服务器 (OpenDS) 在每个可用内核上消耗 100% 的 CPU。快速诊断显示我在 futex 锁定期间有很多 ETIMEDOUT。
我如何调试它以找出发生了什么以及如何修复它?
futex(0x7f7ecf9053a4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1540779077, {1342114766, 309244206}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7f7ecf9053d0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7ecf9053a4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1540779079, {1342114766, 309528293}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7f7ecf9053d0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7ecf9053a4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1540779081, {1342114766, 309812186}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7f7ecf9053d0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f7ecf9053a4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1540779083, {1342114766, 310107537}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7f7ecf9053d0, FUTEX_WAKE_PRIVATE, 1) = 0 …Run Code Online (Sandbox Code Playgroud) 我的 Apache 服务器需要很长时间来处理请求。我将 strace 附加到它,可以看到以下两个延迟:
1) 非常关键(处理 143 秒)
1335 0.000037 write(16, "\235\0\0\0\3INSERT INTO `br_anonymous_user_tokens` (`dtExpires`, `nmToken`, `dtCreated`) VALUES ('2014-08-25', '46e35dc39a41e836b806f48d21621b066ea182a9', '2014-06-25')", 161) = 161
1335 0.000111 read(16, "\t\0\0\1\0\1\374\262\n\2\0\0\0", 16384) = 13
1335 143.588134 gettimeofday({1403675497, 653337}, NULL) = 0
Run Code Online (Sandbox Code Playgroud)
文件描述符 #16 似乎是 mysql 套接字:
line from strace
1335 0.000328 socket(PF_LOCAL, SOCK_STREAM, 0) = 16
Run Code Online (Sandbox Code Playgroud)
和这里
pidof mysqld
15393
lsof -p 15393
mysqld 15393 mysql 12u IPv4 26913133 0t0 TCP *:mysql (LISTEN)
Run Code Online (Sandbox Code Playgroud)
因此,Apache 似乎正在等待 mysql 执行上一行写入套接字的查询。我对吗?这是否意味着我需要了解为什么 MySQL 执行简单查询需要这么长时间?
2)很长
1335 0.000040 …Run Code Online (Sandbox Code Playgroud) strace ×10
linux ×5
apache-2.2 ×2
bash ×1
coreos ×1
debug ×1
docker ×1
java ×1
logging ×1
monitoring ×1
mysql ×1
opends ×1
performance ×1
process ×1
ps ×1
tail ×1
top ×1
ubuntu-12.04 ×1
yum ×1