Linux内存管理机制说明

Linux内存管理

内核态和用户态

Linux内存管理机制说明_第1张图片linux的体系架构,从宏观来看分为 内核态和用户态

  • 内核态:本质是一组操作系统的程序,操作计算硬件资源,如CPU、内存、IO等资源和设备。并为上层应用程序提供接口等服务调用。
  • 用户态:应用程序活动空间。应用程序的执行以来内核提供的资源。应用程序通过系统调用访问内核空间程序。以此来操作系统的资源。用户应用程序一般通过三种方式访问内核资源:系统调用、系统库函数、shell程序。

用户态和内核态的切换:

  • 系统调用
  • 异常事件: 当CPU正在执行运行在用户态的程序时,突然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常
  • 外部设备调用:外设直接发出中断命令,通过中断信号跳转至内核状态执行。

系统调用的一般过程:
Linux内存管理机制说明_第2张图片
用户态和内核态的知识架构图整理:

Linux内存管理机制说明_第3张图片

linux内存管理

内存分类

linux内存类型分类有物理内存和虚拟内存

  • 物理内存: 硬件实际内存大小
  • 虚拟内存:通过磁盘技术,将硬盘资源虚拟成内存资源,当物理内存不够用时使用的。 在linux中用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

linux内存运行机制

在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),== 不会释放其占用内存 ==,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
可以理解就是尽可能的使用内存空间。实际上面的机制是linux的buffers/cache机制。

linux系统通过分页的方式管理内存空间。 内存空间被划分为一系列连续的页,当程序运行时,将程序数据加载到内存中运行。
程序运行结束之后,并不一定会立刻释放内存,已加载的页面一般通过“最近最少使用”算法管理,将不使用的页cache到内存中。
所以通过top或free命令,查看内存管理的内存使用情况时,一直会发现内存使用量占用的很高的状态。因为这个是cache原理才会造成这个现象。而cache的空间通过内存管理,可以是被释放和重用的。(至于哪些cache可以被释放哪些不可以,后续再专门研究)

问题思考:
通过free查看物理内存还有很大空间,而swap空间也有使用的,这个是可能的原因?
1、某个时间执行了一个大程序或多个程序 ,系统内存不够用,使用的虚拟内存swap空间。
2、程序运行结束,因为cache机制,这些加载的页面没有被立刻换出内存空间,所以会占用。
3、swap空间的使用量,统计的是历史最大使用情况。 当swap空间在一段时间内频繁变化时,这个就是系统内存使用不足了。

虚拟内存swap空间创建步骤

1.检查swap文件是否存在,返回空则不存在
swapon -s
2.查看文件系统,检查空间是否足够创建swap
df -hal
3.创建一个swap目录
mkdir /swap
4.创建并允许swap文件
dd if=/dev/zero of=/swap/swapfile bs=1024 count=4096000
5.格式化swap文件
mkswap -f /swap/swapfile
6.激活swap
swapon /swap/swapfile
7.设置开机启动(vim 打开 /etc/fstab)
/swap/swapfile           swap                    swap    defaults        0 0
8.赋予Swap文件适当的权限
chown root:root /tmp/swapfile
chmod 600 /tmp/swapfile
9.查看swappiness权重(swappiness=0 的时候表示最大限度使用物理内存,然后才是 Swap 空间,swappiness=100 的时候表示积极的使用 Swap 分区,并且把内存上的数据及时的搬运到 Swap 空间里面。)
cat /proc/sys/vm/swappiness
10.临时修改swappiness
sysctl vm.swappiness=10
11.要永久设置修改swappiness
vim /etc/sysctl.conf
12.在这个文档的最后加上这样一行
# Search for the vm.swappiness setting.  Uncomment and change it as necessary.
vm.swappiness=10
13.查看内存使用情况

swap空间一般分配的大小
根据swap空间使用原理,其实swap分配大小为内存的2倍的黄金法则,在现代计算机可能不适用了。 因为现在计算机的RAM大小可达到128GB等等的。
根据系统主要的使用情况动态调整才是最好的。
网络上整理了一些建议:
可以做参考,并非一定要这么做。
如果根据Red Hat的建议,他们建议是分配RAM 20%的换空间,也就是RAM是8GB,分配1.6GB交换空间。

CentOS建议

如果RAM小于2GB,就分配和RAM同等大小的Swap交换空间。
如果RAM大于2GB,就分配2GB交换空间

Ubuntu考虑到系统需要休眠,

如果RAM小于1GB,Swap空间至少要和RAM一样大,甚至是要为RAM的两倍大小
如果RAM大于1GB,Swap交换空间应该至少等于RAM大小的平方根,并且最多为RAM大小的两倍
如果要休眠,Swap交换大小应该等于RAM的大小加上RAM大小的平方根

内存使用量查看和监控

free命令

free -m
free -m 以MB来查看当前内存的使用情况

[root@~]# free -m
             total       used       free     shared    buffers     cached
Mem:         15947      15770        177          0        172       8884
-/+ buffers/cache:       6712       9234
Swap:        15999       4469      11530

说明:

  • 从内核管理的角度来看
    第一行MEM
    这一行代表从内核管理的角度来看
    total:物理内存大小
    used: 当前已使用的内存。其实这些已使用的包含缓存的占用。当内存不足时,可逐渐将缓存占用的内存转变为系统可用的。
    free: 剩余的内存大小。 不包括buffers和cached的。
    在linux系统中看MEM这一行,used的量一直都会很高,因为有buffers和cached机制,其内存使用是尽可能的使用。而实际上并不是物理硬件的内存不足,当需要使用的时候,操作系统会将buffers和cached的值,转变至运行时应用程序所需要的内存的。

  • 从用户应用角度看
    第二行 == -/+ buffers/cache: ==
    used: 已使用
    free:剩余的可使用的
    可以看到: 第二行的free 9234 = 第一行的free + buffers + cached.。
    实际从用户的角度来看,运行的应用程序使用的buffers/cache为used 6712M,空闲可以被新的应用程序可用的为9234M。
    所以,可以简单理解为当前可用的内存空间还有9234M

  • swap空间
    swap空间使用情况,表明当前历史最高使用量,一般不会主动回缩。

持续监控

free -m s2 每个2秒执行一次,持续监控系统整体内存使用情况
watch -n 2 -d free -m 通过watch持续观察

watch说明:
-n : 每隔2秒钟执行一次
-d:高亮显示与前一次的不同
watch命令会每两秒执行 free -m 一次,执行前会清除屏幕,在同样位置显示数据。因为 watch命令不会卷动屏幕,所以适合出长时间的监测内存使用率。可以使用 -n选项,控制执行的频率;也可以利用 -d选项,让命令将每次不同的地方显示出来。Watch命令会一直执行,直到您按下 [Ctrl]-[C] 为止。

通过top命令查看

top
top
然后执行命令 shift +m 按照RES常驻内存排序

Linux内存管理机制说明_第4张图片关于命令的一些说明:
MEM行和SWAP行,显示 内存的整体使用情况,这里的显示其实是从内核角度查看的。所以会看到使用量非常高。而实际可使用的应该是MEM free+MEM buffers+ swap cached是当前系统的可用内存
shift+m 命令: 以RES列进行从大到小排序。查看整体内存使用情况。

选项说明 :
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

vmstat命令

vmstat 2 5

[root@~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 4563528 695732 152720 8589700   19    5   140    37    0    0  3  0 96  1  0
 0  0 4563528 695964 152720 8589716    0    0  1000    58 2827 5514  1  0 99  0  0
 0  0 4563528 695980 152728 8589760    0    0  1000    86 2692 5205  1  0 99  0  0
 0  0 4563528 695864 152736 8589908    0    0  1000    68 2635 5102  1  0 99  0  0
 0  0 4563528 695740 152752 8589940    0    0  1002   148 2770 5236  1  1 98  0  0

通过vmstat查看虚拟使用的情况。默认以字节为单位。

字段说明:
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量

Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小

Swap:
si: 每秒从交换区写到内存的大小。如果 这个值大于0,则表示物理内存不够了。
so: 每秒写入交换区的内存大小。

IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数

系统:
in: 每秒中断数,包括时钟中断。【interrupt】
cs: 每秒上下文切换数。 【count/second】

CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间

备注:
如果r经常大于4,id经常少于40,表示cpu的负荷很重。
如果bi,bo长期不等于0,表示内存不足。
如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。

Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。

显示活跃和非活跃内存
vmstat -a 2 5 -a 显示活跃和非活跃内存,所显示的内容除增加inact和active

ps命令查看进程使用

ps命令查看 内存使用情况

常驻内存VSZ使用情况:
ps aux|head -1;ps|grep -v PID|sort -rn -k 5|head

[root@ ~]# ps aux|head -1;ps|grep -v PID|sort -rn -k 5|head 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
32322 pts/0    00:00:00 bash
22584 pts/0    00:00:00 head
22583 pts/0    00:00:00 sort
22582 pts/0    00:00:00 grep
22581 pts/0    00:00:00 ps

按照内存RSS使用情况:
ps aux|head -1;ps|grep -v PID|sort -rn -k 6|head

你可能感兴趣的:(linux,内存管理,linux内存)