Linux报 “resource deadlock avoided” 异常的原因以及解决办法

  1. 原因

Resource deadlock是操作系统在调度多个进程时,当其中两个或多个进程占有相互依赖的资源时,由于资源竞争导致进程陷入死锁状态。Linux kernel会实现资源分配器resource allocator,调度资源给进程,避免进程间出现竞争或死锁状态。当资源调度器检测到死锁时,会发出"resource deadlock avoided"的报错信息。

报错信息会列出死锁进程和死锁状态资源的相关信息,如下的示例可以看到,死锁发生在两个进程间的semaphore wait()调用中,竞争的资源是主程序里的semaphore:

[ 1325.502637] INFO: task test:3453 blocked for more than 120 seconds.
[ 1325.502688] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 1325.502759] test           D ffffffff8180c540     0  3453      1 0x00000080
[ 1325.502820]  ffff88081926b0a8 0000000000000082 0000000000017840 ffffffff81b4d4c0
[ 1325.502890]  ffff88081926b1d8 ffff88087fd9c600 ffff88081926b010 ffffffff815c3400
[  1325.502946]  ffff88081926b020 ffff88087fd9c680 ffff88081926b020 ffffffff8180c540
[  1325.503009] Call Trace:
[  1325.503042]  [<ffffffff8180c540>] ? schedule_timeout+0x210/0x210
[  1325.503117]  [<ffffffff813b68ea>] io_schedule+0x5a/0xc0
[  1325.503183]  [<ffffffff813c29f8>] wait_on_page_bit+0xe8/0x100
[  1325.503250]  [<ffffffff812b1130>] ? wake_bit_function+0x40/0x40
[  1325.503320]  [<ffffffff813c2ad4>] wait_on_page_writeback_range+0xf4/0x170
[  1325.503387]  [<ffffffff810c1180>] ? wake_up_atomic_t+0x30/0x30
[  1325.503454]  [<ffffffff811d5c5f>] ? remove_inode_hash+0x2f/0x60
[  1325.503522]  [<ffffffff813c2e5a>] filemap_write_and_wait_range+0x3a/0x50
[  1325.503591]  [<ffffffff811d60aa>] generic_file_buffered_write+0xfa/0x240
[  1325.503661]  [<ffffffff811d6694>] __generic_file_aio_write+0x364/0x490
[  1325.503723]  [<ffffffff812d84bb>] ? do_futex+0x1fb/0x4f0
[  1325.503791]  [<ffffffff8101a51f>] ? __wake_up+0x4f/0x70
[  1325.503853]  [<ffffffff811d67f2>] generic_file_aio_write+0x62/0xc0
[  1325.503917]  [<ffffffff811a5e80>] do_sync_write+0xc0/0x110
[  1325.503982]  [<ffffffff810dbdfe>] ? __set_task_blocked+0x3e/0x80
[  1325.504047]  [<ffffffff811a6edd>] vfs_write+0xbd/0x1a0
[  1325.504109]  [<ffffffff811a810c>] SyS_write+0x7c/0xf0
[  1325.504171]  [<ffffffff81069605>] ? audit_syscall_entry+0x2c5/0x300
[  1325.504236]  [<ffffffff818121e2>] entry_SYSCALL_64_fastpath+0x16/0x75
[  1325.504307] INFO: task crasher:3584 blocked for more than 120 seconds.
[  1325.504360] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[  1325.504431] crasher        D ffff8807f73995c0     0  3584      1 0x00000080
[  1325.504489]  ffff88080d0ab6d8 0000000000000046 0000000000017840 ffffffff81b4d4c0
[  1325.504555]  ffff88080d0ab308 ffff88077620ce00 ffff88080d0ab540 ffffffff813526b7
[  1325.504618]  ffff88080d0ab540 ffff88077620ce80 ffff88080d0ab540 ffffffff8180c540
[  1325.504690] Call Trace:
[  1325.504721]  [<ffffffff8180c540>] ? schedule_timeout+0x210/0x210
[  1325.504807]  [<ffffffff813b68ea>] io_schedule+0x5a/0xc0
[  1325.504877]  [<ffffffff813c29f8>] wait_on_page_bit+0xe8/0x100
[  1325.504961]  [<ffffffff812b1130>] ? wake_bit_function+0x40/0x40
[  1325.505033]  [<ffffffff813c2ad4>] wait_on_page_writeback_range+0xf4/0x170
[  1325.505113]  [<ffffffff810c1180>] ? wake_up_atomic_t+0x30/0x30
[  1325.505185]  [<ffffffff811d5c5f>] ? remove_inode_hash+0x2f/0x60
[  1325.505258]  [<ffffffff811d5cc0>] __filemap_fdatawait_range+0x70/0xb0
[  1325.505329]  [<ffffffff811d75ba>] filemap_fdatawait+0x2a/0x30
[  1325.505396]  [<ffffffff8120c17e>] __sync_filesystem+0x7e/0x90
[  1325.505466]  [<ffffffff8120c1be>] sync_filesystem+0x2e/0x40
[  1325.505535]  [<ffffffff8121c8ad>] fsync_bdev+0x3d/0x60
[  1325.505600]  [<ffffffff811a8048>] do_fsync+0x38/0x60
[  1325.505662]  [<ffffffff811a84cd>] SyS_fsync+0xd/0x10
[  1325.505725]  [<ffffffff818121e2>] entry_SYSCALL_64_fastpath+0x16/0x75

[   23.321994] BUG: sleeping function called from invalid context at /build/linux-hvetwq/linux-4.6.0/fs/ext4/inode.c:1279
[   23.322019] in_atomic(): 1, irqs_disabled(): 1, pid: 313, name: ps
[   23.322046] INFO: lockdep is turned off.
[   23.322068] DEBUG_LOCKS_WARN_ON(lockdep_static_key_disabled(&EXT4_I(inode)->i_mmap_sem.dep_map))
[   23.322093] CPU: 1 PID: 313 Comm: ps Tainted: G        W       4.6.0-1-amd64 #1 Debian 4.6.4-1
[   23.322117] Hardware name: Dell Inc. OptiPlex 9020/0PC5F7, BIOS A24 07/13/2018
[   23.322152]  0000000000000000 0000000084fe243c ffff88011e415c00 ffffffff818165d2
[   23.322177]  ffff88011e415c00 ffff88060fff7140 ffffed00001d17ec 0000000000000001
[   23.322201]  0000000000000000 ffff88011e415da8 ffff88011e415d08 ffffffff812a247a
[   23.322225] Call Trace:
[   23.322282]  [<ffffffff818165d2>] dump_stack+0x5c/0x78
[   23.322316]  [<ffffffff812a247a>] ___might_sleep+0xfa/0x130
[   23.322345]  [<ffffffff812c8b00>] __mutex_lock_slowpath+0x190/0x2b0
[   23.322371]  [<ffffffff812c8eb8>] ? __mutex_lock_slowpath+0x848/0x2b0
[   23.322398]  [<ffffffff812c8eb8>] ? __mutex_lock_slowpath+0x848/0x2b0
[   23.322426]  [<ffffffff8109ac18>] ? prepare_to_wait_event+0x108/0x170
[   23.322453]  [<ffffffff812c8dea>] __mutex_lock_slowpath+0x27a/0x2b0
[   23.322480]  [<ffffffff812c9c74>] mutex_lock+0x24/0x40
[   23.322506]  [<ffffffff8127f3b6>] ext4_file_mmap+0x16/0x30
[   23.322532]  [<ffffffff811a5f8e>] do_mmap_pgoff+0x29e/0x320
[   23.322557]  [<ffffffff811a60fa>] SyS_mmap_pgoff+0xfa/0x190
[   23.322584]  [<ffffffff81812c2e>] entry_SYSCALL_64_fastpath+0x12/0x75
  1. 解决办法

在解决Resource deadlock问题时,可以考虑以下几个方面:

2.1 检查死锁原因

首先需要明确死锁原因,根据报错信息可以定位死锁发生的进程和资源。如果死锁原因不明确,可以使用strace、gdb等工具进行跟踪定位。

2.2 检查共享资源的使用

当多个进程共同竞争一个资源时,容易发生死锁。因此,在代码中需要检查并减少全局变量、共享内存、文件系统等资源的使用。

2.3 加锁顺序

加锁顺序可以影响资源竞争的发生。如果两个进程按照不同的顺序获取锁,容易引起死锁。因此,在多个进程之间协作时,需要约定加锁的顺序。

2.4 减少锁的粒度

在多个进程间协作时,需要使用锁来协调资源的访问。但是加锁会导致竞争和死锁的发生。可以通过减少锁的粒度、使用更细粒度的锁来减轻竞争和死锁的问题。

  1. 示例

**问题:

一个游戏服务器的后端在处理请求时,使用了共享数据类型map,服务器的每次请求都会变更map中的数据,但是从机器日志中看到了"resource deadlock avoided"的信息。**

解决步骤:

  1. 检查死锁进程:

从日志中发现死锁进程的PID为1000。

[2021-05-23 13:23:35] INFO: task Server_1 (pid=1000) blocked for more than 120 seconds.  (schedule_timeout+0x2a6/0x450)
  1. 确认死锁原因:

从日志中同时可以发现,死锁进程的行为涉及到map类型数据结构。

  1. 检查map的代码是否有锁覆盖:

从日志中发现,map的操作涉及到IO,因此产生了锁。这个map可能与IO共享同一把锁,应该考虑减少锁的粒度。

  1. 更换map的实现:

可以尝试对原代码进行更改,采用另一种map实现方式,或者更换数据类型。这样可以尝试减少锁的竞争,降低多个进程之间的锁覆盖的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux报 “resource deadlock avoided” 异常的原因以及解决办法 - Python技术站

(0)
上一篇 2023年3月24日
下一篇 2023年3月24日

相关文章

  • Linux报 “device or resource busy” 异常的原因以及解决办法

    首先,Linux报”device or resource busy”的原因是因为某个进程正在占用该设备或资源,导致其他进程无法访问该设备或资源。 解决该问题的办法有以下几种: 查找占用该设备或资源的进程,然后将其停止或结束。可以使用以下命令查找进程: lsof | grep <设备或资源名> 例如,如果想查找占用/dev/sda1设备的进程,可以…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “operation timed out” 异常的原因以及解决办法

    原因: Linux系统中的“operation timed out”提示通常是由于网络连接失败而引起的。这个错误消息表示错误操作在规定的时间内未能完成,因为收到了超时错误。 在Linux系统中,“operation timed out”错误通常是由以下原因之一引起的: 1)网络连接故障。例如,连接的目标在规定的时间内没有响应或未能响应。2)延迟时间过长。例如…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “resource busy or locked” 异常的原因以及解决办法

    Linux中的 resource busy or locked 错误通常会发生在访问设备文件、文件系统、网络端口等系统资源时。此错误通常是由于操作系统已经将该资源锁定,以保证其一致性和安全性,因此其他程序无法对其进行修改或访问。 有以下几个常见的导致该错误的原因及解决办法: 1. 文件被占用 当一个文件正在被其他程序占用时,尝试再次访问该文件会导致 reso…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “device is not a socket” 异常的原因以及解决办法

    当你在使用Linux系统时,有时候会遇到报“device is not a socket”的错误。该错误通常是因为在使用socket进行通信时,文件描述符并不指向一个socket,而是指向了一个不支持socket接口的设备。 以下是一个示例: 假设我们有一个名为“my_socket”的进程,它正在监听端口12345来接收来自客户端的连接。我们可以使用以下命令…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “file exists” 异常的原因以及解决办法

    当在Linux系统中尝试创建一个已经存在的文件或目录时,会遇到 “file exists” 错误。这个错误提示的意思是该文件或目录已经存在,无法再次创建。以下是可能导致此问题的原因和解决方案,以及一些示例。 原因 同名文件或目录已经存在。 文件权限设置不正确,当前用户没有写入文件或目录的权限。 解决办法 方法一:检查文件是否存在 检查指定的文件或目录是否已经…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “operation not supported” 异常的原因以及解决办法

    针对这个问题,我会给你提供较为详细的解释和解决方法。下面是我整理的具体步骤: 1. 问题原因 出现 “operation not supported” 错误可能是因为以下原因之一: 缺少权限:在某些情况下,需要拥有管理员权限才能执行该操作。 硬件驱动问题:驱动程序可能不支持某些操作或不被正确安装。 文件系统问题:在某些操作或情况下,文件系统可能不支持或不允许…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “invalid multicast source filter” 异常的原因以及解决办法

    以下是关于Linux报invalid multicast source filter的原因与解决办法的详细讲解。 报错原因 当网络包源地址(SA)与组播数据的源地址不匹配时,Linux内核会报 invalid multicast source filter 的错误。这是由于Linux内核默认开启了多播源地址过滤器,用于保护组播路由器,并防止主机伪造源地址加入…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “process is not running” 异常的原因以及解决办法

    Linux中报process is not running的错误,一般是指程序运行时无法找到对应的进程,导致无法正常启动应用程序。主要原因有以下几种: 1.应用程序未正确安装或配置 如果您在安装过程中出现错误,可能会导致应用程序没有正确安装或配置,从而无法启动正常的进程。解决方法是重新安装或重新配置应用程序。 2.进程被意外终止或重启 如果应用程序运行时遭遇…

    Linux常见异常 2023年3月24日
    00
合作推广
合作推广
分享本页
返回顶部