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集群,发现内存的占用明显降下来了!!!

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当Linux系统出现内存溢出时,可以通过以下步骤进行排查: 1. 查看系统日志,特别是/var/log/messages和/var/log/syslog文件,以查找任何与内存相关的错误或警告信息。 2. 使用top或htop等工具查看系统的内存使用情况,以确定哪些进程占用了大量的内存。 3. 使用ps命令查看进程列表,并使用pmap命令查看每个进程的内存映射,以确定哪些进程使用了大量的内存。 4. 使用free命令查看系统的内存使用情况,以确定是否存在内存泄漏或其他内存问题。 5. 使用vmstat命令查看系统的虚拟内存使用情况,以确定是否存在内存交换或其他虚拟内存问题。 6. 如果以上步骤无法解决问题,可以考虑使用内存分析工具,如valgrind或gdb,来进一步分析进程的内存使用情况。 ### 回答2: 一、查看系统内存使用情况 首先,我们需要了解系统的内存使用情况,可以使用以下命令查看: top 通过 top 命令可以查看系统进程的内存占用情况,可以根据内存占用情况确定是否存在内存溢出问题。 另外,还可以使用 free 命令来查看系统的内存使用情况: free -m 这个命令会输出系统的内存总量、已用内存、空闲内存等信息,可以帮助我们快速了解系统内存使用情况。 二、查看进程内存占用情况 确定了系统的内存占用情况后,我们就需要查看具体的进程内存占用情况了。 我们可以使用以下命令来查看某个进程的内存占用情况: ps aux | grep 进程名称 例如,查看名为“tomcat”的进程内存情况,可以输入以下命令: ps aux | grep tomcat 这个命令会列出进程的详细信息,包括进程 ID、内存占用情况等。 查看进程内存占用情况还可以使用更加详细的命令: pmap 进程ID 这个命令会输出给定进程的内存映射信息,包括进程占用的物理内存和虚拟内存等。 三、使用内存监控工具 除了命令行工具,我们还可以使用一些内存监控工具来帮助我们排查内存溢出问题。 常用的内存监控工具包括: 1. top top 命令可以在实时显示系统进程的 CPU 和内存占用情况,并且可以按照内存占用情况进行排序。 2. htop htop 是一个更加直观的进程监控工具,它可以显示进程树和进程的状态等详细信息。 3. Glances Glances 是一个跨平台的监控工具,它可以监控系统的 CPU、内存、硬盘、网络等多种指标,可以通过 Web 界面进行访问,并且可以通过插件扩展其功能。 四、通过日志排查内存溢出问题排查内存溢出问题时,还可以通过日志来查看具体的错误信息和堆栈跟踪信息,从而找到产生内存溢出的代码。 一般来说,我们可以查看应用程序的错误日志或者系统日志来排查内存溢出问题。 总结 要排查 Linux 内存溢出问题,我们需要了解系统的内存使用情况,查看进程的内存占用情况,并且可以使用内存监控工具和日志来找到具体的问题。同时,我们还可以通过一些优化措施,比如调整进程的内存限制、优化代码等来减少内存使用。 ### 回答3: Linux内存管理是一个复杂的系统,可以通过一系列的工具和命令来检测与诊断内存问题。其中,最常用的方法是使用系统监控工具,并结合内核日志来判断内存是否正在溢出。 以下是一些可能的排查方法: 1. 监控系统的内存使用情况。可以使用 top 命令来查看正在使用内存量排名前几的进程,并结合 free 命令来查看系统的整体内存使用情况。如果内存使用量超过了系统可用内存大小,就应该怀疑内存溢出的存在。 2. 扫描内核日志。内核在出现内存问题时会有日志记录,可以使用 dmesg 命令来查看系统的内核信息。如果发现日志中有内存相关的警告或错误信息,就需要重视并进行排查。 3. 使用 valgrind 工具来检测内存泄漏。valgrind 是一个用于调试内存问题的工具,可以检测程序是否存在内存泄漏等问题。 4. 检查是否存在进程泄漏。某些程序可能会导致内存泄漏,特别是有大量进程存在时。可以使用 ps 命令来检查正在运行的进程情况,结合其他工具也可进行进一步排查。 5. 通过软件更新解决问题。有时候,内存问题可能是由软件版本或补丁更新不及时导致,因此及时更新软件可能会修复内存问题。 6. 借助第三方工具进行排查。还可以使用一些第三方的内存排查工具,如 memtester、mtrace、ElectricFence 等等来检测和解决内存问题。 总之,在排查内存问题时需要结合多种方式,综合分析来判断内存是否正在溢出,并尽快采取相应的解决措施来避免内存问题影响系统的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值