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

   首先去官方网址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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力

这一部分内容比较简单 直接把代码发上来 不想自己写的同学可以直接抱走~ 练习题&#xff1a;ab 问题 #include<bits/stdc.h> using namespace std;int main() {int n,x,y;cin>>n;while(n--){cin>>x>>y;cout<<xy<<endl;} } 练习题&#xff…

【原】AMR音频解码插件开发总结

近段时间一直在忙碌AMR音频解码插件的开发&#xff0c;由于对驱动开发和音频编解码知识了解不是很多&#xff0c;加之自身经验欠缺&#xff0c;致使开发过程中碰到太多棘手的问题。经过努力学习和领导的大力帮助下终于完成了插件的开发&#xff0c;现将开发过程中得来的经验总结…

GC算法 垃圾收集器

概述 垃圾收集 Garbage Collection 通常被称为“GC”&#xff0c;它诞生于1960年 MIT 的 Lisp 语言&#xff0c;经过半个多世纪&#xff0c;目前已经十分成熟了。 jvm 中&#xff0c;程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭&#xff0c;栈帧随着方法的进入…

Nginx----原理

原理 master-workers的机制的好处  首先&#xff0c;对于每个worker进程来说&#xff0c;独立的进程&#xff0c;不需要加锁&#xff0c;所以省掉了锁带来的开销&#xff0c;同时在编程以及问题查找时&#xff0c;也会方便很多。其次&#xff0c;采用独立的进程&#xff0c;可…

一个有趣的数学题

题目&#xff1a;abcde*4 edcba&#xff0c;求abcde 解题过程&#xff1a; 1. 首先确定a和e&#xff0c;a*4不可能是两位数&#xff0c;不然abcde*4的值肯定大于5位&#xff0c;所以a的取值为1或2&#xff0c;e为4或8&#xff1b; 2. 又e*4的的个位为a&#xff0c;则a2&#x…

JVM架构和GC垃圾回收机制--面试

JVM架构和GC垃圾回收机制详解 JVM架构图分析 下图&#xff1a;参考网络书籍&#xff0c;如有侵权请见谅 &#xff08;想了解Hadoop内存溢出请看&#xff1a; Hadoop内存溢出(OOM)分类、参数调优化&#xff09; JVM被分为三个主要的子系统 &#xff08;1&#xff09;类加载器…

学习HTML:iframe用法总结收藏

<iframe>是框架的一种形式&#xff0c;也比较常用到。 一&#xff1a;几个例子——演示iframe的基本用法 例1&#xff1a;<iframe width420 height330 frameborder0 scrollingauto src"URL" mce_src"URL"></iframe> 不用多说了&#xf…

java中线程池的几种实现方式

1、线程池简介&#xff1a; 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为&#xff1a;T1 创建线程时间&#xff0c;T2 在线程中…

MySQL----分库分表

参考&#xff1a;https://mp.weixin.qq.com/s?__bizMzI5MzYzMDAwNw&mid2247487130&idx2&sn7d384ef9ca47b933e801fdd2459b6b2f&chksmec6e77c2db19fed4a3ed3a0625c1f318675a0a10fdb1ce8a31f032b91ee31377e1ee1e183258&mpshare1&scene23&srcid0927Uq…

IP过滤-驱动和应用程序通信

前段时间写一个IP过滤的驱动&#xff0c;以前没有接触过驱动&#xff0c;Google一把&#xff0c;网上有很多例子&#xff0c;不过都不能满足自己的需求&#xff0c;所以就参考大家的资料自己研究一下。呵呵。程序用了三层&#xff1a;第一层就是驱动来负责过滤数据包并把拦截的…

JVM架构和GC垃圾回收机制详解

JVM架构图分析 下图&#xff1a;参考网络书籍&#xff0c;如有侵权请见谅 &#xff08;想了解Hadoop内存溢出请看&#xff1a; Hadoop内存溢出(OOM)分类、参数调优化&#xff09; JVM被分为三个主要的子系统 &#xff08;1&#xff09;类加载器子系统&#xff08;2&#xff0…

IIS不能发布asp.net 应用程序

IIS不能发布asp.net 应用程序最近在写程序的时候&#xff0c;突然项目经理想发布一下网站看一下做的效果当我发布的时候遇到 下面的错误&#xff1a;&#xff1a;使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 名称以无效字符开头的…

线程高级篇-Lock锁和Condition条件

浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程 便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1).获取锁的线程执行完该代码…

CERL 2.0 预告:Erlang Style Concurrency + 状态机

开始构想CERL 2.0版本。特点&#xff1a; Erlang Style Concurrency&#xff08;Erlang 风格并发&#xff09; 状态机&#xff0c;突破 Erlang Style Concurrency 模型的缺陷。在目前的 CERL 库 SDL接口描述语言的基础上&#xff0c;CERL 2.0 还将是一门语言&#xff08;用于实…

枚举类型创建实例

使用枚举创建单例模式 使用枚举创建的单例模式&#xff1a; public enum EasySingleton{INSTANCE; } 代码就这么简单&#xff0c;你可以使用EasySingleton.INSTANCE调用它&#xff0c;比起你在单例中调用getInstance()方法容易多了。 我们来看看正常情况下是怎样创建单例模…

前端学习(41):背景实现视觉差效果

首先准备三张图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&quo…

CAS原理分析

在JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff08;后面的章节还会谈到锁&#xff09;。 锁机制存在以下问题&#xff1a; &#xff08;1&#xff09;在多线程竞争下&#xff0c;加锁、释放锁会导致比较多的上下文切换和调度延时&…

深入理解HashMap(原理,查找,扩容)

面试的时候闻到了Hashmap的扩容机制&#xff0c;之前只看到了Hasmap的实现机制&#xff0c;补一下基础知识&#xff0c;讲的非常好 原文链接&#xff1a; http://www.iteye.com/topic/539465 Hashmap是一种非常常用的、应用广泛的数据类型&#xff0c;最近研究到相关的内容&…

密码加密和解密

/// <summary> /// 字符串加密 /// </summary> /// <param name"original">明文</param> /// <returns>密文</returns> public static string Encrypt(string original) { …

【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序

c中的对象的构造顺序与析构顺序 问题一 当程序中存在多个对象时&#xff0c;如何确定这些对象的析构顺序&#xff1f; 一.单个函数创建时构造函数的调用顺序 1.调用父类的构造过程 2.调用成员变量的构造函数(调用顺序与声明顺序相同) 3.调用类自身的构造函数 而析构函数与…