linux服务器内存快要溢出问题排查与解决

今天在工作的过程中,发现有一台服务器的内存达到了90%以上,所以立即对该台服务器进行了问题排查。
一、 问题排查思路

  1. 利用top命令查看进程信息(整体来看)
top //使用top命令用于实时显示 process 的动态信息 按大写的M,进行排序内存大的排在前面,按小写的c命令,查看运行命令的绝对路径

查看情况如下图所示:
在这里插入图片描述在这里插入图片描述

  1. 我们先来看一下java进程占用系统内存高的排查方法

(1) 定位线程问题(通过命令查看99626进程的线程情况)

ps p 99626 -L -o pcpu,pmem,pid,tid,time,tname,cmd

在这里插入图片描述
由此可以看到这PID:99626的进程产生了很多线程。接下来就可以通过jstack查看内存使用的堆栈。,具体可以执行 :

//用来查具体有多少线程 
ps p 99626 -L -o pcpu,pmem,pid,tid,time,tname,cmd |wc -l 

在这里插入图片描述

(2) 查看内存使用的堆栈:在这里我们挑选了TID=99631的线程进行分析,首先需要将99631这个id转换为16进制。需输入如下命令:

printf "%x\n" 99631

(3) 将PID为99636的堆栈信息打印到jstack.log中,命令:

jstack -l 99636 > /gis/jstack.log

在这里插入图片描述
(4) 查看了日志,看到elasticsearch线程好多waiting的,然后我就检查了一下服务器上已启动的es集群情况,看是否有问题:

curl ip:port/_cat/health?v //用于检查es集群健康情况

在这里插入图片描述
说明:发现服务器上es集群很健康,并没有什么异常状态,但从es日志上观察到有些错误信息(对于位置的查看输入了无效的纬度值),但是我们还不能肯定到底是什么问题
在这里插入图片描述

(5) 检查后端接口是否在调用es过程中,出现什么问题(gisaddrsel)
在这里插入图片描述

  1. 通过查看java进程,并没有从根本上查看到内存占用较高的原因;接下来我们再来看一下redis进程占用系统内存高的排查方法
{
    "msg": "MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.; nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.",
    "resultcode": "-1"
}

中文大概的意思就是:

{
“msg”:“missf Redis已配置为保存RDB快照,但当前无法在磁盘上持久化。可以修改数据集的命令被禁用,因为此实例配置为在RDB快照失败时报告写入期间的错误(停止对bgsave error的写入选项)。请检查Redis日志以获取有关RDB错误的详细信息;嵌套异常是Redis.clients.jedis.exceptions.JedisDataException:missf Redis已配置为保存RDB快照,但它当前无法在磁盘上保持。可以修改数据集的命令被禁用,因为此实例配置为在RDB快照失败时报告写入期间的错误(停止对bgsave error的写入选项)。请检查Redis日志以获取有关RDB错误的详细信息。“,
“结果代码”:“-1”
}

提取到的有用信息如下:
在这里插入图片描述
解决办法:
大家可以在服务器上写一个连接redis的脚本,然后执行脚本连接redis主机

127.0.0.1:6379> config set stop-writes-on-bgsave-error no //执行就可以了
  1. 总结

通过查看所有的redis集群,并分别查看redis配置信息,命令如下:

127.0.0.1:6379>config get * //查看redis配置所有信息 

然后查看该stop-writes-on-bgsave-error配置是为yes还是no,如果为yes就改成no,最后都改完成之后,重启redis集群,发现内存的占用明显降下来了!!!

发布了23 篇原创文章 · 获赞 15 · 访问量 6264

猜你喜欢

转载自blog.csdn.net/xiaoleilei666/article/details/104664891