Linux 内存使用率缓慢增长原因排查

2023-07-26 08:51:29 +08:00
 wxd21020

背景:

Linux 内存使用率缓慢增长排查,目前有一台服务器,上面部署了 17 个微服务应用,24G8C 的配置,所有应用启动后内存占用率在 45%左右,经过一个月的运行后内存会涨到 75%左右,然后服务器就 hung 住了,连 ssh 都无法连接,已经出现过两次了。

目前排查方案:

请问大佬们这种情况改从哪个方向再去排查一下。 目前即使向定位原因。

接下来会将应用拆分放到多台服务器上。

5235 次点击
所在节点    Java
63 条回复
ricwangcom
2023-07-26 08:54:22 +08:00
微服务的日志把硬盘挤爆了?
diagnostics
2023-07-26 08:57:26 +08:00
ssh 连不上和内存没多大关系,SSH 后无法用 tab 补全那就是磁盘不足
wxd21020
2023-07-26 08:59:46 +08:00
@ricwangcom 磁盘没爆,内存爆了
wxd21020
2023-07-26 09:01:02 +08:00
@diagnostics 我感觉是没内存分配了所以 ssh 连不上了,因为重启机器后我查看了所有应用的日志,错误信息都是 OOM ,且没有内存创建 thread
Weixiao0725
2023-07-26 09:06:51 +08:00
按照进程监控内存?这种问题肯定先定位哪个程序引起的问题
mineralsalt
2023-07-26 09:07:06 +08:00
内存不可能凭空消失吧, 找到占用内存最多的进程, 排查它不就好了么
LindsayZhou
2023-07-26 09:09:06 +08:00
用 cgroup 限制一下各个服务的内存大小?
至少不影响服务器本身的运行。
wxd21020
2023-07-26 09:12:45 +08:00
@Weixiao0725 最近使用 top 隔几个小时我就会去看一遍,基本上有几个应用一天会长 0.1%,这是目前定位的最后手段了。
wxd21020
2023-07-26 09:13:44 +08:00
@mineralsalt 前五个应用占用内存差不太多,5.1,4.9,4.9,4.8,4.6
wxd21020
2023-07-26 09:14:43 +08:00
@LindsayZhou java 服务启动的时候倒是设置了 Xmx 。
Jackliu
2023-07-26 09:16:31 +08:00
内存泄漏
allenzhangSB
2023-07-26 09:24:36 +08:00
看下是不是堆外内存泄露了
llrasd
2023-07-26 09:25:55 +08:00
百度下 glibc 内存泄漏 ;之前我们有这个问题
wzy44944
2023-07-26 09:33:19 +08:00
服务器没有配置 OOM-kill 吗?可以先配一下,等有进程 oom 重启后,看下 dmesg 就知道是哪个了。可以用 cgroup 限制内存。不过你这个是多个微服务,也可以用一个 docker 跑所有微服务,容器启动参数加--memory 18G ,限制总内存在 18G ,这样 docker 内会 oomkill ,不影响你 ssh 到主机做排查。要复现就在 docker 启动参数再加个 --oom-kill-disable=true
Ggmusic
2023-07-26 09:34:41 +08:00
@wxd21020 划重点:没有内存创建线程。这种情况下系统的内存是足够的,但是你没法起新线程了,估计是有个 java 进程持续不断创建线程,可以监控下各个进程创建的线程数。https://www.bmc.com/blogs/outofmemory-java-threads/
crsmk01
2023-07-26 09:36:24 +08:00
贴下 os 版本、jvm 版本、相关的内存参数(堆、栈、Directory Memory 、Code Cache 等)
1 、是不是在用 docker / k8s 在运行这些微服务应用 ?如果是,贴下 docker 分配的内存 or 微服务 pod 的 request / limit mem
2 、如果只是一个主机直接跑 java 进程,可以观察一下出问题的时候 sys cpu 是否很高,挑占用内存较高的前三个进程,用 pmap -xp <jvm_pid> 看下结果
securityCoding
2023-07-26 09:50:53 +08:00
优先看系统日志找出有问题的进程
popvlovs
2023-07-26 09:51:43 +08:00
从现象上看,比较赞成#15 的推测,首先线程创建是要消耗内存的(只创建不释放也算一种泄漏,现象符合),另外创建的太多达到操作系统上限后,也会导致操作系统 hung 住无响应
quan7u
2023-07-26 10:03:13 +08:00
监控主机资源,看看文件描述符的增长趋势
hsymlg
2023-07-26 10:03:46 +08:00
看进程,jvm 监控的里面内存正常,并不代表 java 进程内存是正常的,我记得 java8 的大多数场景 jvm 一旦从 os 那边获取内存,就不愿意会还回去了。可以看看这个 https://stackoverflow.com/questions/30458195/does-gc-release-back-memory-to-os

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/959746

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX