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

本文详细介绍Linux下smem工具的功能和使用方法,smem用于生成内存消耗报告,提供PSS等指标,更准确反映应用程序和库的内存使用情况。文章涵盖安装步骤、参数说明及实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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工具安装

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

   1: [root@DB-Server 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: [root@DB-Server tmp]# cd smem-1.4
   9: [root@DB-Server smem-1.4]# ls
  10: COPYING  smem  smem.8  smemcap.c
  11: [root@DB-Server smem-1.4]# cp /tmp/smem-1.4/smem  /usr/bin
  12: [root@DB-Server smem-1.4]# chmod +x /usr/bin/smem

 

smem工具使用

 

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

   1: [root@DB-Server 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

clip_image001

 

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

smem -p

clip_image002

 

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

   1: [root@DB-Server01 ~]# 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: [root@DB-Server01 ~]# 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: [root@DB-Server01 ~]# 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: [root@DB-Server01 ~]# 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)来排序.

clip_image003

 

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

clip_image004

 

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

   1: [root@DB-Server tmp]# smem -M mysql
   2:   PID User     Command                         Swap      USS      PSS      RSS 
   3:  4172 mysql    /usr/sbin/mysqld --basedir=        0     3924     3924     3924 
   4: [root@DB-Server 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: [root@DB-Server tmp]# 

clip_image005

 

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

 

参考资料

https://www.selenic.com/smem/

http://www.uml.org.cn/itnews/2013121108.asp

https://linux.cn/article-4492-1.html

转发:http://www.cnblogs.com/kerrycode/p/5079319.html

<think>嗯,用户想了解Linux的内存管理机制,包括虚拟内存、物理内存、分页和交换空间。这属于操作系统底层知识,需要系统性地梳理。 用户可能是个运维工程师或开发者,正在排查性能问题,或者单纯想深入理解Linux原理。从提问方式看,ta应该有一定技术基础,但需要更全面的机制说明。 参考站内资料,内存管理涉及几个核心部分:物理内存如何分配、虚拟地址映射、交换空间的作用。引用[1]提到交换空间是物理内存的扩展,内核会把不活跃的内存页换出到磁盘;引用[2][3]则通过free命令展示内存状态的不同视角——内核层和应用层看到的内存使用量差异很大,因为buffers/cached内存实际可被回收利用。 先解释内存分层:应用程序看到的是虚拟地址空间,通过MMU(内存管理单元)映射到物理内存。当物理内存不足时,内核启动页面回收:优先释放干净的缓存页(如文件缓存),若还不够,就将部分内存页写入交换分区(引用[1]的机制),这个过程叫"换出";当程序再次访问这些页时触发缺页中断,内核再将其从交换区"换入"。 分页机制是基础:物理内存和虚拟内存都被划分为4KB的页(大内存可用2MB/1GB大页)。页表维护虚拟页到物理页帧的映射,多级页表能节省空间。当发生缺页时,内核可能直接从缓存分配页帧(minor fault),或需从磁盘加载数据(major fault)。 交换空间是最后防线:引用[2][4]的free输出中,Swap使用量极小(264KB),说明系统内存充足。但若应用层已用内存(3180208K)接近物理内存总量(16402432K),交换空间就会频繁启用,此时性能急剧下降。 最后补充两个关键点:一是OOM Killer机制——当交换空间也用尽时,内核会强制终止进程;二是内存过量分配(overcommit),允许进程申请超过物理内存+交换空间的内存总量,依赖后续实际使用时的缺页处理。 相关问题设计围绕应用场景:如何监控内存压力(page fault频率、swap I/O)、优化方向(减少交换、调整页大小)、容器环境差异(cgroup限制)等。这样既能深化理论,又衔接实践。</think>以下是对Linux内存管理机制的详细说明,重点涵盖虚拟内存、物理内存、分页机制和交换空间: --- ### **1. 核心机制** #### **1.1 物理内存(Physical Memory)** - **定义**:硬件实际提供的RAM,由内核直接管理。 - **管理方式**: - **分区管理**:内核将物理内存划分为`页帧(Page Frames)`,通常每页大小为4KB(可配置为2MB或1GB大页)。 - **分配策略**:采用`伙伴系统(Buddy System)`管理空闲页帧,减少内存碎片;`Slab分配器`优化小对象(如进程描述符)的分配效率[^2][^3]。 #### **1.2 虚拟内存(Virtual Memory)** - **核心作用**:为每个进程提供独立的虚拟地址空间(32位系统3GB用户空间/1GB内核空间;64位系统空间更大)。 - **关键特性**: - **隔离性**:进程无法直接访问其他进程或内核的内存。 - **映射机制**:通过`页表(Page Table)`将虚拟地址映射到物理地址(由MMU硬件加速)。 - **延迟分配**:仅在实际访问内存时分配物理页(`按需分页`)。 #### **1.3 分页机制(Paging)** - **页表结构**:多级页表(如x86_64的4级页表:PGD→PUD→PMD→PTE)节省空间[^3]。 - **缺页异常处理**: - **场景**:访问未映射的页、只读页写入、交换页调入。 - **流程**:触发缺页中断 → 内核检查合法性 → 分配物理页或从交换空间加载数据。 #### **1.4 交换空间(Swap Space)** - **目的**:扩展可用内存,将不活跃的页换出到磁盘(如`/swapfile`或独立分区)[^1]。 - **工作流程**: ```mermaid graph LR A[物理内存不足] --> B[内核扫描页缓存] B --> C{页是否被修改?} C -->|是| D[写入交换空间] C -->|否| E[直接丢弃] D & E --> F[释放物理页] ``` - **交换策略**:优先换出`非活跃`且`未锁定`的页(通过LRU算法)。 --- ### **2. 内存状态监控(以free命令为例)** ```bash $ free -m total used free shared buff/cache available Mem: 15942 876 1234 32 14831 14701 Swap: 8192 0 8192 ``` - **内核视角(Mem行)**: - `buff/cache`:文件缓存(可快速回收)占用的内存。 - `free`:完全未被使用的内存(不含缓存)。 - **应用层视角(available)**: - 包含`free + buff/cache可回收部分`,反映进程实际可用内存[^4]。 > 💡 **关键差异**:物理内存的`free`值较小(如示例中1234MB)不表示内存不足,因为`buff/cache`(14831MB)可被内核即时回收供应用使用[^3][^4]。 --- ### **3. 优化机制** - **页面缓存(Page Cache)**:缓存磁盘文件,加速读写(通过`readahead`预读)。 - **交换抑制(Swapiness)**: - 参数`/proc/sys/vm/swappiness`(0-100)控制换出倾向:值越低越倾向保留文件缓存。 - 数据库场景建议设为低值(如10),避免关键数据被换出。 - **内存压缩(zswap/zram)**:将待换出页压缩后存于RAM,减少磁盘I/O。 --- ### **4. 异常处理** - **OOM Killer**:当内存耗尽且交换空间不足时,内核根据`oom_score`终止进程。 - **调试工具**: - `vmstat`:监控缺页(fault/s)、交换(si/so)。 - `smem`:按进程统计实际内存占用(PSS/USS)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值