Linux 程序锁定,但在通过strace时不锁定

Linux 程序锁定,但在通过strace时不锁定,linux,wkhtmltoimage,Linux,Wkhtmltoimage,我正在使用wkhtmltoimage进行服务器端渲染,每次运行都会在“88%加载”状态下锁定1-2分钟。我决定通过strace调试正在发生的事情,但在一个完全奇怪的转折中,程序没有锁定。我发现这是完全可重复和一致的。究竟为什么strace会让程序更快,而实际上程序应该更慢 无障碍跑步: user@server:~/public_html/shapes$ time wkhtmltoimage --disable-smart-width --width 970 --format jpg '[THE

我正在使用wkhtmltoimage进行服务器端渲染,每次运行都会在“88%加载”状态下锁定1-2分钟。我决定通过strace调试正在发生的事情,但在一个完全奇怪的转折中,程序没有锁定。我发现这是完全可重复和一致的。究竟为什么strace会让程序更快,而实际上程序应该更慢

无障碍跑步:

user@server:~/public_html/shapes$ time wkhtmltoimage --disable-smart-width --width 970 --format jpg '[THE URL]' '[THE PATH].jpg'
Loading page (1/2)
Rendering (2/2)
Done

real    1m45.724s
user    1m42.887s
sys     0m0.623s
与strace一起跑步:

user@server:~/public_html/shapes$ time strace wkhtmltoimage --disable-smart-width --width 970 --format jpg '[THE URL]' '[THE PATH].jpg'
execve("/usr/local/bin/wkhtmltoimage", ["wkhtmltoimage", "--disable-smart-width", "--width", "970", "--format", "jpg", "[THE URL]"..., "[THE PATH]"...], [/* 21 vars */]) = 0
brk(0)                                  = 0x311a000
...
exit_group(0)                           = ?
+++ exited with 0 +++

real    0m6.526s
user    0m0.582s
sys     0m0.377s
服务器是私有的,所以我已经编辑了URL和路径,但在其他方面,输出是正确的。另外,两次运行都会创建正确的输出,我已经清除了临时文件,以确保不会出现缓存问题。我每次都做了10次这样的运行,以确保它不是一个随机的工件,但它始终发生,因此唯一合乎逻辑的结论是strace正在以某种方式改变wkhtmltoimage的行为,我真的希望有人能告诉我是什么。如果我知道为什么strace使程序不锁定,我可能会找到一个解决方案

以下是挂起的过程:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  772 sigapp    20   0 1485600  45760  14524 R  99.8  2.2   0:57.02 wkhtmltoimage
作为root用户,我可以使用
strace-p$(pidof wkhtmltoimage)
附加到挂起的图像,结果是:

gettimeofday({1436692542, 446246}, NULL) = 0
gettimeofday({1436692542, 556958}, NULL) = 0
gettimeofday({1436692542, 557161}, NULL) = 0
gettimeofday({1436692542, 659238}, NULL) = 0
gettimeofday({1436692542, 771381}, NULL) = 0
gettimeofday({1436692542, 771686}, NULL) = 0
gettimeofday({1436692542, 875783}, NULL) = 0
gettimeofday({1436692542, 987490}, NULL) = 0
gettimeofday({1436692542, 987781}, NULL) = 0
gettimeofday({1436692543, 84764}, NULL) = 0
...
系统:Linux服务器3.13.0-30-generic#55 Ubuntu SMP Fri Jul 4 21:40:53 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux(在2个CPU Xen Guest上运行)


软件:wkhtmltoimage 0.12.2.1(带补丁qt)尝试使用
-c
选项和
strace
。它可能会让您更好地了解可能发生的情况。堆栈跟踪可能会告诉您的不仅仅是
strace
。将
gdb
附加到该进程并执行
bt
。请参阅:这表明存在某种排序或同步/竞争条件,对gettimeofday的重复调用有点像某人重新实现某些并发原语并失败的味道。从一开始就偏离它会使整个过程慢下来,以至于你无法参加比赛。你试图呈现的页面上有很多JS吗?我会尝试这些建议。有很多JS和与SVG的交互,这可能就是问题所在。我刚刚尝试了另一个程序
webkit2pdf
,它似乎也挂起了。当然,他们都使用webkit。@SpliFF很高兴它成功了。我的东西肯定在评论类而不是答案类,所以我会保持原样。如果非要我猜的话,我倾向于将它放在WK包装中,而不是放在WK本身中(或者使用WK的版本?或者两者都使用?谁知道呢)。如果你喜欢冒险,你可以在PhantomJS()中试试,如果行得通的话,我完全会把它作为一个答案来写,并收集大量的互联网点数。
root@server:~# strace -p `pidof webkit2pdf`
Process 4699 attached
restart_syscall(<... resuming interrupted call ...>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7f9dbbbc1000
gettimeofday({1436696839, 361942}, NULL) = 0
gettimeofday({1436696839, 362254}, NULL) = 0
gettimeofday({1436696839, 362505}, NULL) = 0
gettimeofday({1436696839, 362787}, NULL) = 0
gettimeofday({1436696839, 363172}, NULL) = 0
gettimeofday({1436696839, 363568}, NULL) = 0
gettimeofday({1436696839, 363913}, NULL) = 0
mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7f9db5000000
gettimeofday({1436696839, 364701}, NULL) = 0
mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7f9db4ff9000
gettimeofday({1436696839, 365612}, NULL) = 0
gettimeofday({1436696839, 365956}, NULL) = 0