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中内存页的不同种类,上面不同类型的页面基本上可以分为两种不同的类型,一种是可回收页面,另外一种为不可以回收的页面。除了第一种,内核系统中分配的内存为不可回收的外,其它类型的页面都是可以回收的页面。

可回收页面分类

    匿名页面需要将页面内容交换到交换设备或者文件才能回收该页面
    文件地址空间缓存,块缓存通过回写页面内容后再回收页面.

查看系统中不同类型内存使用状态

1.vmstat 命令

    使用这个命令可以看到系统中空闲内存数量,buffer缓存数量,页缓存数量.同时可以看到交换分区换入,换出页面的数目。如果在嵌入式linux设备中,需要单独移植该命令。

biao@ubuntu:~/test/iostat/sysstat/biao/bin$ 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 st
 0  0    478    103     89    328    0    0     5     4   12    0  6  2 92  0  0
 0  0    478    103     89    328    0    0     0     0  156  718 10  1 89  0  0
 0  0    478    103     89    328    0    0     0     0  141  707 11  1 88  0  0
 0  0    478    103     89    328    0    0     0     0   85  373  5  1 94  0  0
 0  0    478    103     89    328    0    0     0     0  235 1422 19  2 79  0  0
 0  0    478    103     89    328    0    0     0     0  119  394  5  1 95  0  0
 0  0    478    103     89    328    0    0     0     0  152  726 12  1 87  0  0
 0  0    478    103     89    328    0    0     0     0  128  688 10  2 88  0  0
 0  0    478    103     89    328    0    0     0     0  129  690 11  1 88  0  0
 0  0    478    103     89    328    0    0     0     0  103  387  5  1 94  0  0
 0  0    478    103     89    328    0    0     0     0  129  676 10  1 89  0  0
 0  0    478    103     89    328    0    0     0     0   91  380  6  1 93  0  0
 0  0    478    103     89    328    0    0     0     0  148  721 11  2 88  0  0
 0  0    478    103     89    328    0    0     0     0  152  695 11  1 88  0  0
 0  0    478    103     89    328    0    0     0     0  128  692 12  1 87  0  0
 0  0    478    103     89    328    0    0     0     0   93  374  6  1 94  0  0
^C
biao@ubuntu:~/test/iostat/sysstat/biao/bin$ vmstat 1 -S k
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 478281 103481  89907 328622    0    0     5     4   12    0  6  2 92  0  0
 0  0 478281 103481  89907 328622    0    0     0     0  126  698  9  2 89  0  0
 2  0 478281 103481  89907 328622    0    0     0     0  132  429 10  1 89  0  0
 0  0 478281 103481  89907 328622    0    0     0     0   95  653  7  1 92  0  0
 2  0 478281 103481  89907 328622    0    0     0     0  147  445  8  1 91  0  0
 0  0 478281 103481  89907 328622    0    0     0     0  134  694  8  1 92  0  0
 0  0 478281 103481  89907 328622    0    0     0     0  163  705  9  1 90  0  0
 0  0 478281 103481  89907 328622    0    0     0     0  164  721 10  1 89  0  0
 1  0 478281 103481  89907 328622    0    0     0     0  104  285 10  1 90  0  0

2.top命令

    查看进程内存使用情况

top
shift + m

linux系统中的进程按照消耗内存大小进行排列,VIRT表示虚拟地址空间内存大小,RES表示实际内存使用大小。

shift + p

linux系统中的进程按照消耗CPU大小进行排列,在嵌入式设备中,top命令的有些功能可能被裁减过。

3.pmap命令

    使用pmap查看进程内存使用情况,该命令可以查看到一个进程中非常详细的内存使用情况,并且在嵌入式linux设备中一般bosybox中是有带该命令,可以直接使用。

pmap pid
biao@ubuntu:~/test/iostat/sysstat/biao/bin$ pmap 13692
13692:   -bash
0000000000400000    976K r-x-- bash
00000000006f3000      4K r---- bash
00000000006f4000     36K rw--- bash
00000000006fd000     24K rw---   [ anon ]
0000000000ea6000   4876K rw---   [ anon ]
00007fb104973000     44K r-x-- libnss_files-2.23.so
00007fb10497e000   2044K ----- libnss_files-2.23.so
00007fb104b7d000      4K r---- libnss_files-2.23.so
00007fb104b7e000      4K rw--- libnss_files-2.23.so
00007fb104b7f000     24K rw---   [ anon ]
00007fb104b85000     44K r-x-- libnss_nis-2.23.so
00007fb104b90000   2044K ----- libnss_nis-2.23.so
00007fb104d8f000      4K r---- libnss_nis-2.23.so
00007fb104d90000      4K rw--- libnss_nis-2.23.so
00007fb104d91000     88K r-x-- libnsl-2.23.so
00007fb104da7000   2044K ----- libnsl-2.23.so
00007fb104fa6000      4K r---- libnsl-2.23.so
00007fb104fa7000      4K rw--- libnsl-2.23.so
00007fb104fa8000      8K rw---   [ anon ]
00007fb104faa000     32K r-x-- libnss_compat-2.23.so
00007fb104fb2000   2044K ----- libnss_compat-2.23.so
00007fb1051b1000      4K r---- libnss_compat-2.23.so
00007fb1051b2000      4K rw--- libnss_compat-2.23.so
00007fb1051b3000   2912K r---- locale-archive
00007fb10548b000   1792K r-x-- libc-2.23.so
00007fb10564b000   2048K ----- libc-2.23.so
00007fb10584b000     16K r---- libc-2.23.so
00007fb10584f000      8K rw--- libc-2.23.so
00007fb105851000     16K rw---   [ anon ]
00007fb105855000     12K r-x-- libdl-2.23.so
00007fb105858000   2044K ----- libdl-2.23.so
00007fb105a57000      4K r---- libdl-2.23.so
00007fb105a58000      4K rw--- libdl-2.23.so
00007fb105a59000    148K r-x-- libtinfo.so.5.9
00007fb105a7e000   2044K ----- libtinfo.so.5.9
00007fb105c7d000     16K r---- libtinfo.so.5.9
00007fb105c81000      4K rw--- libtinfo.so.5.9
00007fb105c82000    152K r-x-- ld-2.23.so
00007fb105e86000     16K rw---   [ anon ]
00007fb105e9e000     28K r--s- gconv-modules.cache
00007fb105ea5000      8K rw---   [ anon ]
00007fb105ea7000      4K r---- ld-2.23.so
00007fb105ea8000      4K rw--- ld-2.23.so
00007fb105ea9000      4K rw---   [ anon ]
00007ffd321f7000    132K rw---   [ stack ]
00007ffd323b6000      8K r----   [ anon ]
00007ffd323b8000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total            25800K
biao@ubuntu:~/test/iostat/sysstat/biao/bin$ 

4.lsabtop命令

查看slab使用情况,该命令一般在嵌入式设置中没有,需要单独移植。

slabtop
cat /proc/slabinfo

5.free命令

查看当前系统未使用的和已使用的内存数目,以及被内核使用的内存缓冲区大小,该命令一般嵌入式linux设备也有.

biao@ubuntu:~/test/iostat/sysstat/biao/bin$ free
              total        used        free      shared  buff/cache   available
Mem:         994888      523088       76424       18104      395376      227140
Swap:       1045500      469968      575532
biao@ubuntu:~/test/iostat/sysstat/biao/bin$ 

    对于嵌入式设备,可以使用free,top pmap 命令查看系统内存使用情况,这些命令具体功能及具体参数,可以直接查看man文档。

    以上内容,在http://blog.chinaunix.net/uid-28236237-id-5756373.html 的基础上整理而来

猜你喜欢

转载自blog.csdn.net/li_wen01/article/details/82663281