我正在使用 wkhtmltoimage 进行服务器端渲染,每次运行都锁定在“88% 加载”1-2 分钟。我决定通过 strace 调试正在发生的事情,但完全奇怪的是,程序没有锁定。我发现这是完全可重复和一致的。当程序理所当然应该更慢时,为什么 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 和 PATH,但是输出是正确的。此外,两次运行都创建了正确的输出,并且我已经清除了临时文件以确保它不是缓存问题。我已经完成了这些运行 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
作为根,我可以使用附加到挂起的图像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)<-通过.deb文件从官方网站安装
我已阅读此内容但不确定是否相关:Hung processes resume if attach to strace
更新:
尝试使用另一个程序webkit2pdf
并看到锁定。这次 strace 输出不同。这两个程序都使用 webkit。:
root@server:~# strace -p `pidof webkit2pdf`
Process 4699 attached
restart_syscall(<... resuming interrupted call ...>
在成功运行时,strace wkhtmltoimage ...
我可以看到类似的调用,但不像 mmap 之前那么多:
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
因此,根据pvg下面的评论,这很可能是在正常工作与不正常工作的情况下正常setAttribute
工作的锁定机制。strace