写入文件时 Apache 死锁

问题描述 投票:0回答:1

我在 Solaris 上使用 Apache v2.4.56,以及 libapr 1.6.2。启动它时,它会生成 5 个 httpd 进程。现在服务器有时会被锁定并且不再接受请求。连80端口都连接不上。

我对 5 个进程中的每一个进行了核心转储,发现其中两个似乎卡在同一个 write() 函数中。我想他们正在日志文件中写入事件,但我不确定。这是我配置日志的方法:

ErrorLog /data/log/HTTP.apache.log
LogLevel info
<IfModule log_config_module>
    LogFormat "%h %f %t \t%I \t%O \t%D" common
    CustomLog "|/usr/bin/logger -tHTTP -pdaemon.info" common
</IfModule>

这是第一个似乎死锁的进程的调用堆栈的示例:

------------  lwp# 6 / thread# 6  ---------------
 ffffffff730cb048 write    (b, ffffffff7e75b9ff, 1)
 ffffffff57d28ca8 apr_file_write (0x100267338?, 0xffffffff7e75b9ff?, 0xffffffff7e75b9e0?, 0x0?, 0x0?, 0x0?) + 1c8
 ffffffff57d28ff4 apr_file_putc (0x1?, 0x100267338?, 0x0?, 0x0?, 0x1?, 0x0?) + 1c
 ffffffff57d392c8 apr_pollset_wakeup (0x100266a50?, 0x0?, 0x0?, 0x0?, 0x100266a18?, 0x0?) + 20
 00000001000b4888 TO_QUEUE_APPEND (0x100221228?, 0x10032b700?, 0x0?, 0x0?, 0x100221258?, 0x10032b7b0?) + f0
 00000001000b6f5c process_socket (0x1002675c0?, 0x10032b378?, 0x10032b400?, 0x0?, 0x1?, 0x3?) + 8bc
 00000001000ba14c worker_thread (0x1002675c0?, 0x100215af0?, 0xffffffff7f582240?, 0xfffc00?, 0x1?, 0x3?) + 494
 ffffffff57d407a0 dummy_worker (0x1002675c0?, 0x0?, 0x1?, 0xffffffff57d40788?, 0x0?, 0x0?) + 18
 ffffffff730c58b4 _lwp_start (0x0?, 0x0?, 0x0?, 0x0?, 0x0?, 0x0?)

第二个进程的堆栈完全一样。

令我惊讶的是,在libapr的apr_file_write()源代码中,调用write()函数时似乎没有锁定机制。

您知道什么可能导致僵局吗?问题是否来自使用 CustomLog 和管道的配置?

apache http httpd.conf apr
1个回答
0
投票

回溯与日志记录无关,它是关于工作人员(请求处理线程)告诉专用侦听器线程有需要轮询的新活动。

我将从 APR 1.6.2 开始:https://bz.apache.org/bugzilla/show_bug.cgi?id=68830

问题是写入发生在管道上,因此如果另一端停止读取,工作线程中的写入将被阻塞。

© www.soinside.com 2019 - 2024. All rights reserved.