前言

内存的基本知识,将在操作系统篇中详细介绍,这里只说明如何排查问题。

正文

内存的分配和回收:

在malloc 是c 标准库中的内存分配函数,对应到系统调用上,有两种实现方式,一种是brk()和 mmap()

对于小块内存,小于128k 使用brk来分配,也就是通过移动堆栈的位置来分配内存。这些内存释放后,不会立即归还给系统,而是缓存起来。

大块内存,使用mmap()分配,在文件映射段找一块空闲内存分配出去。

brk() 方式的缓存,可以减少缺页异常的发生,提高内存访问效率。不过这些内存没有归还系统,在内存工作繁忙时, 频繁的内存分配和稀释会造成内存碎片。

而mmap() 方式分配的内存,会释放时直接规划系统,所以每次mmap 都会发生缺页异常。在内存工作繁忙时,频繁的内存分配导致大量的缺页异常,使内核的管理负担增大。

那么就到了内存不足的情况:

  1. 回收缓存,比如使用lru算法,回收最近使用最少的内存页面

  2. 回收不常用访问的内存,把不常用的内存通过交互分区直接写道磁盘中。

  3. 杀死进程,内存紧张时,系统会通过oom,直接杀死占用大量内存的进程。

第一种好理解,就是回收内存,在操作系统篇会介绍的比较详细。

第二种,回收不常用的内存,会用到交换分区。swap 其实就是把一块磁盘空间当作内存来用。它可以把进程暂不用的磁盘写入到内存中。

第三种是oom。

  1. 一个进程消耗的内存越大,oom_score 就越大。

  2. 一个进程运行占用的cpu越多,oom_score 就越小。

oom_adj 的范围 是[-17,15],数值越大,表示进程越容易被oom杀死。数值越小,表示进程越不容易被oom杀死,-17表示禁用oom。

一般情况下,查看内存的方式为

里面有几个参数:

total : 一共多少内存

used: 使用了多少内存

free: 没有使用多少内存

shared: 共享内存大小

buff/cache 是缓存和缓冲区的大小

available: 表示新进程可用内存大小

availabel 不仅包含了free内存,还包含了可回收内存。

如果要看到进程的内存使用情况:

这里有另外几个参数:

  1. virt 是进程虚拟内存的大小, 只要进程申请过的内存, 即便还没有真正分配物理内存,也会计算在内。

  2. res 是长驻内存的大小,也就是进程实际使用的物理内存大小,但是不包含swap和共享内存。

  3. shr 是共享内存大小

  4. %mem 是进程使用物理内存占用系统内存的百分比

注意:

  1. 虚拟内存通常并不会全部分配物理内存。一般虚拟内存比长驻内存要大得多。

  2. 共享内存并不一定正在的共享比如程序代码段,非共享的动态链接库,也都算在shr里面。

下面看下cached 和 buff的区别:

在free 手册中:

  1. buffers 是内核缓冲区用到的内存,对于了/proc/meminfo 中的 buffers

  2. cache 是内核页缓存和slab 用到的内存,对应的是/proc/meminfo 中的cached 与 SReclaimable 之和。

查看/proc/meminfo的描述:

buffers 是对原始磁盘快的临时存储,也就是用来缓存磁盘的数据,通常不会特别大。

这样内核就可以把分散的写集中起来,同一优化磁盘的写入,比如可以多次小的合并单次单的写。

cached 是从磁盘读取文件的缓存,也就是用来缓存从文件读取的数据。这样下次访问这些文件的时候,就可以直接从内存中读取,不用访问磁盘。

所以呢? 一个是读一个是写,都是磁盘的概念。

和我们应用程序的缓存和缓冲不一样。

但是是不是写的时候只要 buffer 有影响,但是都cache 没有影响呢?

在写文件的时候对buffer 和 cache 都有影响,对写磁盘对 buffer 有影响。

同样读的时候也是一样的,对于磁盘来说,无论读还是写,都对buffer和cache 都有影响。

下一节,内存泄漏怎么分析。

linux 性能自我学习 ———— 关于内存 [七]的更多相关文章

  1. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...

  2. Linux 性能监控之CPU&内存&I/O监控Shell脚本1

    Linux 性能监控之CPU&内存&I/O监控Shell脚本1   by:授客 QQ:1033553122   #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...

  3. 深挖计算机基础:Linux性能优化学习笔记

    参考极客时间专栏<Linux性能优化实战>学习笔记 一.CPU性能:13讲 Linux性能优化实战学习笔记:第二讲 Linux性能优化实战学习笔记:第三讲 Linux性能优化实战学习笔记: ...

  4. Linux性能优化从入门到实战:01 Linux性能优化学习路线

      我通过阅读各种相关书籍,从操作系统原理.到 Linux内核,再到硬件驱动程序等等.   把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序.库函数.系统调用.再到内核和硬件等不同的层级贯 ...

  5. Linux系统自我学习的一些笔记1

    远程连接: 1.查看IP地址  ip addr 2.远程登陆linux系统 ssh  主机名@IP地址 文件操作: 新建文件touch 例如:touch test.txt (创建单个文件) 例如:to ...

  6. Linux性能优化思路

    性能测试的核心,就是找出性能瓶颈并进行性能优化,解决"慢"的问题,最终满足客户业务需求. [性能需求来源及性能问题现象] 性能需求的来源,主要分为以下几类: 项目组提出性能需求: ...

  7. Linux性能优化实战学习笔记:第五十五讲

    一.上节回顾 上一节,我们一起学习了,应用程序监控的基本思路,先简单回顾一下.应用程序的监控,可以分为指标监控和日志监控两大块. 指标监控,主要是对一定时间段内的性能指标进行测量,然后再通过时间序列的 ...

  8. 【转】一文掌握 Linux 性能分析之内存篇

    [转]一文掌握 Linux 性能分析之内存篇 前面我们已经学习了 CPU 篇,这篇来看下内存篇. 01 内存信息 同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法. 1.1 /pro ...

  9. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  10. Linux性能优化实战学习笔记:第十八讲

    一.内存的分配和回收 1.管理内存的过程中,也很容易发生各种各样的“事故”, 对应用程序来说,动态内存的分配和回收,是既核心又复杂的一的一个逻辑功能模块.管理内存的过程中,也很容易发生各种各样的“事故 ...

随机推荐

  1. 从零开始写 Docker(四)---使用 pivotRoot 切换 rootfs 实现文件系统隔离

    change-rootfs-by-pivot-root.png 本文为从零开始写 Docker 系列第四篇,在mydocker run 基础上使用 pivotRoot 系统调用切换 rootfs 实现 ...

  2. 电子设备内幕:RAM和ROM小百科

    大家好,我是知微. 在智能手机出现之前,大家对RAM和ROM这两个词都没什么概念.如今很多手机在宣传的时候,都会标明有多大的RAM(运行内存)和ROM(存储空间),因为这在很大程度上影响手机的使用流畅 ...

  3. Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)

    思路: 分类讨论: 当一个数字出现的次数大于等于k,那么最多有k个能被染色, 当一个数字出现的次数小于k,南那么这些数字都可能被染色 还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小 ...

  4. 英语自定义标签 <i:juzi><i:zhuyu>John Smith</i:zhuyu></i:juzi> 主语谓语宾语

    效果 John Smith died in World War Two. John Smith killed three enemy soldiers. <style> i\:juzi { ...

  5. [已读带总结] Effective JavaScript 编写高质量JavaScript代码的68个有效方法

    目录 电子书下载:https://www.jb51.net/books/328297.html 第2章 第11条 熟练掌握闭包 https://www.cnblogs.com/wengxuesong/ ...

  6. 手撕fft系列之频移fftshift源码解析

    壹: fft在数字信号处理领域是一个神一样的存在.要好好熟悉一下.这里给出频移的算法源码解析. 所谓的频移,就是把数字信号的频频顺序打乱,移动一些.这个在防止啸叫和辅听领域应用十分广泛. 贰: 这个源 ...

  7. 记录--uni-app App端半屏连续扫码

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本文用一个简单的 demo 讲解 App端 半屏连续扫码 的实现方式,包括(条形码.二维码等各种各样的码). 我会从实现思路讲起,如果你比 ...

  8. elasticsearch使用painless的一些简单例子

    目录 1.背景 2.准备数据 2.1 mapping 2.2 插入数据 3.例子 3.1 (update)更新文档 id=1 的文档,将 age 加 2岁 3.2 (update_by_query)如 ...

  9. SpringBoot 常用注解总结

    核心注解 1. @SpringBootApplication 主要用于开启自动配置,它也是一个组合注解,主要组合了 @SpringBootConfiguration.@EnableAutoConfig ...

  10. JNDI注入分析

    JNDI介绍 JNDI(Java Naming and Directory Interface,Java命名和目录接口)是为Java应用程序提供命名和目录访问服务的API,允许客户端通过名称发现和查找 ...