我正在运行 Ubuntu 16.04.5 和 ext4 文件系统,并且我有一个文件会导致进程在读取它时挂起。
例如:
$ cat /path/to/file.txt
然后从一个单独的终端:
$ sudo cat /proc/24147/stack
[<ffffffff811937dd>] wait_on_page_bit_killable+0xcd/0xf0
[<ffffffff81193c86>] generic_file_read_iter+0x486/0x6b0
[<ffffffff8121395e>] new_sync_read+0x9e/0xe0
[<ffffffff812139c9>] __vfs_read+0x29/0x40
[<ffffffff81213f96>] vfs_read+0x86/0x130
[<ffffffff81214ce5>] SyS_read+0x55/0xc0
[<ffffffff81829d4e>] entry_SYSCALL_64_fastpath+0x22/0xc1
[<ffffffffffffffff>] 0xffffffffffffffff
我有许多进程挂起读取此文件。这是另一个具有不同调用堆栈的示例:
$ less /path/to/file.txt
然后从一个单独的终端:
$ sudo cat /proc/23006/stack
[<ffffffff8140f954>] call_rwsem_down_read_failed+0x14/0x30
[<ffffffff812a1e83>] ext4_map_blocks+0x443/0x5a0
[<ffffffff812edb98>] ext4_mpage_readpages+0x368/0x920
[<ffffffff8129f626>] ext4_readpages+0x36/0x40
[<ffffffff811a0b89>] __do_page_cache_readahead+0x199/0x240
[<ffffffff811a0d6d>] ondemand_readahead+0x13d/0x250
[<ffffffff811a101e>] page_cache_sync_readahead+0x2e/0x50
[<ffffffff81193d4a>] generic_file_read_iter+0x54a/0x6b0
[<ffffffff8121395e>] new_sync_read+0x9e/0xe0
[<ffffffff812139c9>] __vfs_read+0x29/0x40
[<ffffffff81213f96>] vfs_read+0x86/0x130
[<ffffffff81214ce5>] SyS_read+0x55/0xc0
[<ffffffff81829d4e>] entry_SYSCALL_64_fastpath+0x22/0xc1
[<ffffffffffffffff>] 0xffffffffffffffff
我需要稍微缩小实际问题的范围。上下文有些涉及(我正在运行 Apache 并使用 mod_wsgi,然后 Python 代码写入文件,该文件是一个日志文件,该卷是 AWS 实例上的实例存储之上的 RAID 阵列等) 。
是否有可能使 Linux 机器进入这样的状态:cat
“ing 一个文件”会导致终端挂起,如我上面所示。从那里我可以确定哪些附加上下文(如果有)在这里有用。
我应该提到的是,这种情况大约每个月都会在某台生产机器(大量使用)上发生。我可以重新启动机器来恢复,但我有兴趣了解它所处的状态。理想情况下,我想首先防止这种情况发生。