linux 内存性能调优
linux内存系统简述
linux 内存性能调优
linux内存系统简述
关于linux内存系统我们至少应该了解什么?
linux 系统中内存地址分为虚拟地址和物理地址,虚拟地址必须通过mmu映射成物
理地址。为了完成虚拟地址到物理地址的映射,linux内核中必须为每一个用户态
进程维护一个页目录和相应的页表项。一般系统中页表中一页大小为4K,
利用getconf PAGESIZE可以获取系统中页大小。
linux伙伴系统,为了将系统中的内存页做相应的管理,linux内核将系统中内存为
分为不同的node,zone. 系统将不同cpu访问速率的内存归纳为不同的node.
zone表示同一个node不同内存区域,一般分问DMA, NORMAL, HIGHMEM.
每一个ZONE上面有active_list,inactive_list.
在每一个ZONE中需要管理这个ZONE中的活动页和非活动页,这样就方便每个ZONE中
页面的回收
nr_inactive_anon 3949
nr_active_anon 3299
nr_inactive_file 7305
nr_active_file 3182
nr_unevictable 0
页面交换,linux可以将系统中匿名页交换到交换分区或者交换文件中去,当系统
中的内存紧张时。
swapon -s 查看系统中交换分区或者交换文件使用情况
swapon -a 开启系统的交换功能
swapoff -a 关闭系统的交换功能
系统中缓存类型分为页缓存和块缓存。当系统去读取文件系统中的文件时,系统会
将读到的文件的内容缓存到一个地址空间中,组成这个地址空间的内存页就是页缓
存,叫做cache.
系统在读取文件系统中类似目录,超级块或者管理块时,读取到系统中的内存页中
,这种页面叫做块缓存,也叫做buffer.
linux如果按页管理分配内存,对较小的内存分配是一种严重的浪费。slab内存分
配器解决内核空间较小的内存分配问题。slab就是为了满足内核中各个模块特定大
小内存的快速分配,就从伙伴系统中要出内存页,自己建立一个相对独立的内存池
子,向特定的内核模块分配特定大小的内存。
slabtop
cat /proc/slabinfo
linux系统中内存使用分类
- 内核系统中分配的内存
- 用户态代码段,数据段,堆空间,栈空间
- 文件地址空间缓存,块缓存
- 文件在用户空间的地址映射消耗的内存.
- mmap 匿名映射的页,shmem共享内存使用的页.
可回收的页和不可回收的页
上面总结了linux中内存页的不同种类,上面不同类型的页面基本上可以分为两种不同的类型,一种是可回收页面,另外一种为不可以回收的页面。除了第一种,内核系统中分配的内存为不可回收的外,其它类型的页面都是可以回收的页面。
可回收页面分类
- 匿名页面需要将页面内容交换到交换设备或者文件才能回收该页面
- 文件地址空间缓存,块缓存通过回写页面内容后再回收页面.
如何查看系统中不同类型内存数量
使用这个命令可以看到系统中空闲内存数量,buffer缓存数量,页缓存数量.同时可以看到交换分区换入,换出页面的数目.
root@localhost:~# vmstat 1 -S m
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
21 0 0 665 69 508 0 0 0 0 19 5 38 3 59 0
19 0 0 665 69 508 0 0 0 0 2161 3112 97 4 0 0
20 0 0 665 69 508 0 0 0 0 1903 3394 97 3 0 0
查看进程内存使用情况
top
shift + m
linux系统中的进程按照消耗内存大小进行排列,VIRT表示虚拟地址空间内存大小,RES表示实际内存使用大小。
shift + p
linux系统中的进程按照消耗CPU大小进行排列
使用pmap查看进程内存使用情况
pmap pid
我们可以看到整个进程占用的虚拟内存的情况
查看slab使用情况
slabtop
cat /proc/slabinfo