返回顶部
首页 > 资讯 > 操作系统 >Linux系统中内存不足如何排查
  • 504
分享到

Linux系统中内存不足如何排查

2023-06-16 18:06:29 504人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关linux系统中内存不足如何排查,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。问题描述Linux服务器内存使用量超过阈值,触发报警。问题排查首先,通过free命令

这篇文章将为大家详细讲解有关linux系统中内存不足如何排查,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

问题描述

Linux服务器内存使用量超过阈值,触发报警。

问题排查

首先,通过free命令观察系统的内存使用情况,显示如下:

total       used       free     shared    buffers     cached Mem:      24675796   24587144      88652          0     357012    1612488 -/+ buffers/cache:   22617644    2058152 Swap:      2096472     108224    1988248

其中,可以看出内存总量为24675796KB,已使用22617644KB,只剩余2058152KB。

然后,接着通过top命令,shift + M按内存排序后,观察系统中使用内存***的进程情况,发现只占用了18GB内存,其他进程均很小,可忽略。

因此,还有将近4GB内存(22617644KB-18GB,约4GB)用到什么地方了呢?

进一步,通过cat /proc/meminfo发现,其中有将近4GB(3688732 KB)的Slab内存:

...... Mapped:          25212 kB Slab:          3688732 kB PageTables:      43524 kB ......

Slab是用于存放内核数据结构缓存,再通过slabtop命令查看这部分内存的使用情况:

OBjs ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME 13926348 13926348 100%    0.21K 773686       18   3494744K dentry_cache 334040 262056  78%    0.09K   8351       40     33404K buffer_head 151040 150537  99%    0.74K  30208        5    120832K ext3_inode_cache

发现其中大部分(大约3.5GB)都是用于了dentry_cache。

问题解决

修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档):

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free. To free pagecache: * echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: * echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries and inodes: * echo 3 > /proc/sys/vm/drop_caches As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed. This tunable was added in 2.6.16.

方法1需要用户具有root权限,如果不是root,但有sudo权限,可以通过sysctl命令进行设置:

$sync $sudo sysctl -w vm.drop_caches=3 $sudo sysctl -w vm.drop_caches=0 #recovery drop_caches

操作后可以通过sudo sysctl -a | grep drop_caches查看是否生效。

修改/proc/sys/vm/vfs_cache_pressure,调整清理inode/dentry caches的优先级(默认为100),LinuxInsight中有相关的解释:

At the default value of vfs_cache_pressure = 100 the kernel will attempt to reclaim dentries and inodes at a “fair” rate with respect to pagecache and swapcache reclaim. Decreasing vfs_cache_pressure causes the kernel to prefer to retain dentry and inode caches. Increasing vfs_cache_pressure beyond 100 causes the kernel to prefer to reclaim dentries and inodes.

具体的设置方法,可以参考方法1或者方法2均可。

参考资料

  • https://www.kernel.org/doc/Documentation/sysctl/vm.txt

  • Http://major.io/2008/12/03/reducing-inode-and-dentry-caches-to-keep-oom-killer-at-bay/

  • http://linux-mm.org/Drop_Caches


以下记录的是进一步排查的进展情况。

更深层次的原因

上文排查到Linux系统中有大量的dentry_cache占用内存,为什么会有如此多的dentry_cache呢?

首先,弄清楚dentry_cache的概念及作用:目录项高速缓存,是Linux为了提高目录项对象的处理效率而设计的;它记录了目录项到inode的映射关系。因此,当应用程序发起stat系统调用时,就会创建对应的dentry_cache项(更进一步,如果每次stat的文件都是不存在的文件,那么总是会有大量新的dentry_cache项被创建)。

当前服务器是stORM集群的节点,首先想到了storm相关的工作进程,strace一下storm的worker进程发现其中有非常频繁的stat系统调用发生,而且stat的文件总是新的文件名:

sudo strace -fp <pid> -e trace=stat

进一步观察到storm的worker进程会在本地目录下频繁的创建、打开、关闭、删除心跳文件,每秒钟一个新的文件名:

sudo strace -fp <pid> -e trace=open,stat,close,unlink

以上就是系统中为何有如此多的dentry_cache的原因所在。

一个奇怪的现象

通过观察/proc/meminfo发现,slab内存分为两部分:

SReclaimable // 可回收的slabSUnreclaim // 不可回收的slab

当时服务器的现状是:slab部分占用的内存,大部分显示的都是SReclaimable,也就是说可以被回收的。

但是通过slabtop观察到slab内存中最主要的部分(dentry_cache)的OBJS几乎都是ACTIVE的,显示100%处于被使用状态。

OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   13926348 13926348 100%    0.21K 773686       18   3494744K dentry_cache334040 262056  78%    0.09K   8351       40     33404K buffer_head151040 150537  99%    0.74K  30208        5    120832K ext3_inode_cache

为什么显示可回收的,但是又处于ACTIVE状态呢?求Linux内核达人看到后热心解释下:(

会不会由于是ACTIVE状态,导致dcache没有被自动回收释放掉呢?

让系统自动回收dcache

上一小节,我们已经提到,服务器上大部分的slab内存是SReclaimable可回收状态的,那么,我们能不能交给操作系统让他在某个时机自动触发回收操作呢?答案是肯定的。

查了一些关于Linux dcache的相关资料,发现操作系统会在到了内存临界阈值后,触发kswapd内核进程工作才进行释放,这个阈值的计算方法如下:

首先,grep low /proc/zoneinfo,得到如下结果:

low      1        low      380        low      12067

将以上3列加起来,乘以4KB,就是这个阈值,通过这个方法计算后发现当前服务器的回收阈值只有48MB,因此很难看到这一现象,实际中可能等不到回收,操作系统就会hang住没响应了。

可以通过以下方法调大这个阈值:将vm.extra_free_kbytes设置为vm.min_free_kbytes和一样大,则/proc/zoneinfo中对应的low阈值就会增大一倍,同时high阈值也会随之增长,以此类推。

$ sudo sysctl -a | grep free_kbytes       vm.min_free_kbytes = 39847vm.extra_free_kbytes = 0$ sudo sysctl -w vm.extra_free_kbytes=836787  ######1GB

举个例子,当low阈值被设置为1GB的时候,当系统free的内存小于1GB时,观察到kswapd进程开始工作(进程状态从Sleeping变为Running),同时dcache开始被系统回收,直到系统free的内存介于low阈值和high阈值之间,停止回收。

关于Linux系统中内存不足如何排查就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Linux系统中内存不足如何排查

本文链接: https://lsjlt.com/news/284677.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux系统中内存不足如何排查
    这篇文章将为大家详细讲解有关Linux系统中内存不足如何排查,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。问题描述Linux服务器内存使用量超过阈值,触发报警。问题排查首先,通过free命令...
    99+
    2023-06-16
  • linux可用内存不足如何排查清理
    当Linux系统的可用内存不足时,可以按照以下步骤进行排查和清理: 使用free命令查看系统内存使用情况: $ free -h ...
    99+
    2023-10-24
    linux
  • linux内存溢出如何排查
    要排查Linux内存溢出的问题,可以采取以下步骤:1. 检查系统日志:查看系统日志文件(如/var/log/messages或/va...
    99+
    2023-09-12
    linux
  • win7系统内存不足怎么办
    小编给大家分享一下win7系统内存不足怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、打开开始菜单,点击右侧的控制面板。 二、在弹出的控制面板中...
    99+
    2023-06-28
  • linux如何判断内存是否不足
    在Linux系统中,可以使用以下几种方法来判断内存是否不足:1. 使用free命令:free命令可以查看系统当前的内存使用情况。可以...
    99+
    2023-10-09
    linux
  • Linux系统内存占用过高排查方法
    以下以Ubuntu系统为例,内存占用过高可能是因为某个进程或程序占用了过多的内存,您可以按照以下步骤进行排查: 以上是一些基本的排查步骤,它们可以帮助您确定内存占用过高的原因,并采取相应的措施解决问题。 使用 top 命令查看系统当前...
    99+
    2023-09-12
    linux 运维 服务器
  • Linux系统中如何查看最消耗CPU内存
    这篇文章主要为大家展示了Linux系统中如何查看最消耗CPU内存,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Linux系统中如何查看最消耗CPU内存”这篇文章吧。1.CPU占用最多的前10个进程...
    99+
    2023-06-28
  • linux系统很卡如何排查
    小编给大家分享一下linux系统很卡如何排查,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.查看内存使用情况free -g当观察到free栏已为0的时候,表示内...
    99+
    2023-06-12
  • matlab内存不足如何解决
    当Matlab内存不足时,可以尝试以下解决方法:1. 优化代码:检查代码中是否有不必要的变量、循环或计算,尽量减少内存使用量。2. ...
    99+
    2023-09-15
    matlab
  • composer内存不足如何处理
    这篇文章给大家分享的是有关composer内存不足如何处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。composer 内存不足报错信息如下PHP Fatal error: All...
    99+
    2023-06-25
  • win7内存不足如何清理
    要清理Win7内存不足,可以按照以下步骤进行操作:1. 关闭不必要的程序:打开任务管理器(Ctrl + Shift + Esc),在...
    99+
    2023-08-31
    win7
  • windows7内存不足如何解决
    本篇内容主要讲解“windows7内存不足如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows7内存不足如何解决”吧!解决方法1,右击计算机,选择属性选项。计算机在win7可能桌...
    99+
    2023-07-01
  • jvm内存不足如何解决
    当JVM内存不足时,可以考虑以下解决方案:1. 增加JVM的堆内存大小:通过调整JVM的启动参数,增加堆内存的大小。可以通过修改-X...
    99+
    2023-08-11
    jvm
  • windows照片查看器内存不足如何解决
    本文小编为大家详细介绍“windows照片查看器内存不足如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows照片查看器内存不足如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2023-03-02
    windows
  • Linux怎么查看系统内存
    这篇文章主要介绍“Linux怎么查看系统内存”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux怎么查看系统内存”文章能帮助大家解决问题。1. /proc/meminfo一种最简单的方法是通过“...
    99+
    2023-06-28
  • Linux系统怎么查看内存
    本文将为大家详细介绍“Linux系统怎么查看内存”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Linux系统怎么查看内存”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获新知识吧...
    99+
    2023-06-28
  • android系统存储空间不足如何解决
    以下是一些解决Android系统存储空间不足的方法: 删除不必要的应用程序和文件:首先,您可以删除您不再需要的应用程序、照片、视频...
    99+
    2024-03-13
    android
  • linux系统依赖关系不满足如何解决
    当Linux系统中的依赖关系不满足时,可以尝试以下解决方法:1. 使用包管理器:利用Linux发行版的包管理器,如APT、YUM、D...
    99+
    2023-09-22
    linux
  • Win8.1系统提示内存不足怎么办?Win8.1提示内存不足的两种解决方法
      Win8.1系统提示内存不足的两种解决方法: 方法一:   1、 开始菜单里搜索“服务”,点击第一个“查看本地服务”;   2.、找到...
    99+
    2022-06-04
    提示 内存不足 两种
  • 如何在Linux系统中查找不存在的PHP进程
    标题:如何在Linux系统中查找不存在的PHP进程 在Linux系统中,查找特定的PHP进程需要使用一些特定的命令和技巧。有时候,我们可能需要查找那些已经不存在但仍然占据系统资源的PH...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作