`
cocos
  • 浏览: 401290 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Linux内存中Swap和Buffer Cache机制

阅读更多

  Linux支持虚拟内存(virtual memory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。

  一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。

  有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心的,但是知道了是怎么一回事,也就无所谓了。

  许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。

  注意,如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。

  Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。

  可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。

  与访问(真正的)的内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段e-mail消息,然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(disk buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。

  但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。

  对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。

  大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(write-through):数据将被立刻写入磁盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(write-back)。后台写比直接写更有效,但也容易出错:如果机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。

  针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。

  由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,sync命令倾空(flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync命令了。Linux另外有一个后台程序,bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁盘的突然冻结。

 在Linux中,bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。
  缓存(cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。

  缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用:

  它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。

  如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。

  这就是一般情况下Linux内存的一般机制,当然Linux内存的运行机制远远比这个复杂,但是只有了解了这个机制,我们管理服务器才能得心应手!

分享到:
评论

相关推荐

    Linux内存buffer和cache的区别

    通过`free`命令,我们可以直观地了解Linux系统中内存的使用情况。以下是对`free`命令输出的一些关键指标的解释: - **Total**:表示物理内存的总大小。 - **Used**:表示已经被使用的内存总量,包括buffers和cache...

    Linux操作系统中内存buffer和cache的区别.pdf

    本文将详细介绍Linux系统中内存buffer和cache的区别及其工作原理,帮助读者更好地理解这两种内存管理机制。 #### 二、Free命令概述 `free`命令是Linux中用来查看系统内存使用情况的一个实用工具。通过`free`命令,...

    linux可用内存足够为什么还用swap.docx

    在讨论Linux系统为何在看似有足够可用内存的情况下仍然使用swap(交换分区)之前,我们需要理解几个基本概念:内存的使用情况、buffer/cache的作用以及swap的工作机制。 #### 当前系统状态分析 根据提供的`free -m...

    Linux下应用程序到底使用了多少内存

    Linux还采用了Buffer Cache和Page Cache这两种主要的缓存机制,以优化磁盘和内存的交互。Buffer Cache针对磁盘块的读写,而Page Cache针对文件inode的读写。这两种缓存极大地提高了系统性能,减少了I/O操作的延迟。 ...

    Linux性能优化-内存篇_WEL.pdf

    Linux系统提供了多种缓存机制,例如,Page Cache、Buffer Cache等。 3. 性能优化工具 3.1 top命令 top命令是一个常用的性能优化工具,可以实时显示系统的CPU、内存、进程等信息。 3.2 vmstat命令 vmstat命令...

    《深入理解linux内存管理》学习笔记 Linux 高阶学习

    同时,Linux的缓冲区缓存(Buffer Cache)和页面缓存(Page Cache)提高了磁盘I/O效率。 6. **内存压榨(OOM,Out-Of-Memory)**:当系统完全耗尽内存时,内核会触发OOM killer,选择并终止某些进程以释放内存。...

    linux下内存管理

    5. 缓存和缓冲区(Cache and Buffer):Linux为了提高I/O性能,会在内存中创建缓冲区来存放磁盘数据。同时,文件系统使用缓存来存储最近访问过的文件内容,减少磁盘读写。 6. 交换空间(Swap Space):当物理内存...

    linux内存管理

    Linux内存管理是操作系统中至关重要的组成部分,它负责高效地分配、回收、使用以及管理物理内存和虚拟内存。Linux系统的内存管理经历了长时间的发展,从早期的版本到最新的Linux 2.6内核,不断引入新技术以提高性能...

    手工释放linux内存_procsysvmdrop_caches.pdf

    Linux 操作系统为了提高文件读取效率,采取了两种主要 Cache 方式:Buffer Cache 和 Page Cache。前者针对磁盘块的读写,后者针对文件 inode 的读写。这些 Cache 有效缩短了 I/O 系统调用(比如 read、write、...

    查看linux系统内存使用情况.pdf

    通过上述介绍,我们可以了解到Linux系统中内存管理的基本原理以及如何通过不同的工具来监控内存的使用情况。理解这些内容对于优化系统性能和排除故障具有重要意义。希望本文能够帮助您更好地掌握Linux内存管理的相关...

    Linux System and Performance Monitoring

    一旦内存页被映射进内存的 buffer cache 中,内核将尝试从内存中读取或写入,此时内核过程就是 minor page fault (MnPF)。 通过使用 time 命令,可以验证当进程启动后,MPF 和 MnPF 的变化情况。第一次运行进程,...

    Linux的free命令来显示系统中空闲和已使用的内存.docx

    此外,`-l`选项可以显示低内存和高内存的统计信息,而`-t`选项会计算并显示所有列的总计。 需要注意的是,`shared`内存列在现代Linux系统中通常不包含有意义的数据,因为它的功能已经被其他机制取代。而`buffer`和`...

    Linux 性能监测:Memory

    在Linux系统中,内存资源主要包括物理内存(RAM)和虚拟内存。物理内存直接安装在计算机硬件中,而虚拟内存则是通过将一部分硬盘空间作为内存使用的技术,以此来扩展计算机的实际可用内存空间。 虚拟内存的引入带来...

    linux从做系统学习笔记

    Linux系统的存储体系结构涉及缓冲(BUFFER)与缓存(CACHE)的概念与区别,内存管理方案以及页面置换算法。同时,Linux提供了各种用于监控系统资源使用情况的命令,如FREE、VMSTAT和SWAP,它们有助于了解系统内存的...

    Linux常见试题解析-b64_c3VuJTIwYm95-it720.pdf

    在 Linux 系统中,buffer 和 cache 是两个重要的概念。Buffer 是一个内存区域,当 CPU 需要写数据到磁盘时,由于磁盘速度比较慢,CPU 先把数据存进 buffer,然后 CPU 去执行其他任务。Cache 是一个内存区域,当 CPU ...

    Linux系统问题排查

    通过对Linux系统中的CPU、内存、网络和磁盘问题的详细了解与学习,我们能够更加有效地对系统进行维护和优化。上述知识点涵盖了问题排查的基本思路和常用工具,有助于提高系统管理员的工作效率,并确保系统的稳定运行...

Global site tag (gtag.js) - Google Analytics