此问题是that question的扩展名。
再一次:我在CentOS 6.0下工作,我有一个远程win7文件夹,安装有:
mount -t cifs //PC128/mnt /media/net -o "username=WORKGROUP\user,password=pwd,rw,noexec,soft,uid=user,gid=user"
当远程文件夹不可用时(例如拔出网线),尝试访问远程文件夹会锁定我正在处理的应用程序。起初我检测到QDir :: exists()导致锁定20-90秒(我仍然无法找出为什么会出现这种差异),进一步我检测到任何对stat()函数的调用都会导致应用程序锁定。
我按照上面的主题提供的建议,我将QDir :: exists()调用(以及稍后 - 调用stat()函数)移动到另一个线程,这并没有解决问题。当连接突然丢失时,应用程序仍然挂起。 Qt trace显示锁在内核中的某个位置:
0 __kernel_vsyscall
1 __xstat64@GLIBC_2.1 /lib/libc.so.6
2 QFSFileEnginePrivate::doStat stat.h
我还试图在尝试访问文件夹本身之前检查是否仍然挂载了远程共享,但它没有帮助。方法如:
mount | grep /media/net
显示即使没有与网络的活动连接,仍然会挂载共享文件夹。
检查文件夹状态差异,例如:
stat -fc%t:%T /media/net/ != stat -fc%t:%T /media/net/..
也会挂起约20秒。
所以我有几个问题:
答案 0 :(得分:9)
你的问题:“一个无法访问的网络文件系统”是一个众所周知的例子,它触发了linux 挂起任务,这与僵尸进程完全不同(杀死父PID不会做任何东西)
挂起任务,是触发导致内核出现问题的系统调用的任务,因此系统调用永远不会返回。 主要特点是调度程序将任务声明为“D”状态,这意味着程序处于不可中断状态。这意味着你无法阻止你的程序:你可以触发任务的所有信号,它不会响应。启动数百个SIGTERM / SIGKILL什么都不做!
这是我的旧内核的情况:当我的nfs服务器崩溃时,我需要重启客户端以使用文件系统终止任务。很久以前我编译了它(我的hdd上还有构建树)在配置过程中我在lib / Kconfig.debug中看到了这个:
config DETECT_HUNG_TASK
bool "Detect Hung Tasks"
depends on DEBUG_KERNEL
default LOCKUP_DETECTOR
help
Say Y here to enable the kernel to detect "hung tasks",
which are bugs that cause the task to be stuck in
uninterruptible "D" state indefinitiley.
When a hung task is detected, the kernel will print the
current stack trace (which you should report), but the
task will stay in uninterruptible state. If lockdep is
enabled then all held locks will also be reported. This
feature has negligible overhead.
它只是建议在检测时发现这样的tash或恐慌:我没有检查最近的内核是否真的可以解决问题(你的问题似乎就是这种情况),但我认为它不值得启用它。
还有第二个问题:正常情况下,检测发生在120秒后,但我也看到了一个Konfig选项:
config DEFAULT_HUNG_TASK_TIMEOUT
int "Default timeout for hung task detection (in seconds)"
depends on DETECT_HUNG_TASK
default 120
help
This option controls the default timeout (in seconds) used
to determine when a task has become non-responsive and should
be considered hung.
It can be adjusted at runtime via the kernel.hung_task_timeout_secs
sysctl or by writing a value to
/proc/sys/kernel/hung_task_timeout_secs.
A timeout of 0 disables the check. The default is two minutes.
Keeping the default should be fine in most cases.
这也适用于内核线程:示例:将循环设备制作到fuse文件系统上的文件。然后崩溃控制fuse文件系统的用户空间程序! 你应该得到一个Ktread,其名称是loopX形式(X通常对应你的环回设备号)HUNGING!
网络链接:
https://unix.stackexchange.com/questions/5642/what-if-kill-9-does-not-work(看看ultrasawblade写的答案)
http://www.linuxquestions.org/questions/linux-general-1/kill-a-hung-task-when-kill-9-doesn“叔帮助-697305 /
http://forums-web2.gentoo.org/viewtopic-t-811557-start-0.html
http://comments.gmane.org/gmane.linux.kernel/1189978
http://comments.gmane.org/gmane.linux.kernel.cifs/7674 (这是与您类似的情况)
在你的三个问题的情况下:你有答案:这可能是由于vfs linux内核层中可能是一个众所周知的错误! (没有CIFS超时)