linux 错误:无法处理内核NULL指针解引用(null)

sg3maiej  于 2023-06-29  发布在  Linux
关注(0)|答案(1)|浏览(189)

我在192 GB RAM的Linux服务器上运行Java(TIBCO EBX),我们经常看到Java进程重新启动,应用程序将进入挂起状态,并发出高内存警报。我们将堆大小设置为176 GB,我们看到堆大小在10个小时的间隔后变满,内存利用率从未下降。如果我们重新启动服务器,内存利用率将下降。我们试图获取服务器的Kdump来分析内存泄漏,在vmcore-dmesg.txt中,我们看到了下面的条目。有没有人能建议一下这是否导致了我们的内存泄漏,以及我们如何解决这个问题?

[  389.832835] SysRq : Trigger a crash
[  390.049124] BUG: unable to handle kernel NULL pointer dereference at           (null)
[  390.050076] IP: [<ffffffffbb270326>] sysrq_handle_crash+0x16/0x20
[  390.050076] PGD 80000017c6c6e067 PUD 17fa9c8067 PMD 0

我们的内核版本如下:

$uname -r 
3.10.0-1062.52.2.el7.x86_64

$ uname -a
Linux sr001 3.10.0-1062.52.2.el7.x86_64 #1 SMP Thu Jul 8 09:03:01 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

任何其他建议/建议都可以看。

cetgtptt

cetgtptt1#

内核dmesg消息是通过SysRq机制故意触发崩溃的结果(使用神奇的SysRq组合键Alt-SysRq后跟c,或者将c写入“/proc/sysrq-trigger”文件)。(那些需要在内核中启用SysRq机制。)它们与内存泄漏无关。
当内核崩溃由SysRq机制触发时,“drivers/tty/sysrq.c”中的sysrq_handle_crash()函数(自内核2.6.37起)。对于3.10内核,它的函数定义如下:

static void sysrq_handle_crash(int key)
{
    char *killer = NULL;

    panic_on_oops = 1;  /* force panic */
    wmb();
    *killer = 1;
}

*killer = 1;行触发了导致内核死机的bug。但这并不是真正的bug,因为它是故意这样做的。
毫无疑问,BUG:的消息会让一些人感到震惊。在内核5.0中,该函数被更改为避免故意的空指针解引用,而是直接调用panic(),如下所示:

static void sysrq_handle_crash(int key)
{
    /* release the RCU read lock before crashing */
    rcu_read_unlock();

    panic("sysrq triggered crash\n");
}

(The rcu_read_unlock()调用之所以存在,是因为rcu_read_lock()在此函数调用之前被调用。
我怀疑内存泄漏可能是在应用程序中而不是在内核中。一种方法是终止应用程序。如果内存泄漏发生在应用程序中,那么当进程被杀死时,内存使用应该恢复正常。如果内存泄漏发生在内核中,则在内核重新引导之前,内存将无法进一步使用。

相关问题