Apache写入文件时出现死锁问题排查求助
Apache进程锁死问题描述
- 环境:Solaris系统,Apache v2.4.56,搭配libapr 1.6.2,启动后生成5个httpd进程
- 现象:服务器偶尔锁死,无法接收请求,甚至80端口无法连接;核心转储显示两个进程卡在同一个
write()函数 - 日志配置:
ErrorLog /data/log/HTTP.apache.log LogLevel info <IfModule log_config_module> LogFormat "%h %f %t %I %O %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配置有关?
问题分析与结论
- 核心原因:管道日志的阻塞特性
你配置的CustomLog通过管道将日志输出给/usr/bin/logger进程。Solaris系统中,管道写操作在缓冲区满且读端未及时读取数据时,会导致写进程阻塞。如果logger进程意外退出或处理速度跟不上Apache的日志输出,管道读端会被关闭,此时后续的write()调用会触发SIGPIPE信号,若Apache未正确处理该信号(或信号被屏蔽),进程就会一直卡在write()调用中无法返回。 - 多进程同时卡住的原因
多个Apache worker进程共享同一个管道描述符输出日志,当管道出现阻塞或读端异常时,所有尝试写管道的进程都会被卡在write()调用上,这就是两个进程调用栈完全相同的原因。 - libapr无锁定机制的影响
虽然apr_file_write()本身没有加锁,但管道作为共享资源,多进程并发写会导致日志内容交织,更关键的是管道的阻塞特性直接导致进程挂起,这才是服务器锁死的核心,而非传统意义上的“死锁”(资源互斥等待)。 - 解决方案建议
- 替换管道日志为文件日志:将
CustomLog改为直接写入本地文件,避免管道阻塞风险,示例:CustomLog /data/log/HTTP.access.log common - 监控
logger进程状态:若必须使用管道日志,用Solaris的smf工具将logger配置为守护进程,异常退出时自动重启。 - 启用日志缓冲:在
CustomLog后添加buffer=size参数(需确认Apache版本支持),减少频繁写操作。 - 处理SIGPIPE信号:确保Apache进程正确处理
SIGPIPE信号,避免因管道写失败挂起。
- 替换管道日志为文件日志:将
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

