Linux 内存 占用较高问题排查

niuhao307523005 2019-04-24 14:31:55 11087 收藏 11
展开
一 查看内存情况
#按 k 查看

free

#按兆M查看

free -m

total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
#所以空闲内存=free+buffers+cached=total-used
内存的使用情况
cat /proc/meminfo

查看进程的内存占用
pidstat -r -p 24427 1 5

内存占用高的前20
ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20

动态查看内存占用
slabtop

二 问题定位

cached 占用过高问题
buffer,cached的作用:

cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完 .
     Free中的buffer和cache:(它们都是占用内存):
     buffer : 作为buffer cache的内存,是块设备(磁盘)的缓冲区,包括读、写磁盘
     cache: 作为page cache的内存, 文件系统的cache,包括读、写文件
     如果 cache 的值很大,说明cache住的文件数很多。

linux服务器会自动释放内存,保障系统运行,但只会释放够用的内存,而不会去释放更多的内存。

解决方法:
手动释放cached方法有三种(系统默认值是0,释放之后你需要再改回0值):
释放前最好sync一下,防止丢数据

sync 在启动机器或关机之前一定要运行sync命令。记住在任何情况下,慎重地执行sync命令决不会有任何坏处,sync命令强制把磁盘缓冲的所有数据写入磁盘

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

#常用方法是

sync

echo 1 > /proc/sys/vm/drop_caches

#清除后要还原系统默认配置:
echo 0 > /proc/sys/vm/drop_caches

#查看设置
 sysctl -a | grep drop_caches
补充: echo 字符串 > 文件  就是把字符串内容从定向到文件中

 

这时查看 free  可以看到 cached 降低了很多

三 linux vm内核参数优化设置
(1)vm.min_free_kbytes
sysctl -a | grep min_free_kbytes        #centos6.4默认66M

67584                            该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。

当可用内存低于这个参数时,系统开始回收cache内存,以释放内存,直到可用内存大于这个值。

#改为1g

命令:sysctl -w  vm.min_free_kbytes=1048576

(如果命令执行不成功,直接编辑文件进行替换即可)

#查看是否改动

sysctl -a | grep min_free_kbytes

(1)vm.overcommit_memory

执行grep -i commit  /proc/meminfo

看到CommitLimit和Committed_As参数。

CommitLimit是一个内存分配上限,CommitLimit = 物理内存 * overcommit_ratio(默认50,即50%) + swap大小

Committed_As是已经分配的内存大小。

--------

vm.overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2                             
0: (默认)表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。0 即是启发式的overcommitting handle,会尽量减少swap的使用,root可以分配比一般用户略多的内存
1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何,允许超过CommitLimit,直至内存用完为止。在数据库服务器上不建议设置为1,从而尽量避免使用swap.
2: 表示不允许超过CommitLimit值
 
(2)vm.overcommit_ratio

默认值为:50 (即50%)

这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。

------------------------------------------------------------------------------

vm.vfs_cache_pressure

该项表示内核回收用于directory和inode cache内存的倾向:

缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比

降低该值低于100,将导致内核倾向于保留directory和inode cache

增加该值超过100,将导致内核倾向于回收directory和inode cache。

网上文章建议 执行命令:

sysctl -a | grep vfs_cache_pressure

sysctl -w  vm.vfs_cache_pressure=200

其实一般情况下不需要调整,只有在极端场景下才建议进行调整,只有此时,才有必要进行调优,这也是调优的意义所在。

vm.dirty_background_ratio   默认为10

所有全局系统进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行。

将vm.dirty_background_ratio设置为5-10,将vm.dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待(和MySQL中的innodb_max_dirty_pages_pct类似)

vm.dirty_ratio   默认为20

单个进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行。

--------------------------------------------------

vm.panic_on_oom    默认为0开启    为1时表示关闭此功能

等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程。

当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉。

而且计算分值时主要参照 /proc/<PID>/oom_adj ,  oom_adj 取值范围从-17到15,当等于-17时表示在任何时候此进程都不会被 oom killer kill掉(适用于mysql)。

/proc/[pid]/oom_adj ,该pid进程被oom killer杀掉的权重,介于 [-17,15]之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。

/proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算后的结果,是oom_killer的主要参考。

sysctl 下有2个可配置选项:

vm.panic_on_oom = 0                      #内存不够时内核是否直接panic

       vm.oom_kill_allocating_task = 1       #oom-killer是否选择当前正在申请内存的进程进行kill

Linux 内存 占用较高问题排查的更多相关文章

  1. [转帖]Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  2. 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?

    摘要:该项目是DAYU平台的数据开发(DLF),数据开发中一个重要的功能就是ETL(数据清洗).ETL由源端到目的端,中间的业务逻辑一般由用户自己编写的SQL模板实现,velocity是其中涉及的一种 ...

  3. CLR Profile解决内存占用过高

    CLR Profile解决内存占用过高的问题 炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样." 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况 ...

  4. [2017-08-09]一则使用WinDbg工具调试iis进程调查内存占用过高的案例

    最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2. 这台服务器上装了SqlServer.TFS(项 ...

  5. 通过修改my.ini配置文件来解决MySQL 5.6 内存占用过高的问题

    打开后台进程发现mysql占用的内存达到400+M. 修改一下my.ini这个配置文件的配置选项是可以限制MySQL5.6内存占用过高这一问题的,具体修改选项如下: performance_schem ...

  6. 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例

    最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...

  7. Spring cloud开发内存占用过高解决方法

    https://blog.csdn.net/wanhuiguizong/article/details/79289986 版权声明:本文为博主原创文章,转载请声明文章来源和原文链接. https:// ...

  8. (转)aix非计算内存 占用过高 案例一则

    原文:http://www.talkwithtrend.com/Article/28621 两台小型机组成的RAC环境,在用topas查看资源使用情况时,发现一台机器的非计算内存占用过高: MEMOR ...

  9. Window下MySql 5.6 安装后内存占用很高的问题

    Window下MySql 5.6 安装后内存占用很高的问题 刚刚准备玩一把mysql,初学者 环境是window 7和window sever 2008, mysql是最新的5.6, 发现的问题是安装 ...

随机推荐

  1. 3w 字长文爆肝 Java 基础面试题!太顶了!!!

    hey guys ,这不是也到了面试季了么,cxuan 又打算重新写一下 Java 相关的面试题,先从基础的开始吧,这些面试题属于基础系列,不包含多线程相关面试题和 JVM 相关面试题,多线程和 JV ...

  2. Win10环境下YOLO5 快速配置与测试

    目录 一.更换官方源 二.安装Pytorch+CUDA(python版本) 三.YOLO V5 配置与验证 四.数据集测试 五.小结 不想看前面,可以直接跳到标题: 一.更换官方源 在 YOLO V5 ...

  3. Recoil 默认值及数据级联的使用

    Recoil 中默认值及数据间的依赖 通过 Atom 可方便地设置数据的默认值, const fontSizeState = atom({ key: 'fontSizeState', default: ...

  4. mysql基础自学

    1.1基础查询 语法:select 查询列表 from 表名;注意:1.查询列表可以是:表中的字段.常量值.表达式.函数2.查询的结果是一个虚拟表格 完整的写法是:先声明使用哪个库,再写SQL语 如果 ...

  5. BUAA_OS lab2 难点梳理

    BUAA_OS lab2 难点梳理 实验重点 所列出的实验重点为笔者在进行lab2过程中认为需要深刻理解的部分. 进行内存访问的流程 熟悉mips内存映射布局,即理解mmu.h内图 二级页表的理解和实 ...

  6. JavaScript课程——Day01

    1.网页由三部分组成: 1.1.HTML:超文本标记语言,专门编写网页内容的语言.(结构) 1.2.CSS:层叠样式表.(样式) 1.3.javaScript:网页交互的解释性脚本语言,专门编写客户端 ...

  7. 小程序使用 Promise.all 完成文件异步上传

    小程序使用 Promise.all 完成文件异步上传 extends [微信小程序开发技巧总结(二) -- 文件的选取.移动.上传和下载 - Kindear - 博客园 (cnblogs.com)] ...

  8. python 爬取王者荣耀英雄皮肤代码

    import os, time, requests, json, re, sys from retrying import retry from urllib import parse "& ...

  9. 1083 List Grades

    Given a list of N student records with name, ID and grade. You are supposed to sort the records with ...

  10. 路由器逆向分析------binwalk工具的详细使用说明

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/66971242 一.binwalk工具的基本用法介绍 1.获取帮助信息 $ binw ...