linux内存计算

详细内容请看,转载http://linuxperf.com/?p=142,本篇为阅读后的理解

linux内存分为三部分,内核,进程,cache

linux内核:

内核所用内存的静态部分,比如内核代码、页描述符等数据在引导阶段就分配掉了,并不计入MemTotal里,而是算作Reserved(在dmesg中能看到)
 

【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X

Kernel的动态内存分配通过以下几种接口:

alloc_pages/__get_free_page: 以页为单位分配

vmalloc: 以字节为单位分配虚拟地址连续的内存块

slab :allocator,kmalloc: 以字节为单位分配物理地址连续的内存块,它是以slab为基础的,使用slab层的general caches — 大小为2^n,名称是kmalloc-32、kmalloc-64等(在老kernel上的名称是size-32、size-64等)。

Page Table:用于将内存的虚拟地址翻译成物理地址

KernelStack:每一个用户线程都会分配一个kernel stack(内核栈),内核栈虽然属于线程,但用户态的代码不能访问,只有通过系统调用(syscall)、自陷(trap)或异常(exception)进入内核态的时候才会用到

Bounce:有些老设备只能访问低端内存,比如16M以下的内存,当应用程序发出一个I/O 请求,DMA的目的地址却是高端内存时(比如在16M以上),内核将在低端内存中分配一个临时buffer作为跳转,把位于高端内存的缓存数据复制到此处。这种额外的数据拷贝被称为“bounce buffering”,会降低I/O 性能。大量分配的bounce buffers 也会占用额外的内存。

用户进程:

Hugepages在/proc/meminfo中是被独立统计的,与其它统计项不重叠,既不计入进程的RSS/PSS中,又不计入LRU Active/Inactive,也不会计入cache/buffer。如果进程使用了Hugepages,它的RSS/PSS不会增加。

使用Hugepages有三种方式:
(详见 https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt)

  1. mount一个特殊的 hugetlbfs 文件系统,在上面创建文件,然后用mmap() 进行访问,如果要用 read() 访问也是可以的,但是 write() 不行。
  2. 通过shmget/shmat也可以使用Hugepages,调用shmget申请共享内存时要加上 SHM_HUGETLB 标志。
  3. 通过 mmap(),调用时指定MAP_HUGETLB 标志也可以使用Huagepages。

Rss,Pss,Uss

用户进程的内存有:进程的代码,进程malloc,进程shared,进程映射文件

进程独有内存Uss,进程的代码,堆栈,不共享的内存文件和shared

进程的分享内存Pss,进程独有内存加(分享的shared和映射文件/分享进程个数)

进程Rss,是进程所有相关的内存

cache

free总的cache是文件映射读写缓存,加快访问速度

buffer是磁盘io的读写队列缓存,可以加快io读写,调节速度不匹配

cache中有mapped映射文件,进程代码,文件系统,shared memory在内核中都是基于tmpfs实现的

drop cache可以回收内存,不能回收文件系统

 

 

 

你可能感兴趣的:(linux)