『壹』 linux内存机制(swap)
我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。
作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。
Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
要深入了解linux内存运行机制,需要知道下面提到的几个方面:
Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟 内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需 要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面 文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不 用担心什么,只要知道是怎么一回事就可以了。
交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页 面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽 然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。
因此,合理规划和设计Linux内存的使用,是非常重要的.
在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写 数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性 能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,Linux引入了buffers和 cached机制。
buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers 与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操 作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。
为了验证我们的结论是否正确,可以通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?接着执行下面的命令:
find / -name .conf 看看buffers的值是否变化,然后重复执行find命令,看看两次显示速度有何不同。
上面这个60代表物理内存在使用40%的时候才会使用swap(参考网络资料:当剩余物理内存低于40%(40=100-60)时,开始使用交换空间) swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。
通常情况下:swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。
B. 修改swappiness参数
永久性修改:
立即生效,重启也可以生效。
一般系统是不会自动释放内存的 关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:
0 – 不释放 1 – 释放页缓存 2 – 释放dentries和inodes 3 – 释放所有缓存
前提:首先要保证内存剩余要大于等于swap使用量,否则会宕机!根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。通常通过重新挂载swap分区完成释放swap。
a.查看当前swap分区挂载在哪?b.关停这个分区 c.查看状态:d.查看swap分区是否关停,最下面一行显示全 e.将swap挂载到/dev/sda5上 f.查看挂载是否成功
『贰』 Linux内存系统
维基网络——虚拟内存定义
All about Linux swap space
Linux将物理RAM (Random Access Memory) 划分为称为页面的内存块。交换是将一页内存复制到硬盘上的预配置空间(称为交换空间)以释放改内存页面上的过程。物理内存和交换空间的组合就是可用的虚拟内存量。
虚拟内存的那点事儿
进程是与其他进程共享CPU和内存资源的。为了有效的管理内存并减少出错,现代操作系统提供了一种对主存的抽象概念,即:虚拟内存( Virtual Memory )。 虚拟内存为每个进程提供一个一致的,私有的地址空间,每个进程拥有一片连续完整的内存空间。
正如 维基网络 所说,虚拟内存不只是“使用硬盘空间来扩展内存”的技术。 虚拟内存的重要意义是它定义了一个连续的虚拟地址空间, 使得程序编写难度降低。并且, 把内存扩展到硬盘空间只是使用虚拟内存的必然结果,虚拟内存空间会存在硬盘中,并且会被全部放入内存中缓冲(按需),有的操作系统还会在内存不够的情况下,将一进程的内存全部放入硬盘空间中,并在切换到进程时再从硬盘读取 (这也是Windows会经常假死的原因...)。
虚拟内存主要提供了如下三个重要的能力:
内存通常被组织为一个由M个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址 (Physical Address PA) ,作为到数组的索引。
CPU访问内存最简单直接的方法就是使用物理地址,这种寻址方式称为 物理寻址 。
现代计算机使用的是一种被称为虚拟寻址 (Virtual Addressing) 的寻址方式。 使用虚拟寻址,CPU需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。
虚拟寻址需要硬件与操作系统之间相互合作。 CPU中含有一个被称为内存管理单元 (Memory Management Unit,MMU) 的硬件,它的功能是将虚拟地址转换称为物理地址,MMU需要借助存放在内存中的 页表 来动态翻译虚拟地址,该页表由操作系统管理。
分页表是一种数据结构,它用于计算机操作系统中虚拟内存系统,其存储了虚拟地址到物理地址之间的映射。虚拟地址在访问进程中是唯一的,而物理地址在硬件(比如内存)中是唯一的。
在操作系统中使用 虚拟内存 ,每个进程会认为使用一块大的连续的内存,事实上,每个进程的内存散布在 物理内存 的不同区域。或者可能被调出到备份存储中(一般是硬盘)。当一个进程请求自己的内存,操作系统负责把程序生成的虚拟地址,映射到实际存储的物理内存上。操作系统在 分页表 中存储虚拟地址到物理地址的映射。每个映射被称为 分页表项(page table entry ,PTE) 。
在一个简单的地址空间方案中,由虚拟地址寻址的页与物理内存中的帧之间的关系。物理内存可以包含属于许多进程的页。如果不经常使用,或者物理内存已满,可以将页面分页到磁盘。在上图中,并非所有页面都在物理内存中。
虚拟地址到物理地址的转换(即虚拟内存的管理)、内存保护、CPU高速缓存的控制。
现代的内存管理单元是以 页 的方式,分割虚拟地址空间(处理器使用的地址范围)的;页的大小是2的n次方,通常为几KB(字节)。地址尾部的n位(页大小的2的次方数)作为页内的偏移量保持不变。其余的地址位(address)为(虚拟)页号。
内存管理单元通常借助一种叫做转译旁观缓冲器(Translation Lookaside Buffer,TLB)和相联高速缓存来将虚拟页号转换为物理页号。当后备缓冲器中没有转换记录时,则使用一种较慢的机制,其中包括专用硬件的数据结构或软件辅助手段。这个数据结构称为 分页表 ,页表中的数据叫做 分页表项 (page table entry PTE)。物理页号结合页偏移量便提供了完整的物理地址。
页表 或 转换后备缓冲器数据项应该包括的信息有:
有时候,TLB和PTE会 禁止对虚拟页访问 ,这可能是因为没有RAM与虚拟页相关联。如果是这种情况,MMU将向CPU发出页错误的信号,操作系统将进行处理,也许会寻找RAM的空白帧,同时建立一个新的PTE将之映射到所请求的虚拟地址。如果没有空闲的RAM,可能必须关闭一个已经存在的页面,使用一些替换算法,将之保存到磁盘中(这被称为页面调度)。
当需要将虚拟地址转换为物理地址时,首先搜索TLB,如果找到匹配(TLB)命中,则返回物理地址并继续存储器访问。然而,如果没有匹配(称为TLB未命中),则MMU或操作系统TLB未命中处理器通常会查找 页表 中的地址映射以查看是否存在映射(页面遍历),如果存在,则将其写回TLB(这必须完成,因为硬件通过虚拟存储器系统中的TLB访问存储器),并且重启错误指令(这也可以并行发生)。此后续转换找到TLB命中,并且内存访问将继续。
虚拟地址到物理地址的转换过程,如果虚拟内存不存在与TLB,转换会被重置并通过分页表和硬件寻找。
通常情况下,用于处理此中断的程序是操作系统的一部分。如果操作系统判断此次访问有效,那么 操作系统会尝试将相关的分页从硬盘上的虚拟内存文件调入内存。 而如果访问是不被允许的,那么操作系统通常会结束相关的进程。
虽然叫做“页缺失”错误,但实际上这并不一定是一种错误。而且这一机制是利用虚拟内存来增加程序可用内存空间。
发生这种情况的可能性:
当原程序再次需要该页内的数据时,如果这一页确实没有被分配出去,那么系统只需要重新为该页在MMU内注册映射即可。
操作系统需要:
硬性页缺失导致的性能损失是很大的。
另外,有些操作系统会将程序的一部分延迟到需要使用的时候再加载入内存执行,以此提升性能。这一特性也是通过捕获硬性页缺失达到的。
当硬性页缺失过于频繁发生时,称发生 系统颠簸。
具体动作与所使用的操作系统有关,比如Windows会使用异常机制向程序报告,而类Unix系统则使用信号机制。
尽管在整个运行过程中,程序引用不同的页面总数(也就是虚拟内存大小)可能超出了物理存储器(DRAM)总大小,但是程序常常在较小的活动页面上活动,这个集合叫做工作集或者常驻集。在工作集被缓存后,对它的反复调用会使程序命中提高,从而提高性能。
大部分的程序都可以在存储器获取数据和读取中达到稳定的状态,当程序达到稳定状态时,存储器的使用量通常都不会太大。虚拟内存虽然可以有效率控制存储器的使用, 但是大量的页缺失还是造成了系统迟缓的主要因素。 当工作集的大小超过物理存储器大小,程序将会发生一种不幸的情况,这种情况称为 “颠簸” ,页面将不停的写入、释放、读取,由于大量的丢失(而非命中)而损失极大性能。用户可以增加随机存取存储器的大小或是减少同时在系统里运行程序的数量来降低系统颠簸的记录。
推荐阅读:
操作系统--分页(一)
操作系统实现(二):分页和物理内存管理
『叁』 如何限制Linux内存的使用
swap是一块磁盘空间或者一个本地文件
/proc/sys/vm/swappiness 可以设置服务器使用 swap 的积极程度。取值范围为0-100,值越大,越积极使用swap,更倾向于回收匿名页;值越小,越消极使用swap,更倾向于回收文件页。
即使swap设置为0,当剩余内存+文件页小于页高阈值( pages_high )的时候,也会发生swap
Linux有专门的内核线程 kswapd0 定期回收内存,为了衡量内存的使用情况, kswapd0 定义了三个内存阈值:页最小阈值 pages_min 、页低阈值 pages_low 和页高阈值 pages_high ,剩余内存使用 pages_free 表示。
kswapd0 定期扫描内存的使用情况,并根据剩余内存和这三个阈值的关系进行内存回收操作。
pages_free < pages_min :进程可用内存耗尽,只有内核才可以分配内存
pages_min < pages_free < pages_low :内存压力较大, kswapd0 会执行内存回收,直到剩余内存大于高阈值为止
pages_low < pages_free < pages_high :内存有一定压力,但还可以满足新内存请求
pages_free > pages_high :剩余内存较多,没有内存压力。
这些阈值可以通过内核选项来 proc/sys/vm/min_free_kbytes 间接设置。 min_free_kbytes 设置了页最小阈值( pages_min )。 pages_low=pages_min*5/4 , pages_high=pages_min*3/2
/etc/security/limits.conf
通过这个配置文件可以对每个登录的会话进行限制,这种限制不是全局的,也不是永久的,只在会话期间起作用。
通常,对单个用户的限制优先级高于对用户组的限制
可以使用以下方式限制内存使用
语法
<domain> <type> <item> <value>
详见 limits.conf(5) - Linux man page
/proc/sys/vm/overcommit_memory 控制内核使用虚拟内存的模式,可以设置为以下值
『肆』 详解Linux系统内存知识及调优方案
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。对于整个操作系统来说,内存可能是最麻烦的的设备。而其性能的好坏直接影响着整个操作系统。
我们知道CPU是不能与硬盘打交道的,只有数据被载入到内存中才可以被CPU调用。cpu在访问内存的时候需要先像内存监控程序请求,由监控程序控制和分配内存的读写请求,这个监控程序叫做MMU(内存管理单元)。下面以32位系统来说明内存的访问过程:
32位的系统上每一个进程在访问内存的时候,每一个进程都当做自己有4个G的内存空间可用,这叫虚拟内存(地址),虚拟内存转化成物理内存是通过MMU来完成的。为了能够从线性地址转换成物理地址,需要page table(页表)的内存空间,page table要载入到MMU上。为了完成线性地址到物理地址的映射,如果按照1个字节1个字节映射的话,需要一张非常大的表,这种转换关系会非常的复杂。因此把内存空间又划分成了另外一种存储单元格式,通常为4K。在不同的硬件平台上,它们的大小一般是不一样的,像x86 32位的有4k的页;而64位的有4k页,2M页,4M页,8M页等等,默认都是4k的。每一个进程一般而言都有自己的页路径和页表映射机制,不管那一个页表都是由内核加载的。每一个进程只能看到自己的线性地址空间,想要增加新的内存的时候,只能在自己的线性地址空间中申请,并且申请后一定是通过操作系统的内核映射到物理地址空间中去找那么一段空间,并且告诉线性地址空间准备好了,可以访问,并且在page table中增加一条映射关系,于是就可以访问物理内存了,这种叫做内存分配。但是新的申请一定是通过操作的内核到物理内存中去找那么一段空间,并且告诉线性地址空间好了,可以建设映射关系,最终page table建立映射关系。
这反映了上述描述过程的大体情况。可以看到每一个用户程序都会有自己的页表,并且映射到对应的主存储器上去。
根据上述文字和图表的描述可以发现2个问题:
1.每个进程如果需要访问内存的时候都需要去查找page table的话,势必会造成服务器的性能底下
2.如果主存储器的内存满了以后,应用程序还需要调用内存的时候怎么办
对于第一个问题,我们就需要借助TLB(Translation Lookaside Buffer)翻译后备缓冲器。TLB是一个内存管理单元,它可以用于改进虚拟地址到物理地址转换速度的缓存。这样每次在查找page table的时候就可以先去TLB中查找相应的页表数据,如果有就直接返回,没有再去查找page table,并把查找到的结果缓存中TLB中。TLB虽然解决了缓存的功能,但是在那么page table中查找映射关系仍然很慢,所以又有了page table的分级目录。page table可以分为1级目录,2级目录和偏移量
但是一个进程在运行的时候要频繁的打开文件,关闭文件。这就意味着要频繁的申请内存和释放内存。有些能够在内存中缓存数据的那些进程,他们对内存的分配和回收更多,那么每一次分配都会在页表中建立一个对应项。所以,就算内存的速度很快,大量频繁的同一时间分配和释放内存,依然会降低服务器的整体性能。当然内存空间不够用的时候,我们称为oom(out of memory,内存耗尽)。当内存耗尽的时候,,整个操作系统挂了。这种情况下我们可以考虑交换分区,交换分区毕竟是由硬盘虚拟出来的内存,所以其性能与真正的内存相比,差了很多,所以要尽力避免使用交换分区。有物理内存空间的时候尽量保证全部使用物理内存。cpu无论如何是不能给交换内存打交道的,它也只能给物理内存打交道,能寻址的空间也只能是物理内存。所以当真正物理内存空间不够用的时候,会通过LRU算法把其中最近最少使用的内存放到交换内存中去,这样物理内存中的那段空间就可以供新的程序使用了。但是这样会引发另外的一个问题,即原来的进程通过page table寻找的时候,那一段空间的数据已经不属于它了。所以此刻cpu发送通知或者异常告诉这个程序,这个地址空间已不属于它,这个时候可能会出现2种情况:
1.物理内存有可用的空间可用:这个时候cpu会根据以前的转换策略会把交换分区中的那段内存重新送到物理内存中去,但是转换过来的空间地址不一定会是以前的那一段空间地址,因为以前的那一段空间地址可能已经被别人使用了。
2.物理内存没有可用的空间可用:这个时候依然会使用LRU算发把当前物理地址空间上最近最少使用的空间地址转换到交换内存中去,并把当前进程需要的这断在交换空间中的内存送到物理内存空间中去,并且重新建立映射关系。
上述通知或者异常出现的情况,通常叫做缺页异常。缺页异常也分为大异常和小异常两种。大异常就是访问的数据内存中没有,不的不去硬盘上加载,无论是从交换内存中还是直接从磁盘的某个文件系统上,反正需要从硬盘上去加载,这种异常加载需要很长时间。小异常就是进程之间通过共享内存,第二个进程访问的时候,查看本地的内存映射表没有,但是其它进程已经拥有了这个内存页,所以可以直接映射,这种异常加载需要的时间一般很短。
在操作系统开机的时候,每一个io设备都会像cpu申请一些列的随机端口,这种端口叫做io端口。在IBM PC体系结构中,I/O地址空间一共提供了65,536个8位的I/O端口。正是这些io端口的存在,cpu可以与io设备进行读写交互的过程。在执行读写操作时,CPU使用地址总线选择所请求的I/O端口,使用数据总线在CPU寄存器和端口之间传送数据。I/O端口还可以被映射到物理地址空间:因此,处理器和I/O设备之间的通信就可以直接使用对内存进行操作的汇编语言指令(例如,mov、and、or等等)。现代的硬件设备更倾向于映射I/O,因为这样处理的速度较快,并可以和DMA结合起来使用。这样io在和内存传数据的时候就不需要通过cpu,cpu把总线的控制权交给DMA,每次io传数据的时候就调用DMA一次,就把cpu给解放了出来。当数据传输完了以后,DMA通知给cpu中断一次。DMA在运行的时候对整个总线有控制权限,当cpu发现有其它进程需要使用总线的时候,二者就会产生争用。这个时候,在总线控制权的使用上,CPU和DMA具有相等的权限。只要CPU委托给了DMA,就不能随意的收回这个委托,就要等待DMA的用完。
如果没有其它进程可以运行,或者其它进程运行的时间非常短,这个时候CPU发现我们的IO仍然没有完成,那就意味着,CPU只能等待IO了。CPU在时间分配里面有个iowait的值,就是CPU在等待IO花费的时间。有些是在同步调用过程中,CPU必须要等待IO的完成;否者CPU可以释放IO的传输在背后自动完成,CPU自己去处理其它的事情。等硬盘数据传输完成以后,硬盘只需要像CPU发起一个通知即可。CPU外围有一种设备,这个设备叫做可编程中断控制器。每一个硬件设备为了给CPU通信,在刚开机的时候,在BIOS实现检测的时候,这个设备就要到可编程中断控制器上去注册一个所谓的中断号。那么这个号码就归这个硬件使用了。当前主机上可能有多个硬件,每一个硬件都有自己的号码,CPU在收到中断号以后,就能够通过中断相量表查找到那个硬件设备进行中断。并且就由对应的IO端口过来处理了。
CPU正在运行其它进程,当一个中断请求发过来的时候,CPU会立即终止当前正在处理的进程,而去处理中断。当前CPU挂起当前正在处理的进程,转而去执行中断的过程,也叫做中断切换。只不过,这种切换在量级别上比进程切换要低一些,而且任何中断的优先级通常比任何进程也要高,因为我们指的是硬件中断。中断还分为上半部和下半部,一般而言,上半部就是CPU在处理的时候,把它接进来,放到内存中,如果这个事情不是特别紧急(CPU或者内核会自己判断),因此在这种情况下,CPU回到现场继续执行刚才挂起的进程,当这个进程处理完了,再回过头来执行中断的下半部分。
在32位系统中,我们的内存(线性地址)地址空间中,一般而言,低地址空间有一个G是给内核使用的,上面3个G是给进程使用的。但是应该明白,其实在内核内存当中,再往下,不是直接这样划分的。32位系统和64位系统可能不一样(物理地址),在32位系统中,最低端有那么10多M的空间是给DMA使用的。DNA的总线宽度是很小的,可能只有几位,所以寻址能力很有限,访问的内存空间也就很有限。如果DMA需要复制数据,而且自己能够寻址物理内存,还可以把数据直接壮哉进内存中去,那么就必须保证DMA能够寻址那段内存才行。寻址的前提就是把最低地址断M,DA的寻址范围内的那一段给了DMA。所以站在这个角度来说,我们的内存管理是分区域的。
在32位系统上,16M的内存空间给了ZONE_DMA(DMA使用的物理地址空间);从16M到896M给了ZONE_NORMAL(正常物理地址空间),对于Linux操作系统来说,是内核可以直接访问的地址空间;从896M到1G这断空间叫做"Reserved"(预留的物理地址空间);从1G到4G的这段物理地址空间中,我们的内核是不能直接访问的,要想访问必须把其中的一段内容映射到Reserved来,在Reserved中保留出那一段内存的地址编码,我们内核才能上去访问,所以内核不直接访问大于1G的物理地址空间。所以在32位系统上,它访问内存当中的数据,中间是需要一个额外步骤的。
在64位系统上,ZONE_DAM给了低端的1G地址空间,这个时候DMA的寻址能力被大大加强了;ZONE_DAM32可以使用4G的空间;而大于1G以上给划分了ZONE_NORMAL,这段空间都可以被内核直接访问。所以在64位上,内核访问大于1G的内存地址,就不需要额外的步骤了,效率和性能上也大大增加,这也就是为什么要使用64位系统的原因。
在现在的PC架构上,AMD,INTER都支持一种机制,叫做PEA(物理地址扩展)。所谓PAE。指的是在32位系统的地址总线上,又扩展了4位,使得32位系统上的地址空间可以达到64G。当然在32为系统上,不管你的物理内存有多大,单个进程所使用的空间是无法扩展的。因为在32位的系统上,线性地址空间只有4个G,而单个进程能够识别的访问也只有3个G。
linux的虚拟内存子系统包含了以下几个功能模块:
slab allocator,zoned buddy allocator,MMU,kswapd,bdflush
slab allocator叫做slab分配器
buddy allocator又叫做buddy system,叫做伙伴系统,也是一种内存分配器
buddy system是工作在MMU之上的,而slab allocator又是工作在buddy system之上的。
设置为小于等于1G,在数据库服务器应该劲量避免使用交换内存
3.在应用服务器上,可以设置为RAM*0.5,当然这个是理论值
如果不的不使用交换内存,应该把交换内存放到最靠外的磁道分区上,因为最外边的磁盘的访问速度最快。所以如果有多块硬盘,可以把每块硬盘的最外层的磁道拿一小部分出来作为交换分区。交换分区可以定义优先级,因此把这些硬盘的交换内存的优先级设置为一样,可以实现负载均衡的效果。定义交换分区优先级的方法为编辑/etc/fstab:
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
/dev/sdc1 swap swap pri=5 0 0
/dev/sdd1 swap swap pri=5 0 0
四.内存耗尽时候的相关调优参数
当Linux内存耗尽的时候,它会杀死那些占用内存最多的进程,以下三种情况会杀死进程:
1.所有的进程都是活动进程,这个时候想交换出去都没有空闲的进程
2.没有可用的page页在ZONE_NORMAL中
3.有其它新进程启动,申请内存空间的时候,要找一个空闲内存给做映射,但是这个时候找不到了
一旦内存耗尽的时候,操作系统就会启用oom-kill机制。
在/proc/PID/目录下有一个文件叫做oom_score,就是用来指定oom的评分的,就是坏蛋指数。
如果要手动启用oom-kill机制的话,只需要执行echo f>/proc/sysrq-trigger即可,它会自动杀掉我们指定的坏蛋指数评分最高的那个进程
可以通过echo n > /proc/PID/oom_adj来调整一个进程的坏蛋评分指数。最终的评分指数就是2的oom_adj的值的N次方。假如我们的一个进程的oom_adj的值是5,那么它的坏蛋评分指数就是2的5次方。
如果想禁止oom-kill功能的使用可以使用vm.panic_on_oom=1即可。
五.与容量有关的内存调优参数:
overcommit_memory,可用参数有3个,规定是否能够过量使用内存:
0:默认设置,内核执行启发式的过量使用处理
1:内核执行无内存的过量使用处理。使用这个值会增大内存超载的可能性
2:内存的使用量等于swap的大小+RAM*overcommit_ratio的值。如果希望减小内存的过度使用,这个值是最安全的
overcommit_ratio:将overcommit_memory指定为2时候,提供的物理RAM比例,默认为50
六.与通信相关的调优参数
常见在同一个主机中进行进程间通信的方式:
1.通过消息message;2.通过signal信号量进行通信;3.通过共享内存进行通信,跨主机常见的通信方式是rpc
以消息的方式实现进程通信的调优方案:
msgmax:以字节为单位规定消息队列中任意消息的最大允许大小。这个值一定不能超过该队列的大小(msgmnb),默认值为65536
msgmnb:以字节为单位规定单一消息队列的最大值(最大长度)。默认为65536字节
msgmni:规定消息队列识别符的最大数量(及队列的最大数量)。64位架构机器的默认值为1985;32位架构机器的默认值为1736
以共享内存方式实现进程通信的调优方案:
shmall:以字节为单位规定一次在该系统中可以使用的共享内存总量(单次申请的上限)
shmmax:以字节为单位规定每一个共享内存片段的最大大小
shmmni:规定系统范围内最大共享内存片段。在64和32位的系统上默认值都是4096
七.与容量相关的文件系统可调优参数:
file-max:列出内核分配的文件句柄的最大值
dirty_ratio:规定百分比值,当脏数据达到系统内存总数的这个百分比值后开始执行pdflush,默认为20
dirty_background_ratio:规定百分比值,当某一个进程自己所占用的脏页比例达到系统内存总数的这个百分比值后开始在后台执行pdflush,默认为10
dirty_expire_centisecs:pdlush每隔百分之一秒的时间开启起来刷新脏页,默认值为3000,所以每隔30秒起来开始刷新脏页
dirty_writeback_centisecs:每隔百分之一秒开始刷新单个脏页。默认值为500,所以一个脏页的存在时间达到了5秒,就开始刷新脏
八.linux内存常用的观察指标命令:
Memory activity
vmstat [interval] [count]
sar -r [interval] [count]
Rate of change in memory
sar -R [interval] [count]
frmpg/s:每秒释放或者分配的内存页,如果为正数,则为释放的内存页;如果为负数,则为分配的内存页
bufpg/s:每秒buffer中获得或者释放的内存页。如果为正数则为获得的内存页,为负数。则为释放的内存页
campg/s:每秒cache中获得或者释放的内存页。如果为正数则为获得的内存页,为负数。则为释放的内存页
Swap activity
sar -W [interval] [count]
ALL IO
sar -B [interval] [count]
pgpgin/s:每秒从磁盘写入到内核的块数量
pgpgout/s:每秒从内核写入到磁盘的块数量
fault/s:每秒钟出现的缺页异常的个数
majflt/s:每秒钟出现的大页异常的个数
pgfree/s:每秒回收回来的页面个数
『伍』 LINUX系统的内存管理知识详解
内存是Linux内核所管理的最重要的资源之一。内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量。Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。以下就是我为大家整理到的详细LINUX系统内存管理的知识,欢迎大家阅读!!!
LINUX系统教程:内存管理的知识详解
一、内存使用情况监测
(1)实时监控内存使用情况
在命令行使用“Free”命令可以监控内存使用情况
代码如下:
#free
total used free shared buffers cached
Mem: 256024 192284 63740 0 10676 101004
-/+ buffers/cache: 80604 175420
Swap: 522072 0 522072
上面给出了一个256兆的RAM和512兆交换空间的系统情况。第三行输出(Mem:)显示物理内存。total列不显示核心使用的物理内存(通常大约1MB)。used列显示被使用的内存总额(第二行不计缓冲)。 free列显示全部没使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。第五行(Swap:)对对换空间,显示的信息类似上面。如果这行为羡芹全0,那么没使用对换空间。在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。可以使用—h参数以字节为单位显示内存使用情况,或者可以兄晌使用—m参数以兆字节为单位显示内存使用情况。还可以通过—s参数使用命令来不间断地监视内存使用情况:
#free –b –s2
这个命令将会在终端窗口中连续不断地报告内存的使用情况,每2秒钟更新一次。
(2)组合watch与 free命令用来实时监控内存使用情况:
代码如下:
#watch -n 2 -d free
Every 2.0s: free Fri Jul 6 06:06:12 2007
total used free shared buffers cached
Mem: 233356 218616 14740 0 5560 64784
-/+ buffers/cache: 148272 85084
Swap: 622584 6656 615928
watch命令会每两秒执行 free一次,执行前会清除屏幕,在同样位置显示数据。因为 watch命令不会卷动屏幕,所以适合出长时间的监测内存使用率。可以使用 -n选项,控制执行的频率;也可以利用 -d选项,让命令将每次不同的地方显示出来。Watch命令会一直执行,直到您按下 [Ctrl]-[C] 为止。
二、虚拟内存的概念
(1)Linux虚拟内存实现机制
Linux虚拟内存的实现需要六种机制的支持:地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制、内存共享机制。
首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时如果发现程序中要用的虚地址没有对应的物理内存时,就发出了请求页要求;如果有空闲的内存可供分配,就请求分配内存(于是用到了内存的分配和回收),并把正在使用的物理页记录在缓存中(使用了缓存机制)。 如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页;交换机制中也要羡派锋用到交换缓存,并且把物理页内容交换到交换文件中后也要修改页表来映射文件地址。
(2)虚拟内存容量设定
也许有人告诉你,应该分配2倍于物理内存的虚拟内存,但这是个不固定的规律。如果你的物理保存比较小,可以这样设定。如果你有1G物理内存或更多的话,可以缩小一下虚拟内存。Linux会把大量的内存用做Cache的,但在资源紧张时回收回.。你只要看到swap为0或者很小就可以放心了,因为内存放着不用才是最大的浪费。
三、使甩vmstat命令监视虚拟内存使用情况
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。通常使用vmstat 5 5(表示在5秒时间内进行5次采样)命令测试。将得到一个数据汇总它可以反映真正的系统情况。
代码如下:
#vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2
0 0 62792 3400 9124 88092 0 0 0 14 884 434 4 14 81 0
0 0 62792 3400 9132 88092 0 0 0 14 877 424 4 15 81 0
1 0 62792 3400 9140 88092 0 0 0 14 868 418 6 20 74 0
1 0 62792 3400 9148 88092 0 0 0 15 847 400 9 25 67 0
vmstat命令输出分成六个部分:
(1)进程procs:
r:在运行队列中等待的进程数 。
b:在等待io的进程数 。
(2)内存memoy:
swpd:现时可用的交换内存(单位KB)。
free:空闲的内存(单位KB)。
buff: 缓冲去中的内存数(单位:KB)。
cache:被用来做为高速缓存的内存数(单位:KB)。
(3) swap交换页面
si: 从磁盘交换到内存的交换页数量,单位:KB/秒。
so: 从内存交换到磁盘的交换页数量,单位:KB/秒。
(4) io块设备:
bi: 发送到块设备的块数,单位:块/秒。
bo: 从块设备接收到的块数,单位:块/秒。
(5)system系统:
in: 每秒的中断数,包括时钟中断。
cs: 每秒的环境(上下文)切换次数。
(6)cpu中央处理器:
cs:用户进程使用的时间 。以百分比表示。
sy:系统进程使用的时间。 以百分比表示。
id:中央处理器的空闲时间 。以百分比表示。
如果 r经常大于 4 ,且id经常小于40,表示中央处理器的负荷很重。 如果bi,bo 长期不等于0,表示物理内存容量太小。
四、Linux 服务器的内存泄露和回收内存的方法
1、内存泄漏的定义:
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
2、内存泄露的危害
从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的`是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。存在内存泄漏问题的程序除了会占用更多的内存外,还会使程序的性能急剧下降。对于服务器而言,如果出现这种情况,即使系统不崩溃,也会严重影响使用。
3、内存泄露的检测和回收
对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程序的时候就会遇到。在 Linux 或者 unix 下,C、C++语言是最使用工具。但是我们的 C++ 程序缺乏相应的手段来检测内存信息,而只能使用 top 指令观察进程的动态内存总额。而且程序退出时,我们无法获知任何内存泄漏信息。
使用kill命令
使用Linux命令回收内存,我们可以使用Ps、Kill两个命令检测内存使用情况和进行回收。在使用超级用户权限时使用命令“Ps”,它会列出所有正在运行的程序名称,和对应的进程号(PID)。Kill命令的工作原理是:向Linux操作系统的内核送出一个系统操作信号和程序的进程号(PID)。
应用例子:
为了高效率回收内存可以使用命令ps 参数v:
代码如下:
[root@www ~]# ps v
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
2542 tty1 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty1
2543 tty2 Ss+ 0:00 0 8 1631 428 0.1 /sbin/mingetty tty2
2547 tty3 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty3
2548 tty4 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty4
2574 tty5 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty5
2587 tty6 Ss+ 0:00 0 8 1627 424 0.1 /sbin/mingetty tty6
2657 tty7 Ss+ 1:18 12 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a
2670 pts/2 Ss 0:01 2 682 6213 1496 0.6 -bash
3008 pts/4 Ss 0:00 2 682 6221 1472 0.6 /bin/bash
3029 pts/4 S+ 0:00 2 32 1783 548 0.2 ping 192.168.1.12
3030 pts/2 R+ 0:00 2 73 5134 768 0.3 ps v
然后如果想回收Ping命令的内存的话,使用命令:
代码如下:
# Kill -9 3029
使用工具软件
Memprof是一个非常具有吸引力且非常易于使用的软件,它由Red Hat的Owen Talyor创立。这个工具是用于GNOME前端的Boehm-Demers-Weiser垃圾回收器。这个工具直接就可以执行,并且其工作起来无需对源代码进行任何修改。在程序执行时,这个工具会以图形化的方式显示内存的使用情况。
相关介绍:Linux
严格来讲,Linux这个词本身只表示Linux内核,但人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
Linux拥有以下特性:类似于Unix的基本思想,支持完全免费与自由传播,完全兼容POSIX1.0标准,支持多用户、多任务、有着良好的界面、支持多种平台。Linux 能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux有着许多不同的版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
『陆』 linux查看内存使用情况
linux查看内存使用情况的方法是使用free命令。
free命令是Linux系统中最常用的查看内存使用情况的命令之一。它可以显示系统中的总内存、已使用内存、可用内存、缓存和交换空间等信息。实际上,个人认为,用户无论使用哪种方法,都可以快速了解系统中的内存使用情况,从而更好地管理和优化系统资源。
Linux系统是一种开源的操作系统,它被广泛应用于服务器和嵌入式设备中。由于Linux系统的高度可定制性和灵活性,它成为了许多开发人员和系统管理员的首选操作系统。在Linux系统中,了解内存使用情况是非常重要的,因为内存是系统中最重要的资源之一。
Linux系统查看内存的注意事烂皮凯项
在进行内存查看之前,我们需要了握悔解一些基本的饥唤内存概念。内存是计算机中存储数据的一种硬件设备,也是计算机系统的重要组成部分。
内存可以被分为物理内存和虚拟内存两种类型。物理内存是计算机中实际存在的内存,而虚拟内存是操作系统为了满足程序运行需要而使用的一种技术。
在Linux系统中,我们可以通过命令free来查看系统的内存使用情况。free命令会显示系统的物理内存和虚拟内存的使用情况,包括总内存量、已使用内存量、空闲内存量和缓冲区和缓存的内存量等信息。了解这些概念可以帮助我们更好地理解系统的内存使用情况。
『柒』 linux下查看内存的命令
op命令能显示系统内存。
目前常用的Linux下查看内容的专用工具是free命令。
下面是对专内存查看free命令输出内容的属解释:
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。