当我在 Apache 上使用strace
而它没有响应时,我得到以下输出:
[pid 13704] fcntl(57, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = -1 EAGAIN (Resource temporarily unavailable)
这意味着什么?进程需要什么样的锁才能再次响应?
答案1
fcntl(57, F_SETLK, …)
意味着该进程正在尝试锁定在文件描述符 57 上打开的文件。该错误EGAIN
意味着锁定失败,因为它已被另一个进程占用。该锁具体位于文件中从偏移量 1073741824 到偏移量 1073741825 的部分。
在 Linux 上,您可以使用lslocks
查看正在持有哪些锁。要找到谁拥有 Apache 正在等待的锁,您需要知道它所在的文件;lsof -p $pid
会告诉你 fd 57 上打开了什么文件。
假设该进程需要锁才能继续,则在拥有锁的其他进程释放它之前,它不会做出响应。问题不是资源不可用且需要创建,而是现有资源当前正忙。