【服务器内存】内存使用率过高排查

背景:

某台服务器上同时部署应用程序、redis。资源:4c8g,内存使用率连续半个月90%以上,为预防故障发生进行排查。

(一篇不错的jvm调优博文:https://mp.weixin.qq.com/s/Od9qjM0lMUHi5jUWZmS4Iw)

方案:

一、查看占用内存的情况

1.获取服务信息

top 按m

2.分析信息

5188进程,VIRT(虚拟内存)使用16.2g,RES占用6.9g,%MEM(内存占用率)89.4%

2178进程为redis进程占用18m

3.结果

可以看出占用资源较大的为java进程

进一步分析可使用以下命令,查看占用内存资源的情况。

/opt/jdk/bin/jmap -histo [进程号]

/opt/jdk/bin/jmap -histo [进程号]
/opt/jdk/bin/jstat -gcutil [进程号]

jmap命令相关博文:https://www.cnblogs.com/qq78292959/p/5141209.html

二、查看redis内存使用情况

1.获取服务信息

进入redis安装目录,进入src或bin目录下,执行以下命令:

 ./redis-cli -p 6379

输入命令auth 密码,显示ok后,输入info

示例:

2.分析信息

# Memory

used_memory:13490096 //数据占用了多少内存(字节 byte)

used_memory_human:12.87M //数据占用了多少内存(带单位的,可读性好)

used_memory_rss:13490096 //redis占用了多少内存

used_memory_peak:15301192 //占用内存的峰值(字节)

used_memory_peak_human:14.59M //占用内存的峰值(带单位的,可读性好)

used_memory_lua:31744 //lua引擎所占用的内存大小(字节)

mem_fragmentation_ratio:1.00 //内存碎片率

mem_allocator:libc //redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。

3.结果

占用内存11m(与top结果一致),不大排除redis数据占用内存过大

三、查看tomcat配置jvm参数

1.获取信息,查看tomcat的bin目录下的catalina.sh

# OS specific support.  $var _must_ be set to either true or false.
JAVA_OPTS="-Xms3072m -Xmx10240m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=1024m"
cygwin=false
darwin=false
os400=false
hpux=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
HP-UX*) hpux=true;;
esac

2.分析信息

-Xmx3g -Xms3g,将JVM最大内存与初始内存设置相等,避免JVM垃圾回收后重新分配内存;

jvm调优的相关博文:https://blog.csdn.net/weixin_41987553/article/details/82670914  https://www.cnblogs.com/likehua/p/3369823.html

3.结果

服务器资源为8g,设置的Xmx为10g过大,需要调小此参数或进行内存扩容

猜你喜欢

转载自blog.csdn.net/xiaren_1988/article/details/111311885