Linux性能调优关于内存

内存管理是操作系统最核心的功能之一,主要用来存储系统的应用、指令、缓存等。

进程、虚拟内存与物理内存

物理内存比较容易理解,就是平时我们说计算机有几个G的内存,例如8G、16G等,物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。

Linux应用程序的进程是不直接访问物理内存的,是通过中间层(虚拟地址)进行访问。之所以要创建一个虚拟地址空间,目的是为了解决进程地址空间隔离的问题。但程序要想执行,必须运行在真实的内存上,所以,必须在虚拟地址与物理地址间建立一种映射关系。这样,通过映射机制,当程序访问虚拟地址空间上的某个地址值时,就相当于访问了物理地址空间中的另一个值。

Linux内核为每个进程提供一个独立的虚拟地址空间,这个大小与处理器的字长(单个CPU指令能够处理的最大数据长度)有关,例如32位、64位。32位一般包含1G内核空间和3G用户空间(这就是为什么32位系统最大支持内存4G),64位的内核空间和用户空间都是128T。虚拟地址空间(虚拟内存)又包含内核空间、用户空间,只有内核空间才能访问物理内存。并不是所有虚拟地址空间会分配物理内存,只有使用的时候才会分配。

虚拟内存和物理内存之间的映射是通过内存管理单元mmu中的页表进行管理的。其中页表又包含两种机制:多级页表和大页。多级页面只保存使用的区块(这样可以大大减少页表的项数),Linux内核使用的四级页表。

进程是怎么使用内存的

上面说了虚拟内存包含内核空间和用户空间。其中用户空间内存,从低到高分别是五种不同的内存段。(1)只读段,包括代码和常量等。(2)段,包括全局变量等。(3)堆,包括动态分配的内存,从低地址开始向上增长。(4)文件映射段,包括动态库、共享内存等,从高地址开始向下增长。(5)栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是
8 MB。

在这五个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap()
,就可以分别在堆和文件映射段动态分配内存。其实,这里的分配并没有真正的分配物理内存,只有在首次访问时触发缺页异常才会进入内核空间进行页表创建,分配出物理内存。当内存使用完毕后,需要释放内存,不然会发生内存泄漏,一般调用
free() 或 unmap()来释放不用的内存。

一般来说,内存在使用紧张时,系统也会通过一系列机制回收内存:
(1)回收缓存,比如通过LRU算法回收最近很少使用的内存页面;
(2)回收不常访问的内存,把不常用的内存通过交换分区直接写到磁盘中;
注意:此方法会用到swap分区。把进程暂时不用的数据放到磁盘(swap)上,不过会严重影响性能;
(3)通过oom杀死进程。

一个进程消耗的内存越大,oom_score越大;一个进程运行占用的cpu越多,oom_score越小;oom_score越大的进程,越容易被OOM杀死。例如:可以通过调整/proc/${pidof
sshd)/oom_adj来调整oom_score,值范围是[-17,15],-17表示禁止被OOM;

如何查看内存使用情况

free命令

  • 第一列,total 是总内存大小;
  • 第二列,used 是已使用内存的大小,包含了共享内存;
  • 第三列,free 是未使用内存的大小;
  • 第四列,shared 是共享内存的大小;
  • 第五列,buff/cache 是缓存和缓冲区的大小;
  • 最后一列,available 是新进程可用内存的大小。

free -help参数说明:
-b 以Byte显示内存使用情况
-k 以kb为单位显示内存使用情况
-m 以mb为单位显示内存使用情况
-g 以gb为单位显示内存使用情况
-h 以合适的单位显示内存使用情况
-l 显示详细的低内存和高内存统计信息
-s<间隔秒数> 持续观察内存使用状况; version 3.3.10 and in 3.3.9 有这个bug,3.3.12版本已经修复
-t 显示内存使用总合
-V 显示版本信息

top命令
跟内存有关的列:

  • %MEM 进程使用的物理内存百分比。也就是使用的物理内存在总内存中的占比。
  • VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES。即使没有分配物理内存也计算在内。
  • SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
  • RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA。常驻内存大小,也即使分配的物理内存大小,不包括swap和共享内存。
  • SHR 共享内存大小,单位kb。

top名称常用操作:
top //每隔5秒显式所有进程的资源占用情况
top -d 2 //每隔2秒显式所有进程的资源占用情况
top -c //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

ps命令
ps aux : 列出内存中正在运行的进程。

  • %MEM:该进程所占用的物理内存百分比;
  • VSZ :该进程使用掉的虚拟内存量 (Kbytes)
  • RSS :该进程占用的固定的内存量 (Kbytes)

使用举例
使用top和ps查询系统中大量占用内存的进程,使用cat /proc/[pid]/status和pmap -x pid查看某个进程使用内存的情况和动态变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅侠客

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值