Linux监控工具介绍系列——smem

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.

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

/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

永利酒店赌场 1

Linux监控工具介绍系列——smem

smem工具介绍

   
smem是Linux系统上的一款可以生成多种内存耗用报告的命令行工具。与现有工具不一样的是smem可以报告实际使用的物理内存(PSS),这是一种更有意义的指标。可以衡量虚拟内存系统的库和应用程序所占用的内存数量。

由于大部分的物理内存通常在多个应用程序之间共享,名为实际使用物理内存(RSS)的这个标准的内存耗用衡量指标会大大高估内存耗用情况。PSS这个参数而是衡量了每个应用程序在每个共享内存区中的“公平分配”,给出了一个切合实际的衡量指标。

smem有许多功能特性:

系统概况列表
按进程、映射和用户列表
按用户、映射或用户过滤
来自多个数据源的可配置列
可配置的输出单位和百分比
可配置的标题和总和
从/proc读取活动数据
从目录镜像或经过压缩的打包文件读取数据快照
面向嵌入式系统的轻型捕获工具
内置的图表生成功能

smem的系统要求

系统内核为2.6.27以上
Python版本必须为2.4或以上
依赖matplotlib库生成图表(可选的,自动检测)依赖matplotlib,是因为smem除了一般的文本信息报告外,smem 也可以生成条状或饼状图。

对应的英文原文如下:

smem is a
tool that can give numerous reports on memory usage on Linux systems.
Unlike existing tools, smem can report proportional set size (PSS),
which is a more meaningful representation of the amount of memory used
by libraries and applications in a virtual memory system.

Because large portions
of physical memory are typically shared among multiple applications, the
standard measure of memory usage known as resident set size (RSS) will
significantly overestimate memory usage. PSS instead measures each
application’s “fair share” of each shared area to give a realistic
measure.

smem has many
features:

system overview listing
listings by process, mapping, user
filtering by process, mapping, or user
configurable columns from multiple data sources
configurable output units and percentages
configurable headers and totals
reading live data from /proc
reading data snapshots from directory mirrors or compressed tarballs
lightweight capture tool for embedded systems
built-in chart generation

smem has
a few requirements:

a reasonably modern kernel (> 2.6.27 or so)
a reasonably recent version of Python (2.4 or so)
the matplotlib library for chart generation (optional, auto-detected)

Linux使用到了虚拟内存(virtual
memory),因此要准确的计算一个进程实际使用的物理内存就不是那么简单。只知道进程的虚拟内存大小也并没有太大的用处,因为还是无法获取到实际分配的物理内存大小。

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

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

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

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

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

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

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

smem工具安装

 
首先去官方网址
下载对应的smem安装包,目前最新的版本为smem-1.4.  下面安装是在RHEL
5.7上安装,不同版本系统、以及不同安装方法都有一些区别。

   1: [[email protected] tmp]# tar -xzvf smem-1.4.tar.gz 

   2: smem-1.4/.hg_archival.txt

   3: smem-1.4/.hgtags

   4: smem-1.4/COPYING

   5: smem-1.4/smem

   6: smem-1.4/smem.8

   7: smem-1.4/smemcap.c

   8: [[email protected] tmp]# cd smem-1.4

   9: [[email protected] smem-1.4]# ls

  10: COPYING  smem  smem.8  smemcap.c

  11: [[email protected] smem-1.4]# cp /tmp/smem-1.4/smem  /usr/bin

  12: [[email protected] smem-1.4]# chmod +x /usr/bin/smem

smem工具使用

查看smem命令的相关帮助信息

   1: [[email protected] tmp]# smem -h

   2: usage: smem [options]

   3:  

   4: options:

   5:   -h, --help            show this help message and exit

   6:   -H, --no-header       disable header line

   7:   -c COLUMNS, --columns=COLUMNS

   8:                         columns to show

   9:   -t, --totals          show totals

  10:   -R REALMEM, --realmem=REALMEM

  11:                         amount of physical RAM

  12:   -K KERNEL, --kernel=KERNEL

  13:                         path to kernel image

  14:   -m, --mappings        show mappings

  15:   -u, --users           show users

  16:   -w, --system          show whole system

  17:   -P PROCESSFILTER, --processfilter=PROCESSFILTER

  18:                         process filter regex

  19:   -M MAPFILTER, --mapfilter=MAPFILTER

  20:                         map filter regex

  21:   -U USERFILTER, --userfilter=USERFILTER

  22:                         user filter regex

  23:   -n, --numeric         numeric output

  24:   -s SORT, --sort=SORT  field to sort on

  25:   -r, --reverse         reverse sort

  26:   -p, --percent         show percentage

  27:   -k, --abbreviate      show unit suffixes

  28:   --pie=PIE             show pie graph

  29:   --bar=BAR             show bar graph

  30:   -S SOURCE, --source=SOURCE

  31:                         /proc data source

1:无参数时显示所有进程的内存使用情况

2:参数-u
显示每个用户所耗用的内存总量

smem -u

永利酒店赌场 2

3: 参数-p
查看耗用内存情况的百分比。

smem -p

永利酒店赌场 3

4: 参数-w
查看系统内存使用情况

   1: [[email protected] ~]# smem -w

   2: Area                           Used      Cache   Noncache 

   3: firmware/hardware                 0          0          0 

   4: kernel image                      0          0          0 

   5: kernel dynamic memory      22021892   21721584     300308 

   6: userspace memory            1899296     122424    1776872 

   7: free memory                  686340     686340          0 

   8: [[email protected] ~]# smem -w -p

   9: Area                           Used      Cache   Noncache 

  10: firmware/hardware             0.00%      0.00%      0.00% 

  11: kernel image                  0.00%      0.00%      0.00% 

  12: kernel dynamic memory        89.49%     88.27%      1.22% 

  13: userspace memory              7.73%      0.50%      7.23% 

  14: free memory                   2.78%      2.78%      0.00% 

5: 参数-R
REALMEM,REALMEM这个值是指物理内存数量。此参数可以让smem在整个系统(-w)的输出中发现固件/硬件所耗用的内存数量(对比上下即可发现,注意firmware/hardware)

   1: [[email protected] ~]# smem -R 24G -w

   2: Area                           Used      Cache   Noncache 

   3: firmware/hardware            558296          0     558296 

   4: kernel image                      0          0          0 

   5: kernel dynamic memory      22024108   21722972     301136 

   6: userspace memory            1907676     122436    1785240 

   7: free memory                  675744     675744          0 

6:参数-c
用来显示需要展示的列。

   1: [[email protected] ~]# smem -c "name user pss"

   2: Name                     User          PSS 

   3: mingetty                 root           18 

   4: mingetty                 root           18 

   5: mingetty                 root           18 

   6: mingetty                 root           18 

   7: mingetty                 root           18 

   8: bash                     root          911 

   9: sftp-server              root          939 

  10: cupsd                    root         1208 

  11: rsyslogd                 root         1403 

  12: smbd                     tibco        1474 

  13: hald                     haldaemon     1477 

  14: pickup                   postfix      1487 

  15: vmtoolsd                 root         2309 

  16: sshd                     root         2521 

  17: python                   root         5464 

  18: beremote                 root         7585 

  19: java                     weblogic    18454 

  20: java                     weblogic    31431 

  21: java                     weblogic    69389 

  22: java                     tomcat     339977 

  23: java                     tomcat     355037 

  24: java                     tomcat     421133 

  25: java                     weblogic   640531 

7: 参数-s
根据某一列(例如 rss)来排序.

永利酒店赌场 4

8: 参数-r
一般与参数-s结合使用,表示反转排序(从升序改为降序)

永利酒店赌场 5

9:参数-M
过滤相关进程。Show processes filtered by mapping

   1: [[email protected] tmp]# smem -M mysql

   2:   PID User     Command                         Swap      USS      PSS      RSS 

   3:  4172 mysql    /usr/sbin/mysqld --basedir=        0     3924     3924     3924 

   4: [[email protected] tmp]# smem -M mysql -p

   5:   PID User     Command                         Swap      USS      PSS      RSS 

   6:  4172 mysql    /usr/sbin/mysqld --basedir=    0.00%    0.38%    0.38%    0.38% 

   7: [[email protected] tmp]# 

永利酒店赌场 6

10:参数-U
按用户过滤信息

另外一些参数如何展示条状图或饼状图的功能,个人感觉这些参数的用处不大,首先服务器一般都没有安装桌面系统,都是命令界面维护、管理。无法生成相关图形。其次服务器有桌面系统,也需要安装相关依赖包,相当麻烦。除非是为了生成报告需要。

    Read data from
capture tarball smem –source capture.tar.gz

    Show a bar chart
labeled by pid smem –bar pid -c “pss uss”

    Show a pie chart of
RSS labeled by name smem –pie name -s rss

本文永久更新链接地址:

smem工具介绍
smem是Linux系统上的一款可以生成多种内存耗用报告的命令行工具。与现有工具不一样的是smem可以…

任务定义

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

永利酒店赌场 7

 

int task_Linux监控工具介绍系列——smem。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是进程虚拟内存的寻址空间大小。

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

【关于内存使用情况】

内存使用情况提示:服务器内存占用量较高的情况其实非常正常。这是因为内存的读写速度及效率远高于服务器磁盘,因此操作系统倾向于将内存作为缓冲机制预先载入数据,从而提高数据读取速度。

同样,内存使用百分比也并不是什么大问题(除非大家没有设置虚拟内存分区,但这也与内存本身无关)。大家真正需要关注的是虚拟内存使用百分比,因为只有在服务器的物理内存被全部占用后、虚拟内存才会接替而上发挥作用。这一数字越低,就说明服务器的运行状态越好。如果虚拟内存使用率为0%,则意味着我们的服务器能够完全利用物理内存执行任务。

那么虚拟内存使用率达到多少才算过高?这取决于大家自己的感觉。一般来说,如果虚拟内存使用率一直不高、那么我们的服务器的运行状态还是比较理想的。如果大家发现虚拟内存使用率随时间不断提升(例如由1%到7%再到32%),这就代表服务器上的某些进程正在疯狂吞噬内存,我们需要及时展开调查以了解具体情况(而不该直接安装更多内存)。一旦服务器用尽了所有物理内存与虚拟内存,那么整套系统的运行将变得极为缓慢,需要经过重启才能暂时恢复正常。

iostat命令——当前磁盘IO使用情况

以下命令将以每秒一次的频率连续显示十次磁盘使用率统计。请大家关注显示结果中的%util列:

$ iostat -x 1 10

永利酒店赌场 8

 

 

 

 

 

 

 

参考资料

    RES = CODE +
DATA.

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

‘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’

top工具——实时显示系统各进程的资源占用状况

类似于Windows的任务管理器。

该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

永利酒店赌场 9

 

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

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

3. cpu状态信息

us, 用户空间占用百分比

sy, 内核空间

ni, 改变过优先级的进程

id, 空闲CPU百分比

wa, IO等待占用CPU百分比

hi, 硬中断占用CPU百分比

si, 软中断占用CPU百分比

 

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

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

free命令——显示内存及buffer使用情况

free
命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略

-b  以Byte为单位显示内存使用情况。 

-k  以KB为单位显示内存使用情况。 

-m  以MB为单位显示内存使用情况。

-g   以GB为单位显示内存使用情况。 

-o  不显示缓冲区调节列。 

-s<间隔秒数>  持续观察内存使用状况。 

-t  显示内存总和列。 

-V  显示版本信息。

永利酒店赌场 10

第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。
这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached
都是属于被使用,所以他的可用内存是330MB, 已用内存是3631MB,
其中包括,内核(OS)使用+Application(X,
oracle,etc)使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached
是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。

当可用内存少于额定值的时候,就会开会进行交换.

如何看额定值:命令:cat /proc/meminfo

 

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

/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

以下项目的过度使用会直接导致高负载问题。

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

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

‘ps’ 关于内存信息解释

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

5. swap交换分区信息

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

 

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

 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

4. 内存状态

total, 物理内存总量

used, 使用中的内存

free, 空闲中

buffers, 缓存的内存量

使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

计算可用内存数,这里有个近似的计算公式:第四行的free +
第四行的buffers + 第五行的cached

 

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

$ free

             total       used       free     shared    buffers     cached

Mem:        507564     481560      26004          0      68888     185220

-/+ buffers/cache:     227452     280112

Swap:      2136604     105168    2031436

【统计信息区】

 

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) –
进程佔用实体内存大小对系统总实体内存大小的比例,以百分比显示。

‘free’ and /proc

sar工具——查看历史资源使用情况

只要通过cron命令对sysstat进行周期性执行(/etc/cron.d/sysstat),服务器的运行状态数据就会被收集起来。如果cron没有运行,sysstat将无法收集历史统计结果。

要在sar中查看历史资源使用情况,我们必须为文件提供与统计数据相符的路径。

举例来说,如果大家打算查看本月23号以来服务器的平均负载状况,可以运行以下命令:

$ sar -q -f /var/log/sa/sa23

如果大家打算查看当前日期的统计信息,则不必为其指令具体时间。

$ sar –q

 

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

/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

2. 任务Tasks

总进程数:total 122

运行态:running

休眠态:sleep

停止态:stoped

僵尸态:zombie

** 

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

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

1. 任务队列信息,同uptime命令执行结果。

当前系统时间:17:24:11

系统连续运行时长:up 1 day, 6:30

登录系统的用户数:1 user

负载情况(1分钟,5分钟,15分钟):load average

注:load
average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

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

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

【buffers和cached的区别】

磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

Page
cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page
cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page
cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer
Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

Buffer
cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer
cache中,例如,文件系统的元数据都会缓存到buffer cache中。

简单说来,page cache用来缓存文件数据,buffer
cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page
cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer
cache。

所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.

如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。

 

  • CPU
  • 内存(包括虚拟内存)
  • 磁盘IO

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

Linux中的swap与memory内存

memory就是机器的物理内存,读写速度低于cpu一个量级,但远高于磁盘。内存造价高于磁盘,并且断电丢失数据,不能把所有数据和程序都保存在内存中。

当内存不足时,把不经常运行的程序暂时放到交换区中,即swap,当需要该进程时,再重新加载回内存。

 

【各进程的状态监控】

PID — 进程id

USER — 进程所有者

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止
Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

TIME+ — 进程使用的CPU时间总计,单位1/100秒

COMMAND — 进程名称(命令名/命令行)

永利酒店赌场 11

其他命令

top –c  显示完整命令

top -p 574  显示指定的进程信息

** 

使用者权限文件

/etc/cron.deny 该文件中所列用户不允许使用crontab命令

/etc/cron.allow 该文件中所列用户允许使用crontab命令

/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名

VIRT
— virtual memory 

swap

计算机对内存分为物理内存与虚拟内存,虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。这里的虚拟内存即所谓的swap。

 
当用户提交程序,然后产生进程,在机器上运行。机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程

内存与swap之间是按照内存页为单位来交换数据的,一般Linux中页的大小设置为4kb。而内存与磁盘则是按照来交换数据的。

当物理内存使用完或者达到一定比例之后,我们可以使用swap做临时的内存使用。当物理内存和swap都被使用完那么就会出错,out
of
memory。对于使用多大比例内存之后开始使用swap,在系统的配置文件中可以通过调整参数进行修改。

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

Linux下的cron服务

这个系统服务是默认启动的。用来周期性的执行某种任务或等待处理某些事件的一个守护进程。crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件

永利酒店赌场 12

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用
crontab 工具来定制自己的计划任务。所有用户定义的crontab
文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

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

top命令查看

 

 

 

 

 

     

 

 

     VSS

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

Linux共享内存

 

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

     

 

 

 

永利酒店赌场 13

     

当然也可以使用shift+m
或大写键M
让top命令按字段%MEM来排序,当然你也可以按VIRT(虚拟内存)、SWAP(进程使用的SWAP空间)、RES(实际使用物理内存,当然这里由于涉及共享内存缘故,你看到的实际内存非常大)

 

   

  

 

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

 

 

 

 

网上有个python脚本计算程序或进程的内存使用情况,地址位于

The
-x option can be used to provide information about the memory allocation
and mapping types per mapping. The amount of resident, non-shared
anonymous, and locked memory is shown for each mapping。

 

 

 

 

# pmap -x  32341

 

 

%MEM
— Memory usage (RES)

    The  total  amount  of virtual memory
used by the task. 
It includes all code, data and shared libraries plus pages that
have been swapped out. (Note: you can define the STATSIZE=1 environment
variable and the VIRT will be calculated from the /proc/#/state VmSize
field.)

     

smem命令查看

#
ps -ef | grep tomcat

 

 

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1

 

 

 

 

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.

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

 

#
pmap 32341

 

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

永利酒店赌场 14

 

永利酒店赌场 15

 

永利酒店赌场 16

永利酒店赌场 17

python脚本查看

 

 

ps命令查看

#smem
-rs pss

 

 

 

 

 

 

 

 

     

       

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

关于smem命令,这里不做介绍,直接参考链接Linux监控工具介绍系列——smem

     A task’s currently
used share of available physical memory

# ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

oracle   32147 11.0 51.2 13252080 12666320 ?   Rs   Aug24 163:16 ora_s000_SCM2

oracle   32149 14.2 50.9 13250344 12594264 ?   Ss   Aug24 210:41 ora_s001_SCM2

oracle   32153  4.2 49.6 13250820 12279432 ?   Ss   Aug24  62:27 ora_s003_SCM2

oracle   32155  2.5 48.6 13250268 12040732 ?   Ss   Aug24  38:21 ora_s004_SCM2

oracle   32157  1.2 44.5 13250296 11011708 ?   Ss   Aug24  18:31 ora_s005_SCM2

oracle   32151  2.7 39.7 13350436 9829944 ?    Ss   Aug24  41:18 ora_s002_SCM2

oracle   32159  0.5 38.9 13250704 9625764 ?    Ss   Aug24   8:18 ora_s006_SCM2

oracle   32161  0.2 26.3 13250668 6507244 ?    Ss   Aug24   3:38 ora_s007_SCM2

oracle   32129  0.0 25.5 13299084 6324644 ?    Ss   Aug24   1:25 ora_dbw0_SCM2

oracle   32181  0.0 15.8 13250152 3913260 ?    Ss   Aug24   0:56 ora_s017_SCM2

oracle   32145  2.7 15.3 13255256 3786456 ?    Ss   Aug24  40:11 ora_d000_SCM2

oracle   32127  0.0 15.2 13248996 3762860 ?    Ss   Aug24   0:05 ora_mman_SCM2

oracle   32163  0.0 14.2 13250108 3525160 ?    Ss   Aug24   1:04 ora_s008_SCM2

oracle   32165  0.0  8.1 13250172 2007704 ?    Ss   Aug24   0:37 ora_s009_SCM2

oracle   32169  0.0  6.6 13250060 1656864 ?    Ss   Aug24   0:08 ora_s011_SCM2

oracle   32177  0.0  6.0 13250148 1498760 ?    Ss   Aug24   0:12 ora_s015_SCM2

oracle   32187  0.0  5.1 13250084 1267384 ?    Ss   Aug24   0:06 ora_s020_SCM2

oracle   32179  0.0  5.1 13250584 1280156 ?    Ss   Aug24   0:05 ora_s016_SCM2

oracle   32167  0.0  5.0 13250060 1248668 ?    Ss   Aug24   0:08 ora_s010_SCM2

oracle   32175  0.0  3.4 13250596 857380 ?     Ss   Aug24   0:03 ora_s014_SCM2

 

 

 

 

          

pmap命令查看

 

python
ps_mem.py

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

 

#ps
-eo pmem,pcpu,rss,vsize,args | sort -k 1 -n -r | less

RES  —  Resident size
(kb)

 

Linux的buffers与cached

[root@mylnx03 ~]# python ps_mem.py -h

Usage: ps_mem [OPTION]...

Show program core memory usage

 

  -h, -help                   Show this help

  -p <pid>[,pid2,...pidN]     Only show memory usage PIDs in the specified list

  -s, --split-args            Show and separate by, all command line arguments

  -t, --total                 Show only the total value

  -d, --discriminate-by-pid   Show by process rather than by program

  -S, --swap                  Show swap information

  -w <N>                      Measure and show process memory every N seconds

[root@mylnx03 ~]# python ps_mem.py  -p 32341

 Private  +   Shared  =  RAM used       Program

 

411.2 MiB + 184.0 KiB = 411.4 MiB       java

---------------------------------

                        411.4 MiB

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

 

查看进程占用的实际物理内存(与smem看到实际物理内存大小有出入,这里解释一下:SIZE:
进程使用的地址空间, 如果进程映射了100M的内存,
进程的地址空间将报告为100M内存. 事实上,
这个大小不是一个程序实际使用的内存数.
所以这里看到的内存跟smem看到的大小有出入)

SWAP  —  Swapped size
(kb)

物理内存和虚拟内存

 

** 

 

永利酒店赌场 18

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

** 

 

使用ps命令找出占用内存资源最多的20个进程(数量可以任意设置)

 

 

 

执行top命令后,执行SHIFT
+F ,可以选择按某列排序,例如选择n后,就会按字段%MEM排序

 

 

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

 

 

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

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

 

 

    VIRT = SWAP +
RES

参考资料:

 

 

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.

是否有人会觉得奇怪,为什么%MEM这一列的值加起来会大于100呢?
这个是因为这里计算的时候包含了共享内存的缘故,另外由于共享内存的缘故,你看到进程使用VIRT或RES都非常高。由于大部分的物理内存通常在多个应用程序之间共享,名为实际使用物理内存(RSS,对应top命令里面的RES)的这个标准的内存耗用衡量指标会大大高估内存耗用情况。

   The swapped out
portion of a task’s
total virtual memory image.

 

 

 

ps
aux  | awk
‘{print $6/1024 ” MBtt” $11}’  | sort -n

 

永利酒店赌场 19

 

         

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.

 

 

 

网站地图xml地图