今天我的服务器变得不负责任,我什至无法登录 ssh,但当我在上面运行我自己的服务器应用程序时,我能够恢复“顶级”数据。
服务器正在运行,但不接受任何新连接,但我的应用程序仍在向我的 Web 界面发送“top”命令的输出:2% CPU 使用率 0.0% wa load 110 ?如何 ?
我在系统日志中发现了一些可疑的内容: https://pastebin.com/u8kLCJEM
它出现了大约 10 次,然后当我来时(1 小时后)系统日志中没有更多消息,我只是截取了顶部(110 负载)并完全重新启动了服务器,一切正常。但我想知道为什么我的服务器崩溃以及如何防止它发生?
答案1
我在您的系统日志中没有看到任何非常可疑的内容。
我能看到什么:
- 你有一个 JVM(java 虚拟机),占用了 ≈ 64GB RAM
- 您有 64 GB 物理 RAM
- 你没有交换
所以,这就是你的问题的原因。你的 JVM 正在泄漏。
您必须以某种方式杀死它,然后重新启动它。
你的 top 和 web 控制台工作的原因是有一点空闲内存,并且当你的 JVM 发疯时它们已经在运行了。因此,他们不需要分配太多的 RAM,而且他们使用的少量 RAM 也可以。
其他事情,你想开始的事情,就没那么幸运了。例如,您的 sshd 似乎无法分叉新进程(以及新 shell)。
JVM 喜欢吃很多 RAM,但不是那么多。 64GB已经是极限了。您的服务器托管的 Web 应用程序中有些问题。到底是什么,只有通过更深入地检查其上运行的 Web 应用程序才能找到它。
为了让你的系统正常工作,首先你必须以某种方式杀死那个 JVM。从命令行,一个简单的kill -9 13116
任务就可以完成,但你现在没有命令行。
然而,命令行top
能杀死进程(按 k,选择 PID),也许您的基于 Web 的顶部也存在相同的功能。
如果没有任何效果,您必须重新启动。
从长远来看:您应该使用 JVM 标志并限制其内存使用。在 .ini 文件中的某个位置,您可以为其设置标志,这些标志是:-Xmx<number> -Xms<number>
。检查这些。详细信息取决于您的应用程序服务器。
这种 RAM 狂暴在 Java 中并不常见,其中有些东西不太对劲。只有知道你的应用程序才能准确地说出它是什么。
安全漏洞,我在你的日志中看不到。