• linux内存


    linux中内存的使用

    当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存来使用,也称为Swap。如果给所有应用分配足够内存后,物理内存还有剩余,linux会尽量再利用这些空闲内存,以提高整体I/O效率,其方法是把这部分剩余内存再划分为cachebuffer两部分加以利用。

    从磁盘读取到内存的数据在被相关应用程序读取后,如果有剩余内存,则这部分数据会存入cache,以备第2次读取时,避免重新读取磁盘。当一个应用程序在内存中修改过数据后,因为写入磁盘速度相对较低,在有空闲内存的情况下,这些数据先存入buffer,在以后某个时间再写入磁盘,从而应用程序可以继续后面的操作,而不必等待这些数据写入磁盘的操作完成。
      
    如果在某个时刻,系统需要更多的内存,则会把cache部分擦除,并把buffer中的内容写入磁盘,从而把这两部分内存释放给系统使用,这样再次读取cache中的内容时,就需要重新从磁盘读取了。

    通过以上分析可以得知,空闲物理内存不多,不一定表示系统运行状态很差,因为内存的cachebuffer部分可以随时被重用,在某种意义上,这两部分内存也可以看作是额外的空闲内存。swap如果被频繁调用,bibo长时间不为0,则才是内存资源是否紧张的依据。


     

    free命令详解

    • 1.total:物理内存实际总量
    • 2.used:这块千万注意,这里可不是实际已经使用了的内存哦,这里是总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用
    • 3.free:未被分配的内存
    • 4.shared:共享内存
    • 5.buffers:系统分配的,但未被使用的buffer剩余量。注意这不是总量,而是未分配的量
    • 6.cached:系统分配的,但未被使用的cache 剩余量。buffer 与cache 的区别见后面
    • 7.buffers/cache used:这个是buffers和cache的使用量,也就是实际内存的使用量,这个非常重要了,这里才是内存的实际使用量
    • 8. buffers/cache free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。千万注意,这里是 三者之和,也就是第一排的 free+buffers+cached,可不仅仅是未被使用的buffers 与cache的和哦,还要加上free(未分配的和)
    • 9.swap:这个好理解,交换分区总量,使用量,剩余量

     

    什么是Cache?什么是Buffer?二者的区别是什么? 

    buffer:
    A buffer is something that has yet to be "written" to disk.翻译过来就是:buffer就是即将写入到磁盘。buffer将数据缓冲下来,解决速度慢和快的交接问题;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后再统一刷入硬盘中。

    cache:
    A cache is something that has been "read" from the disk and stored for later use.翻译过来就是:cache就是从磁盘读取数据然后存起来方便以后使用。cache实现数据的重复使用,速度慢的设备需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源,速度会快很多。

    buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。 缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。
    cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计的,也就是平常见到的一级缓存、二级缓存、三级缓存。 cpu在执行程序所用的指令和读数据都是针对内存的,也就是从内存中取得的。由于内存读写速度慢,为了提高cpu和内存之间数据交换的速度,在cpu和内存之间增加了cache,它的速度比内存快,但是造价高,又由于在cpu内不能集成太多集成电路,所以一般cache比较小,以后intel等公司为了进一步提高速度,又增加了二级cache,甚至三级cache,它是根据程序的局部性原理而设计的,就是cpu执行的指令和访问的数据往往在集中的某一块,所以把这块内容放入cache后,cpu就不用在访问内存了,这就提高了访问速度。当然若cache中没有cpu所需要的内容,还是要访问内存的。
      

    buffer和cache的共异性
    共性:
    都属于内存,数据都是临时的,一旦关机数据都会丢失。

    差异:(先理解前两点,后两点有兴趣可以了解)
    A.buffer是要写入数据;cache是已读取数据。
    B.buffer数据丢失会影响数据完整性,源数据不受影响;cache数据丢失不会影响数据完整性,但会影响性能。
    C.一般来说cache越大,性能越好,超过一定程度,导致命中率太低之后才会越大性能越低。buffer来说,空间越大性能影响不大,够用就行。cache过小,或者没有cache,不影响程序逻辑(高并发cache过小或者丢失导致系统忙死除外)。buffer过小有时候会影响程序逻辑,如导致网络丢包。
    D.cache可以做到应用透明,编写应用的可以不用管是否有cache,可以在应用做好之后再上cache。当然开发者显式使用cache也行。buffer需要编写应用的人设计,是程序的一部分。

     


    swap与memory

      memory就是机器的物理内存,读写速度低于cpu一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的造价是要高于磁盘的,虽然相对来说价格一直在降低。除此之外,内存的断电丢失数据也是一个原因说不能把所有数据和程序都保存在内存中。既然不能全部使用内存,那数据还有程序肯定不可能一直霸占在内存中。当内存没有可用的,就必须要把内存中不经常运行的程序给踢出去。但是踢到哪里去,这时候swap就出现了。swap全称为swap place,即交换区,当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候,就从交换区重新加载到内存,否则它不会主动交换到真是内存中。


    swap介绍

      在详细介绍swap之前,我们需要知道的是计算机对内存分为物理内存与虚拟内存(注意虚拟内存虚拟地址空间的区别)。物理内存就是计算机的实际内存大小,由RAM芯片组成的。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。这里的虚拟内存即所谓的swap。

      当用户提交程序,然后产生进程,在机器上运行。机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程。

      内存与swap之间是按照内存页为单位来交换数据的,一般Linux中页的大小设置为4kb。而内存与磁盘则是按照块来交换数据的。


    swap的设置

      从上可以看出,当物理内存使用完或者达到一定比例之后,我们可以使用swap做临时的内存使用。当物理内存和swap都被使用完那么就会出错,out of memory。对于使用多大比例内存之后开始使用swap,在系统的配置文件中可以通过调整参数进行修改。

      cat  /proc/sys/vm/swappiness

      60

      该参数可以从0-100进行设置。0就是最大限度使用内存,尽量不使用swap;100就是积极使用swap。这个具体的通过系统的算法进行确定。

      swap分区的数量对性能也有很大的影响。因为swap毕竟还是以磁盘来伪装成内存,交换的操作是磁盘IO的操作而不是内存的load与store操作。如果有多个swap交换区,每个swap会有一定的优先级,该优先级也可以调整。swap空间的分配会以轮流的方式操作于所有的swap,这样会大大均衡IO的负载,加快swap交换的速度。

      swap相关命令:

      swapon/swapoff swap-disk_name:启动和关闭相应的swap_disk_name

      swapon -s :可以查看当期swap的使用情况,也可以通过 cat /proc/swaps命令查看


    阿里云服务器 ECS Linux SWAP 配置概要说明:https://help.aliyun.com/knowledge_detail/42534.html

    查看某个进程的内存使用情况:

    pmap -d $pid 

    $pid 是正在运行的程序的pid

     

  • 相关阅读:
    Metastore
    深入解析Docker 架构原理
    python之qrcode模块生成二维码
    python flask socketio uwsgi和nginx supervisor配置方式
    python socketio客户端与服务端连接方式
    升级 elementui 2.15.7 后遇到 eldatepicker 警告问题
    flutter 签名和获取应用签名
    汽车螺丝扭力标准
    测试团队绩效考核指标
    java笔记
  • 原文地址:https://www.cnblogs.com/xulan0922/p/9212609.html
Copyright © 2020-2023  润新知