9159金沙游艺场


字符串反转的9种方法
图片 9
cisco模拟器GNS3和虚拟机VMware的整合

9159金沙游艺场Linux内存测量(基础篇)

 

%mem 内存使用率
virt 是虚拟内存
res是常驻内存
shr是共享内存

这是一篇关于Linux内存measuring的基础教程。除了free之外,我们可以通过/proc得到更多信息。它们是/proc下的mapssmaps
statm

在Linux中,有很多命令或工具查看内存使用情况,今天我们来看看如何查看进程消耗、占用的内存情况,Linux的内存管理和相关概念要比Windows复杂一些。在此之前,我们需要了解一下Linux系统下面有关内存的专用名词和专业术语概念:

top命令下按f键可以看到详细说明
* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
b: PPID       = Parent Process Pid
c: RUSER      = Real user name
d: UID        = User Id
f: GROUP      = Group Name
g: TTY        = Controlling Tty
j: P          = Last used cpu (SMP)
p: SWAP       = Swapped size (kb)
l: TIME       = CPU Time
r: CODE       = Code size (kb)
s: DATA       = Data+Stack size (kb)
u: nFLT       = Page Fault count
v: nDRT       = Dirty Pages count
y: WCHAN      = Sleeping in Function
z: Flags      = Task Flags <sched.h>
* X: COMMAND    = Command name/line

‘free’ and /proc

 

top命令下要查看某个用户启动的进程:先输入u,然后输入用户名,再回车

‘free’
会显示机器上的内存使用信息。能实时跟踪整个系统内存的使用情况。

 

VIRT:virtual memory usage。Virtual这个词很神,一般解释是:virtual
adj.虚的, 实质的, [物]有效的,
事实上的。到底是虚的还是实的?让Google给Define之后,将就明白一点,就是这东西还是非物质的,但是有效果的,不发生在真实世界的,发生在软
件世界的等等。这个内存使用就是一个应用占有的地址空间,只是要应用程序要求的,就全算在这里,而不管它真的用了没有。写程序怕出错,又不在乎占用的时
候,多开点内存也是很正常的。
RES:resident memory
usage。常驻内存。这个值就是该应用程序真的使用的内存,但还有两个小问题,一是有些东西可能放在交换盘上了(SWAP),二是有些内存可能是共享的。
SHR:shared
memory。共享内存。就是说这一块内存空间有可能也被其他应用程序使用着;而Virt
- Shr似乎就是这个程序所要求的并且没有共享的内存空间。
DATA:数据占用的内存。如果top没有显示,按f键可以显示出来。这一块是真正的该程序要求的数据空间,是真正在运行中要使用的。

$ free

             total       used       free     shared    buffers     cached

Mem:        507564     481560      26004          0      68888     185220

-/+ buffers/cache:     227452     280112

Swap:      2136604     105168    2031436

物理内存和虚拟内存

============================================

除了free命令之外,/proc/meminfo能够提供更多的信息。以下就是一个例子:
512 Mb RAM, 运行在 Linux 2.6.3:

 

top里面描述进程内存使用量的数据来源于/proc/$pid/statm这个文件。通过观察kernel的代码就能弄清楚SHR,VIRT和RES这些数值的具体含义。

$ cat /proc/meminfo

MemTotal:       507564 kB

MemFree:         26004 kB

Buffers:         68888 kB

Cached:         185220 kB

SwapCached:      29348 kB

Active:         342488 kB

Inactive:        32092 kB

HighTotal:           0 kB

HighFree:            0 kB

LowTotal:       507564 kB

LowFree:         26004 kB

SwapTotal:     2136604 kB

SwapFree:      2031436 kB

Dirty:              88 kB

Writeback:           0 kB

Mapped:         165648 kB

Slab:            73212 kB

Committed_AS:   343172 kB

PageTables:       2644 kB

VmallocTotal:   524212 kB

VmallocUsed:      7692 kB

VmallocChunk:   516328 kB

物理内存:就是系统硬件提供的内存大小,是真正的内存,一般叫做内存条。也叫随机存取存储器(random
access memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。

Linux通过一个叫做 task_statm 的函数来返回进程的内存使用状况

测量用户进程的内存使用:

 

int task_statm(struct mm_struct *mm, int *shared, int *text,
               int *data, int *resident)
{
        *shared = get_mm_counter(mm, file_rss);
        *text = (PAGE_ALIGN(mm->end_code) – (mm->start_code &
PAGE_MASK))
                                                           >>
PAGE_SHIFT;
        *data = mm->total_vm – mm->shared_vm;
        *resident = *shared + get_mm_counter(mm, anon_rss);
        return mm->total_vm;
}
上面的代码中shared就是page
cache里面实际使用了的物理内存的页数,text是代码所占用的页
数,data是总虚拟内存页数减去共享的虚拟内存页数,resident是所有在使用的物理内存的页
数。最后返回的mm->total_vm是进程虚拟内存的寻址空间大小。

‘ps’ 关于内存信息解释

 ‘ps’
能够提供内存信息情况。比如:

虚拟内存:相对于物理内存,在Linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap
Space)。Linux会在物理内存不足时,使用虚拟内存,内核会把暂时不用的内存块信息写到虚拟内存,这样物理内存就得到了释放,这块儿内存就可以用于其他目的,而需要用到这些内容的时候,这些信息就会被重新从虚拟内存读入物理内存。

函数get_mm_counter并不会做什么计算,它的功能是保证数值读取的原子性。

 BJATCA01sta1:/proc/3105(8)#ps -p 3129 -o pid,rss,vsz,comm

  
PID  
RSS   VSZ COMMAND

  3129
23100 213664 GAM

·        
 %Mem – 内存使用百分比

·        
VSZ – Virtual Size

·        
RSS – Resident Set Size

·        
SIZE – Equivalent to VSZ

 

上面的数值最后会通过 procfs输出
到/proc/$pid/statm中去。他们与top显示的数值对应关系如下。

‘top’ 显示信息可参见 ‘man top’:

·        
 %MEM — Memory usage (RES)   
       
进程当前使用的物理内存。

·        
VIRT — Virtual Image (kb)          进程整个virtual
memory空间,
VIRT = SWAP + RES

·        
SWAP — Swapped size (kb)    virtual
memory交换到disk或者没有加载到物理内存里的空间。

·        
RES — Resident size (kb) 
进程驻留在内存里面的内存大小, 
RES = CODE + DATA.

·        
CODE — Code size (kb)          
加载到内存里面的可执行文件代码

·        
DATA — Data+Stack size (kb) 加载到内存里面的数据和栈

·        
SHR — Shared Mem size (kb) 共享内存大小

·        
nDRT — Dirty Pages count      
页面已经修改但是还没有保存到disk的数目。

/proc info

更多信息可以使用命令:’man
proc’

 

SHR: shared
RES: resident
VIRT: mm->total_vm
CODE: code
DATA: data

/proc/<pid>/statm

/proc/<pid>/statm
fields: columns are (in pages):

total program size|

resident set size|

shared pages|

text (code) |

data/stack |

library |

dirty pages |

Here an
example: 693 406 586 158 0 535 0

Linux的buffers与cached

=======================================

/proc/<pid>/status

/proc/<pid>/status
fields:

·                    
Vm Size: 2772 kB

·                    
Vm Lck: 0 kB – ???

·                    
Vm RSS: 1624 kB

·                    
Vm Data: 404 kB

·                    
Vm Stk: 24 kB

·                    
Vm Exe: 608 kB

·                    
Vm Lib: 1440 kB

 

o: VIRT (Virtual Image) – 进程使用的总虚拟内存 (virtual memory)
大小,包括进程的程序码、资料和共享程序库再加上被置换 (swap out)
的空间。VIRT = SWAP + RES
p: SWAP (Swapped size) – 进程被置换的虚拟内存空间大小。
q: RES (Resident size) – 进程非被置换的实体内存大小。RES = CODE + DATA
r: CODE’ (Code size) – 进程的程序码在实体内存佔用空间大小,亦叫作 text
resident set (TRS)。
s: DATA (Data+Stack size) – 进程佔用实体内存中的非程序码部份大小,亦叫作
data resident set (DRS)。
t: SHR (Shared Mem size) –
进程使用的共享内存大小,即可以和其他进程共享的内存空间。
n: %MEM (Memory usage) –
进程佔用实体内存大小对系统总实体内存大小的比例,以百分比显示。

/proc/<pid>/maps

maps显示所有共享库映射到进程地址空间的详细情况。Example:

$ cat /proc/25042/maps

08048000-080e0000 r-xp 00000000 03:05 196610     /bin/bash

080e0000-080e6000 rw-p 00097000 03:05 196610     /bin/bash

080e6000-08148000 rwxp 00000000 00:00 0

40000000-40016000 r-xp 00000000 03:05 147471     /lib/ld-2.3.3.so

40016000-40017000 rw-p 00015000 03:05 147471     /lib/ld-2.3.3.so

40017000-40018000 rw-p 00000000 00:00 0

40018000-40019000 r--p 00000000 03:05 184090     /usr/share/locale/en_US/LC_IDENTIFICATION

40019000-4001a000 r--p 00000000 03:05 184089     /usr/share/locale/en_US/LC_MEASUREMENT

4001a000-4001b000 r--p 00000000 03:05 184083     /usr/share/locale/en_US/LC_TELEPHONE

4001b000-4001c000 r--p 00000000 03:05 184091     /usr/share/locale/en_US/LC_ADDRESS

4001c000-4001d000 r--p 00000000 03:05 184086     /usr/share/locale/en_US/LC_NAME

4001d000-4001e000 r--p 00000000 03:05 184084     /usr/share/locale/en_US/LC_PAPER

4001e000-4001f000 r--p 00000000 03:05 184088     /usr/share/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES

4001f000-40020000 r--p 00000000 03:05 184087     /usr/share/locale/en_US/LC_MONETARY

40020000-40026000 r--p 00000000 03:05 183689     /usr/share/locale/ISO-8859-1/LC_COLLATE

40026000-40027000 r--p 00000000 03:05 184082     /usr/share/locale/en_US/LC_TIME

40027000-4002a000 r-xp 00000000 03:05 147459     /lib/libtermcap.so.2.0.8

4002a000-4002b000 rw-p 00002000 03:05 147459     /lib/libtermcap.so.2.0.8

4002b000-4002c000 rw-p 00000000 00:00 0

4002c000-4002e000 r-xp 00000000 03:05 147482     /lib/libdl-2.3.3.so

4002e000-4002f000 rw-p 00001000 03:05 147482     /lib/libdl-2.3.3.so

4002f000-40171000 r-xp 00000000 03:05 147511     /lib/tls/libc-2.3.3.so

40171000-40174000 rw-p 00142000 03:05 147511     /lib/tls/libc-2.3.3.so

40174000-40177000 rw-p 00000000 00:00 0

40177000-40178000 r--p 00000000 03:05 184085     /usr/share/locale/en_US/LC_NUMERIC

40178000-401a4000 r--p 00000000 03:05 183688     /usr/share/locale/ISO-8859-1/LC_CTYPE

401a4000-401a5000 r-xp 00000000 03:05 180462     /usr/lib/gconv/ISO8859-1.so

401a5000-401a6000 rw-p 00001000 03:05 180462     /usr/lib/gconv/ISO8859-1.so

401b3000-401bd000 r-xp 00000000 03:05 147492     /lib/libnss_files-2.3.3.so

401bd000-401be000 rw-p 00009000 03:05 147492     /lib/libnss_files-2.3.3.so

bfffa000-c0000000 rwxp ffffb000 00:00 0

ffffe000-fffff000 ---p 00000000 00:00 0

9159金沙游艺场 1

在Linux中经常发现空闲的内存很少,似乎所有的内存都被消耗殆尽了,表面上看是内存不够用了,很多新手看到内存被“消耗殆尽”非常紧张,其实这个是因为Linux系统将空闲的内存用来做磁盘文件数据的缓存。这个导致你的系统看起来处于内存非常紧急的状况。但是实际上不是这样。这个区别于Windows的内存管理。Linux会利用空闲的内存来做cached
& buffers。

 

 

buffers是指用来给块设备做的缓冲大小(块设备的读写缓冲区),它只记录文件系统的metadata以及
tracking in-flight pages.

 

Buffers
are associated with a specific block device, and cover caching of
filesystem metadata as well as tracking in-flight pages. The cache only
contains parked file data. That is, the buffers remember what’s in
directories, what file permissions are, and keep track of what memory is
being written from or read to for a particular block device. The cache
only contains the contents of the files themselves.

 

  

cached是作为page
cache的内存,
文件系统的cache。你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache
Memory(缓存内存)。即使你的程序运行结束后,Cache
Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。其实这缓存内存(Cache
Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用

 

Cached
is the size of the page cache. Buffers is the size of in-memory block
I/O buffers. Cached matters; Buffers is largely irrelevant.

 

Cached
is the size of the Linux page cache, minus the memory in the swap cache,
which is represented by SwapCached (thus the total page cache size is
Cached + SwapCached). Linux performs all file I/O through the page
cache. Writes are implemented as simply marking as dirty the
corresponding pages in the page cache; the flusher threads then
periodically write back to disk any dirty pages. Reads are implemented
by returning the data from the page cache; if the data is not yet in the
cache, it is first populated. On a modern Linux system, Cached can
easily be several gigabytes. It will shrink only in response to memory
pressure. The system will purge the page cache along with swapping data
out to disk to make available more memory as needed.

Buffers
are in-memory block I/O buffers. They are relatively short-lived. Prior
to Linux kernel version 2.4, Linux had separate page and buffer caches.
Since 2.4, the page and buffer cache are unified and Buffers is raw disk
blocks not represented in the page cache—i.e., not file data. The
Buffers metric is thus of minimal importance. On most systems, Buffers
is often only tens of megabytes.

 

 

Linux共享内存

 

共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同
malloc()
函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个。其实所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的虚拟空间来实现的。由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要像消息队列那样进行复制,所以共享内存的效率很高。共享内存可以通过mmap()映射普通文件机制来实现,也可以System
V共享内存机制来实现,System
V是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信,也就是说每个共享内存区域对应特殊文件系统shm中的一个文件。

 

 

另外,我们还必须了解RSS、PSS、USS等相关概念:

 

     VSS

Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

     

RSS –
Resident Set Size 实际使用物理内存(包含共享库占用的内存)

     

PSS –
Proportional Set Size
实际使用的物理内存(比例分配共享库占用的内存)

     

USS –
Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

 

RSS(Resident
set
size),使用top命令可以查询到,是最常用的内存指标,表示进程占用的物理内存大小。但是,将各进程的RSS值相加,通常会超出整个系统的内存消耗,这是因为RSS中包含了各进程间共享的内存。

 

PSS(Proportional
set
size)所有使用某共享库的程序均分该共享库占用的内存时,每个进程占用的内存。显然所有进程的PSS之和就是系统的内存使用量。它会更准确一些,它将共享内存的大小进行平均后,再分摊到各进程上去。

 

USS(Unique
set size
)进程独自占用的内存,它是PSS中自己的部分,它只计算了进程独自占用的内存大小,不包含任何共享的部分。

     

          

所以下面介绍的命令,有些查看进程的虚拟内存使用,有些是查看进程的RSS或实际物理内存。在讲述的时候,我们会标注这些信息。

 

 

 

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图