我使用 zfs 来存储虚拟机备份,但是当我同时运行多个作业时,有时会出现在 dmesg 中
INFO: task z_iput:63527 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
z_iput D ffff9c0add81a080 0 63527 2 0x00000080
Call Trace:
[<ffffffffb5567c49>] schedule+0x29/0x70
[<ffffffffc09592d5>] cv_wait_common+0x125/0x150 [spl]
[<ffffffffb4ec2d00>] ? wake_up_atomic_t+0x30/0x30
[<ffffffffc0959315>] __cv_wait+0x15/0x20 [spl]
[<ffffffffc0acf493>] txg_wait_open+0xc3/0x110 [zfs]
[<ffffffffc0a70d1f>] dmu_free_long_range+0x27f/0x460 [zfs]
[<ffffffffc096c77a>] ? avl_add+0x4a/0x80 [zavl]
[<ffffffffc0af7cf5>] zfs_rmnode+0x2a5/0x360 [zfs]
[<ffffffffc0b19a3f>] ? zfs_znode_hold_exit+0xff/0x130 [zfs]
[<ffffffffc0b1deda>] zfs_zinactive+0xda/0xf0 [zfs]
[<ffffffffc0b15757>] zfs_inactive+0x87/0x200 [zfs]
[<ffffffffb4fc72f9>] ? truncate_pagecache+0x59/0x60
[<ffffffffc0b30463>] zpl_evict_inode+0x43/0x60 [zfs]
[<ffffffffb505eaa4>] evict+0xb4/0x180
[<ffffffffb505f3ac>] iput+0xfc/0x190
[<ffffffffc0954d7c>] taskq_thread+0x2ac/0x4f0 [spl]
[<ffffffffb4ed67b0>] ? wake_up_state+0x20/0x20
[<ffffffffc0954ad0>] ? taskq_thread_spawn+0x60/0x60 [spl]
[<ffffffffb4ec1c31>] kthread+0xd1/0xe0
[<ffffffffb4ec1b60>] ? insert_kthread_work+0x40/0x40
[<ffffffffb5574c1d>] ret_from_fork_nospec_begin+0x7/0x21
[<ffffffffb4ec1b60>] ? insert_kthread_work+0x40/0x40
我应该担心这个吗?我怎么知道是什么原因造成的?
答案1
因此,该消息只是告诉您某些 ZFS 线程被阻塞了几分钟,但没有说明是什么阻塞了它。其中很多是由高负载导致某种临时“资源不足”情况引起的。
查看您发布的特定堆栈跟踪,看起来 ZFS 正在尝试逐出 inode(可能是在文件被删除之后或其他什么?),并且要做到这一点,我猜它必须等待新的事务组打开。这可能意味着早期txg
需要很长时间才能写出来,这可能是因为里面的IO很多txg
,花了很长时间才全部写出来。
至于是否担心,我想说,只有当它引起明显的性能问题时,这一切才重要。如果您经常看到它们并且没有看到相应的性能问题,则使用消息本身中的建议来消除它们可能是安全的。