快速定位系统内存问题的思路

一、怎么样衡量系统内存1、查看系统内存的使用情况,比如已用内存,剩余内存,共享内存,可用内存,缓存和缓冲区的用量。

  • 已用内存和剩余内存,就是已经使用和还未使用的内存。
  • 共享内存,是通过tmpfs来实现的,它的大小就是tmpfs使用的内存大小,tmpfs其实也是一种特殊的缓存。
  • 可用内存,就是新进程可以使用的最大内存,包括剩余内存和可回收内存
  • 缓存,缓存包括磁盘读取文件的页缓存和Slab分配器中的可回收内存。页缓存用来缓存从磁盘读取的数据。
  • 缓冲区,是对原始磁盘块的l临时存储,用来缓存将要写入磁盘的数据,这样内核就可以把分散的写集中起来,统一优化磁盘写入。

2、查看进程内存的使用情况,比如进程的虚拟内存,常驻内存,共享内存已经swap内存。

  • 虚拟内存,包括进程的代码段,数据段,共享内存,已经申请的堆内存和已经换出的内存等。注意:已经申请的内存,即使还没有分配物理内存,也算作是虚拟内存。
  • 常驻内存,进程实际使用的物理内存,不包括swap和共享内存。
  • 共享内存,它既包括与其他进程共同使用的真实的共享内存,还包括加载的动态链接库和程序的代码段。
  • swap内存,指通过swap换出到磁盘的内存。
  • 缺页异常,系统在调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常分为下面两种场景:
    1. 通过直接从物理内存分配,称为次缺页异常。
    2. 需要磁盘IO接入时,称为主缺页异常。

二、内存的性能分析工具
1、更具内存指标找对应的工具


2、根据性能工具看内存指标


三、定位内存问题为了快速定位内存问题,通常我会先运行几个覆盖率比较大的性能工具,比如free,top,vmstat,pidstat具体的思路如下:

  1. 先用free和top查看系统整体d的内存使用情况。
  2. 再用vmstat和pidstat,查看一段时间的趋势,从而判断内存问题的类型。
  3. 最后进行详细分析,比如内存分配分析,缓存/缓冲区分析,具体进程的内存使用分析等。

四、常用优化思路

  1. 最好禁止swap,如果必须开启swap,降低swapiness的值,减少内存回收时swap的使用倾向。
  2. 减少内存的动态分配,比如可以s使用内存池,大页(HugePage)等。
  3. 尽量使用缓存和缓冲区来访问数据,比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据。或者使用redis这类的外部缓存组件,优化数据访问。
  4. 使用cgroups方式来限制内存使用情况,这样,可以确保系统内存不会被异常进程耗尽。
  5. 通过/proc/pid/oom_adj,调整核心应用的oom_score,这样,可以保证即使内存紧张,核心应用也不会被OOM杀死。

原文地址:http://blog.51cto.com/7834466/2342383

时间: 2024-11-14 10:45:56

快速定位系统内存问题的思路的相关文章

让.NET程序快速释放内存的办法

公司里的一个程序,经过了N个人的手后发现上了生产内存会一直涨,直到物理内存几乎被占用完毕后突然就下降下来(估计是GC给释放了),然后再一直涨.这个程序主要是对字符串进行处理,困扰了我好几天,本机测试内存也有增长的趋势,但是不大明显,上生产是2.3分钟内存就上G,没找到究竟哪里的问题.从网上搜了些资料,看到可以让.NET立即释放内存,本地简单测试了一下,真的管用,但是没敢用,不知道对于多线程的程序,当一个线程显示释放内存时会不会影响到其他线程,而且我是做金融行业程序的,程序万一出问题就是事故,所以

C#中快速释放内存,任务管理器可查证

先close() 再dispose() 之后=null 最后GC.Collect() 如: ms.Close();//关闭流,并释放与之相关的资源 ms.Dispose();//如果是流的话,默认只会释放非托管资源 ms = null;//这样可以释放托管资源 GC.Collect();//回收资源 四步一步都不能少,顺序也不能错,这样执行完,内存可以得到立即释放,并且在任务管理器中也会有体现. C#中快速释放内存,任务管理器可查证

内存溢出解决思路

内存溢出问题解决思路 这篇文章主要说下解决思路,当然也写出了对应的业务背景.用意呢,一是想记录问题处理过程,作为以后的经验:二呢,分享给大家,可以听听故事借鉴下. 开始了. 项目报错什么错呢? java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded 报错的业务功能是: 导出数据为加密的EXCEL文档. 也就是 把10万条数据从数据库读出来,放到excel表

一种高效快速的内存池实现(附源码)

此算法灵感来自于apache内存池实现原理,不过读者如果没有看过apache内存池实现也无关系,因为本算法相对apache内存池算法更为简单而且易懂,个人认为某些场合也更为高效,或许真正到了apache服务器上性能不如,但是这套设计思想应该还是可以借鉴到更多场合的. 我们在调用malloc函数时,操作系统内部会查找一个所谓的空闲链表,当找到足够大的空闲空间时会将内存分割并返回一部分会用户,当然在很大的项目里面有可能会出现链表所有节点都找不到空闲空间的情形,此时操作系统便会不断搜索内存碎片,然后组

快速清理内存~

Empty.exe是一个来自于微软的命令行小工具(程序大小仅9.5k),可以用来释放指定应用程序占用的内存. 它的应用格式为: empty.exe 进程PID 或者 empty.exe 进程名称 快速应用方法,将exe放入system32后新增 一个批处理文件 内容为: empty.exe devenv.exe 保存到system32后右键发送到桌面快捷方式之后可以右键快捷方式给增加一个快捷键,这样就可以使用快捷键快速的清除Visual Studio占用内存特别多的问题了 比那些什么小火箭强多了

常见的内存问题分析思路

一 系统内存不足 Java 应用一般都有单机或者集群的内存水位监控,如果单机的内存利用率大于 95%,或者集群的内存利用率大于80%,就说明可能存在潜在的内存问题(注:这里的内存水位是系统内存). 除了一些较极端的情况,一般系统内存不足,大概率是由 Java 应用引起的.使用 top 命令时,我们可以看到 Java 应用进程的实际内存占用,其中 RES 表示进程的常驻内存使用,VIRT 表示进程的虚拟内存占用,内存大小的关系为:VIRT > RES > Java 应用实际使用的堆大小.除了堆内

教你快速高效接入SDK——总体思路和架构

题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢,多是大同小异.但是,正是这些小异,又让SDK的接入,产生了无穷无尽的变数.所以,接入SDK之前,如果你没有经验,或者没有被SDK坑过,那么当你看到这系列文章的时候,你很幸运,你可以避免这一切了.如果你之前被坑过,而且还在继续被坑着,那么现在,就是你解脱的时刻. 完成一个SDK的接入并没有多少技术含量

JavaWeb快速入门Session&Cookie代码思路篇(七)

Cookie练习 简介 尝试了n种分享代码,最终没有找到好办法.我觉得贴代码,很难看下去.还不如写思路,今后代码篇改成思路篇 Session代码练习 1. 购物车思路 1. ListBookServlet类 1.1 显示该网站所有商品,每个商品加上购买链接(BuyServlet) 用Map集合存储Book对象 map.put("1", new Book("1","JavaWeb开发","老张","一本好书"

使用python获取CPU和内存信息的思路与实现(linux系统)

linux里一切皆为文件,在linux/unix的根目录下,有个/proc目录,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc"),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数).与其他文件系统不同,/proc 存在于内存而不是硬盘中.proc 文件系统提供的信息如下: ?进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的进程 ID,