Linux管理之内存篇
一、概念
Linux的内存分为物理内存和虚拟内存,物理内存即是插在主板上的所有内存的总和,而虚拟内存(Virtual Memory)是采用硬盘对物理内存的一种扩展,当物理内存不够使用时,内核会将物理内存中未使用的一部分内如的内容写入到硬盘上,将空闲的这部分内存用于其它用途,当再一下需要原始内容时,将硬盘上的内容读入内存,这就是Linux上的swap。但是硬盘的读写相对内存来说很慢(大约1000倍),所以涉及到swap操作的程序运行速度无法运行很快,如果条件允许可以加大物理内存总量,禁用swap。
Linux内部的最小内存分配单元为page,每个page的大小一般为4K, 可通过以下命令获取page的大小:getconf PAGE_SIZE,虚拟内存的基本单位也为Page,它被分为很多的Page,在X86中一个Page为4KB。当内核写内存到硬盘或者读磁盘到内存,这就是一次与Memory Swaping;内存分页(Memory Paging)是指内核会定期将内存中的数据同步到硬盘,所以它一直是在活跃运行的。
随着程序不断运行,不断消耗内存,内核就必须经常扫描内存空间收回和释放内存空间,内核采用PFRA(Page Frame Reclaim Algorithm)页面回收算法来回收和释放内存空间,内存页有几下几个类型:
(1) Unreclaimable: 锁定的内存保留页;
(2) Swappable:匿名的内存页;
(3) Syncable:通过硬盘文件备份的内存页;
(4) Discardable:静态页和被丢弃的页。
除了第一种之外,都可以被PFRA进行回收。
二、进程
1. kswapd进程
它负责确保系统空闲物理内存的数量在一个合适的范围,它监控内核中的pages_high和pages_low阙值。如果空闲内存的数值低于pages_low,则每次kswapd进程启动扫描并尝试释放32个free pages。并一直重复这个过程,直到空闲内存的数值高于pages_high。在物理内存严重不足的情况下,会导致系统频繁调用kswapd进程, 引起I/O严重等待.整个系统处于假死状态.kswapd进程会过度占用CPU。
Kswapd进程完成以下几个操作:
(1) 如果该页处于未修改状态,则将该页放置回空闲列表中;
(2) 如果该页处于已修改状态并备份回文件系统,则将页内容写入到磁盘;
(3) 如果该页处于已修改状态但没有任何磁盘备份,则将页内容写入懂啊swap area;
2. pdflush进程
它用来同步文件相关的内存页面,把内存页面及时同步到硬盘上,在Linux系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页(由于内存中页缓存的缓存作用,写操作实际上都是延迟的,当页缓存中的数据比磁盘存储的数据还要新时,那么该数据就被称为脏页)写到磁盘上。
三、相关工具
1. free、top
Linux中使用free可以查看系统内存使用状态,默认单位为Kb。
Mem 行显示了从系统角度看来内存使用的情况,total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存,buffers和cached是系统用做缓冲的内存。buffers与某个块设备关联,包含了文件系统元数据,buffer中放的是对象数据结构, 并且跟踪了块的变化,cache只包含了文件本身,cached中放的是无结构的块数据。
-/+ buffers/cache行则从用户角度显示内存信息,可用内存从数量上等于mem行used列值减去buffers和cached内存的大小。因为buffers和cached是操作系统为加快系统运行而设置的,当用户需要时,可以直接为用户使用。
Linux第一次读取一个文件运行时,一份放到一片内存中cache起来,另一份放入运行程序的内存中正常运行,当程序运行完关闭。Cache中的那一份却没有释放第二次运行的时候,系统先看看在内存中是否有一次运行时存起来的cache中的副本,如果有的话,直接从内存中读取,那样,速度就快多了。如果cache占用的内存过多了,影响正常运行程序需要的内存,那么会释放掉一部分cache内存,但是总量会保持一个很高的值,所以,Linux总是能最大限度的使用内存,就算加到16G,32G内存,也会随着不断的IO操作,内存的free值会慢慢减少到只有几M,所以说linux下内存的used经常很大。
所以可以得到以下等式:
Total mem=Free mem+Used mem
Used mem=内核表使用+程序使用物理内存+Buffer mem+Cached mem
程序使用内存=Used – Buffer- Cached – 内核使用(可以忽略);因此一个程序一次可申请的内存<=Free + Buffer +Cached
2. vmstat
vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息,语法规则:vmstat [ -f ] [ -i ] [ -s ] [ -I ] [ -t ] [ -v ] [ PhysicalVolume ... ] [ Interval [ Count ] ]
Vmstat输出字段说明
Swapd:当前虚拟内存使用的总额(单位:KB)。空闲内存到达到最低的阙值,更多的数据被转换成虚拟内存页到swap area中;
Free:当前内存中可用空间字节数;
Buffer:当前内存中用于read()和write()操作的缓冲区缓存字节数;
Cache:当前内存中映射到进程地址空间字节数;
So:写入交换空间的字节数总额;
Si:从交换空间写回内存的字节数总额;
Bo:磁盘块页面从内存到文件或交换设备的总额;
Bi:磁盘页面从文件或交换设备到内存的总额;
inactive: vmstat -a查看(什么意思没弄明白);
active:vmstat -a查看(什么意思没弄明白);
3. 查看系统实际内存大小
命令dmesg |grep [mM][eE][mM]
找到输出中的Memory: 2042524k/2086248k available,其中后面的为物理实际内存大小,而前面为系统可用内存大小,即去掉了内核占用内存、保留内存、数据缓存以后的可用内存(大约45M)。
4. 其它命令
cat /proc/meminfo: 机器的内存使用信息,内存的一些额定值;
cat /proc/pid/maps: pid为进程号,显示当前进程所占用的虚拟地址;
cat /proc/pid/statm:进程所占用的内存。
cat /proc/self/statm 输出以下结果
654 57 44 0 0 334 0
输出解释
CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:
参数 解释 /proc//status
Size (pages) 任务虚拟地址空间的大小 VmSize/4
Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4
Shared(pages) 共享页数 0
Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4
Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4
Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4
dt(pages) 04
四、监控
服务器内存的监控可以采用Nagios或者Cacti,这里提供Cacti的方式进行监控,通过分析SNMP获取数据。需要在被监控上安装SNMP,并设置好相应的访问权限。
下载附件,导入模板文件设置即可,。
参考链接
http://www.vpsee.com/2009/11/linux-system-performance-monitoring-memory/
http://blog.163.com/girl_lihuiyue@126/blog/static/1806962120101091074312/
http://bbs.jlu.edu.cn/cgi-bin/bbsanc?path=/groups/GROUP_6/Unix/D72ABF1E2/huanan/folder006/f013/f002/004
http://blog.sina.com.cn/s/blog_4b394e5001000d13.html
相关推荐
深入理解Linux内核-内存篇,阅读笔记
### Linux内核分析—内存篇 #### 内存布局与管理概述 Linux内核的内存管理是操作系统核心功能之一,负责高效地分配和回收物理内存资源。为了更好地理解这一复杂的过程,本文将深入探讨Linux内核如何管理和组织内存...
- **区**:为了更高效地管理内存,Linux将物理内存划分为不同的区(zone),每个区负责一定范围内的内存管理。 - **页**:物理内存被进一步细分为页,页是操作系统进行内存管理的最小单位。 - **高内存**:随着计算机...
Linux 内存管理(上篇-物理内存组织) Linux 内存管理是一个非常复杂的主题,本篇文章将着重介绍物理内存组织的概念和实现细节。 物理寻址和虚拟寻址 在 Linux 中, CPU 直接操作物理地址,读取 4 字节数据字。在...
Linux操作系统使用虚拟内存(Virtual Memory)机制来管理内存,虚拟内存是指计算机系统中的一种内存管理技术,它使得应用程序可以使用超过物理内存大小的内存空间。虚拟内存由两个部分组成:物理内存(Physical ...
Linux内核中的内存管理是一个复杂的主题,涉及多个层面的操作。本篇将详细介绍Linux内核中...在编写驱动程序或者进行内核开发时,合理地使用这些内存操作函数能够帮助我们更好地管理内存资源,提高程序的性能和效率。
总的来说,"00-Linux内存管理之一:基本概念篇"涵盖了Linux内存管理的基础知识,包括内存划分、地址映射、内存分配与释放、缓冲和缓存等。理解和掌握这些概念对于优化Linux系统性能和编写高效的应用程序具有重要意义...
在Unix/Linux系统中,内存管理是至关重要的,因为它直接影响到系统的性能和稳定性。本文主要针对AIX和Linux系统的内存管理进行了深入探讨,包括基本概念、监控方法以及自动化管理。 AIX系统采用虚拟内存管理器(VMM...
通过掌握内存管理的基本原理和使用相应的监控及调整工具,系统管理员可以有效地管理内存,优化系统性能,保证服务的稳定运行。在自动化运维的场景下,这显得尤为重要,因为自动化脚本可以定时收集内存状态,自动调整...
本篇文章将深入探讨Linux内核内存管理的关键概念、机制以及相关的策略。 1. **内存区域(Memory Zones)** Linux将物理内存划分为不同的区域,如DMA区(直接内存访问)、正常区、高内存区等,以便于管理和优化不同...
在这篇笔记中,我们将详细介绍Linux内存管理的基本概念、段式管理和页式管理、Linux操作系统内存管理和虚拟内存概念,为内核开发提供一个基础铺垫。 一、物理地址、线性地址(虚拟地址)和逻辑地址 在了解Linux...
在Linux操作系统中,内存管理是核心功能之一,它负责有效地分配、使用和回收系统内存,以确保系统的稳定性和性能。本篇文章将深入探讨Linux内存管理的实现,主要围绕MMU(Memory Management Unit,内存管理单元)、...
《Linux2.6内存管理研究》这篇文章主要探讨了Linux 2.6内核在内存管理方面的改进和技术。Linux操作系统近年来逐渐受到广泛的应用,Linux 2.6作为其最新的内核版本,无论是在服务器还是嵌入式设备领域都展现出了强大...
这篇文章主要分为四个部分,全面解析了Linux操作系统如何在ARM平台上高效管理物理内存。 首先,文章介绍了内存布局的演变历程。早期的系统中,代码可能存储在ROM中,而运行时的数据存储在RAM中。随着需求的复杂化,...
《ARM Linux 内存映射》是一篇深入探讨ARM架构下Linux系统如何管理内存映射的文章。该文档由作者张俊岭编写,发布于2009年8月5日。文档主要介绍了在ARM Linux环境下,如何通过处理器的MMU(Memory Management Unit,...
接下来,Linux操作系统作为当前最流行的开源操作系统之一,它与硬件设备有着紧密的联系。Linux是由芬兰学生林纳斯·托瓦兹在1991年首次发布,经过多年的发展,形成了包括Red Hat、Debian、Ubuntu等多个发行版。Linux...
该算法提出了由应用程序触发的主动释放物理页面的策略,通过预测和管理内存页面的使用情况,提前进行交换,防止物理内存进入紧缺状态,从而避免由于物理内存不足造成的系统响应延迟。 2. 基于启发式学习的预加载...