我在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
任何其他建议/建议都可以看。
1条答案
按热度按时间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内核,它的函数定义如下:*killer = 1;
行触发了导致内核死机的bug。但这并不是真正的bug,因为它是故意这样做的。毫无疑问,
BUG:
的消息会让一些人感到震惊。在内核5.0中,该函数被更改为避免故意的空指针解引用,而是直接调用panic()
,如下所示:(The
rcu_read_unlock()
调用之所以存在,是因为rcu_read_lock()
在此函数调用之前被调用。我怀疑内存泄漏可能是在应用程序中而不是在内核中。一种方法是终止应用程序。如果内存泄漏发生在应用程序中,那么当进程被杀死时,内存使用应该恢复正常。如果内存泄漏发生在内核中,则在内核重新引导之前,内存将无法进一步使用。