专栏首页只喝牛奶的杀手开发应该知道的Linux系统分析-内存篇

开发应该知道的Linux系统分析-内存篇

用free监控内存free是监控linux内存使用状况最常用的指令,看下面的一个输出

Mem:表示物理内存统计

buffers/cached:表示物理内存的缓存统计

Swap:表示硬盘上交换分区的使用情况.只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap

Mem 行(第一行)数据说明:

Total:单位kb 表示物理内存总大小.

Used: 单位kb 表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用

Free:单位kb 表示未被分配的内存

Shared:单位kb 共享内存,一般系统不会用到Buffers:124212KB 系统分配但未被使用的buffers 数量

Cached:单位kb 系统分配但未被使用的cache 数量-/+ buffers/cache 行(第二行)数据说明:

Used:单位kb,实际使用的buffers 与cache 总量,也是实际使用的内存总量.

Free: 单位kb, 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。Free命令输出的第四行(Swap)这行显示交换内存的总量、已使用量、空闲量通常 buffer 和 cache 可以使用的内存空间越大,系统 IO 和 文件系统访问的性能越好。

在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过的数据会比较快.

一般有这样一个经验公式:应用程序可用内存/系统物理内存>70%时,表示系统内存资源非常充足,不影响系统性能,应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存,20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。

虚拟内存Linux kernel使用虚拟内存机制来利用磁盘对内存的空间进行扩展。Kernel将暂时不用的内存写入到磁盘从而释放出更多的可用内存. 当这些数据再次被使用时,会被重新加载到内存当中。作虚拟内存的磁盘空间被称作swap space。对硬盘的读写,相对于内存来说速度要慢许多,因此使用了虚拟内存的程序,速度也会相应变慢 。虚拟内存的使用,往往被认为是内存出现瓶颈的标志。

内存分页(Memory Paging)和内存交换(Memory swapping)

Memory paging 是一个定时将内存数据同步回磁盘的过程当系统内存不足时,系统会将最近最不常用的内存段交换到交换空间,出现page out;当程序要读的文件在内存中没有找到,这时候出现page fault从磁盘中读取到内存,其实也产生了page inpaging指的是以页为单位的交换,而swapping指的是以整个进程为单位的交换。

  • swpd列表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。Free列表示当前空闲的物理内存数量(以k为单位)。
  • buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
  • cache列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
  • si列表示由磁盘调入内存,也就是内存进入内存交换区的数量
  • so列表示由内存调入磁盘,也就是内存交换区进入内存的数量
  • 一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。

Vmstat-swap有人看到空闲内存(free)很少或接近于0时,就认为内存不够用了,实际上不能光看这一点的,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

Kswapd 服务职责就是保证可用内存量。它会监控内核里面定义的pages_high和pages_low水位线.如果可用内存量低于pages_low,kswapd进程开始扫描尝试释放,每次释放32页直到可用内存高于pages_high水位线。内核线程kswapd仍然和以前一样,用来处理页面的交换,它可以在内存不足时,将一些进程的页面交换到swap空间之中。而新的算法中,kswapd在可用页面数量小于pages_low时,以及经过了某一段时间时,才被激活。采取新的方法,显然需要激活kswapd的次数被大大减少。而且只在内存空间不够时,才请求进行页面交换,从理论上来说,也更加合理。

Kswapd回收内存的算法被称作Page Frame Reclaim Algorithm内存的回收采用LRU策略,最近不被经常使用的内存页,应该首先被回收swap空间被使用是否意味着出现了内存瓶颈?swap空间被利用恰恰说明了Linux的内存使用的合理性,并不能表示内存出现了瓶颈对Swap空间的换入换出的速率是表征内存出现瓶颈的重要标志。

在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上。

少量的可用内存free memory是一个好兆头,高速缓存有效地使用,除非持续写入到交换设备和磁盘。如果系统报告交换设备比较繁忙,这意味着系统内存不足了。很少的swap且这时如果空闲物理内存很少是一个很好的信号;说明充分利用了内存缓存,虽然内存现在不是很贵,当然能用加机器解决的问题也不是什么问题,但是“能省则省”,不要加“无用的”内存。


每周一句:|先改变行为,再改变思维。生命中的贵人都是改变你行为的人,然后你自己的思维也变了。

本文分享自微信公众号 - 只喝牛奶的杀手(killerhub),作者:只喝牛奶的杀手

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis 发布订阅

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

    只喝牛奶的杀手
  • Feign(上)

    在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JD...

    只喝牛奶的杀手
  • 关于全文检索

    我们都知道关于全文检索大多公司的选型都是ElasticSearch,为什么是它?可能有的人会回复Es利用倒排索引适用于全文检索,倒排索引怎么存的?倒排索引为什么...

    只喝牛奶的杀手
  • 剑指内存泄漏

    指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,失去了对该段内存的控制,因而造成了内存的...

    audy
  • SQL Server内存

    背景 最近一个客户找到我说是所有的SQL Server 服务器的内存都被用光了,然后截图给我看了一台服务器的任务管理器。如图 ? 这里要说明一下任务管理器不会完...

    用户1217611
  • 故障分析 | MySQL OOM 故障应如何下手

    前阵子处理这样一个案例,某客户的实例 mysqld 进程内存经常持续增加导致最终被 OOM killer。作为 DBA 肯定想知道有哪些原因可能会导致 OOM(...

    爱可生开源社区
  • 虚拟内存详解

    究其原因,监控系统计算的可用内存算法有偏差,他只关注了计算机的“实际”内存,忽略了计算机的虚拟内存。

    bisal
  • 软件性能测试(连载9)

    Linux内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。Linux的空间又分为内核空间和用户空间,在32位中,内核空间占1G,用户空间...

    小老鼠
  • Java架构师中的内存溢出和内存泄露是什么?实际操作案例!

    申请了内存用完了不释放,比如一共有 1024M 的内存,分配了 521M 的内存一直不回收,那么可以用的内存只有 521M 了,仿佛泄露掉了一部分;

    Java架构师进阶技术
  • 移动APP测试之android性能测试

      当应用实现了新功能后,准备发布版本前,必须进行性能测试以确定没有性能问题,内存使用情况便是其中必须要测试的性能之一。由于内存组成的复杂性,并没有简单通用的方...

    小老鼠

扫码关注云+社区

领取腾讯云代金券