Linux内存查看通用方法(一): user空间

目录

linux查看内存通用命令

命令1:free -h

命令2:cat /proc/PID/status

命令3:cat /proc/PID/maps

命令4:cat /proc/PID/smaps

对于内存的检测提供两个脚本方案:

对全部进程进行内存统计

对特定模块进行内存统计


linux查看内存通用命令

命令1:free -h

输出结果如下:

 描述信息分为两行,Mem(内存相关描述)和Swap(交换分区相关描述)。通常在嵌入式上不使用Swap分区,所以不进行论述

项目名

数值

意义

Total

1.2G

系统物理内存总量 1.2G

Used

769M

表示总计分配给缓存(包含buffers与cach)使用的大小为769M,但其中可能有部分缓存并未实际使用。

Free

347M

系统剩余总量347M

Shared

12M

共享内存12M

Buff/cache

137M

统称缓冲区137M,区别如下:

写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘。

磁盘读出后,暂留在缓冲区(cache),为后续程序的使用做准备。

available

405M

Free是指真正未使用的物理内存量,available是从程序角度可以看到的可用的内存数量。程序角度认为,未使用的内存和缓冲区都可以用来使用,所以理论上available=free+buff+cache,但这是一个理想的计算方法。实际上会有一些偏差

通常,需要使用free -h命令对整体内存进行判断。如果free一直在下降或used一直在上升则认为内存存在泄漏。

命令2:cat /proc/PID/status

输出结果如下:

Status下会有很多进程描述信息,但对于内存仅需要关注红框中内容即可

项目名

数值

意义

VmPeak

399256kB

是当前进程使用的虚拟内存的峰值

VmSize

333860kB

是当前进程实时虚拟内存使用情况

VmHWM

7628kB

是当前进程使用的物理内存的峰值

VmRSS

7628kB

是当前进程实时物理内存使用情况

RssAnon

4692kB

当前进程使用的匿名内存大小

RssFile

2936kB

当前进程文件使用内存大小

RssShmem

0kB

当前进程共享内存大小

VmData

67056kB

是当前进程数据段的大小

VmStk

132kB

是当前进程堆栈段的大小

VmExe

8kB

是当前进程代码段的大小

VmLib

4472kB

是当前进程使用的LIB库的大小

针对内存问题的检证,首先要确认VmSize和VmRSS的变化情况确认来是否有内存泄漏。如果出现泄漏则需要观察其他项目来判断是哪里出现了问题。

命令3:cat /proc/PID/maps

首先,要理解在Linux上,系统会对每个进行分配8G(默认设定)的虚拟空间。本命令是对当前进程的虚拟内存的具体分配结果(简略信息)。

输出的结果中会包含栈信息,堆信息,已经使用了哪些库。如下图。

命令4:cat /proc/PID/smaps

本命令是对命令3 的详细描述,会对每一具体分配段进行详细的数据展开,如下图

对于每一段的数据都会有上图所示信息,但仅需要关注红框部分信息即可,有四个关键字段 Rss 和Pss ,shared 和Private

项目名

数值

意义

Rss

8kB

是进程的物理内存占用,包括进程本身和所有链接库,RSS = private + share

Pss

8kB

链接库的共享内存平摊计算后的使用内存,(比如一个动态库有5个人引用,则将其代码段和共享内存除于5),PSS = private + share

Shared_Clean

0kB

和其他进程共享的未改写页面

Shared_Dirty

0kB

和其他进程共享的已改写页面

Private_Clean

0kB

未改写的私有页面页面

Private_Dirty

8kB

已改写的私有页面页面

其中: private = private_clean + private_dirty: 这个数据一般能够比较准确反映一个进程内部占用的内存,在内存优化的时候使用这个作为参考值比较合理,进程的物理内存占用就是smaps中所有的private的相加(链接的动态库的也要统计进去)。

仅仅你自己使用的库 是属于Private的,如果别人也用这个库 则是属于Shared。当然你的代码如果链接给别人,也是属于Shared。

所以想要得到确定的内存使用量,将/proc/PID/smap中的所有Private_Clean和Private_Dirty累加起来,是很好的解决方案

对于内存的检测提供两个脚本方案:

对全部进程进行内存统计

检测全部进程内存量的脚本,(输出时通过 ] 符号进行分割,方便用excel进行分列数据统计)

#!/bin/bash


a=1
 echo "8 > /proc/sys/kernel/printk" 
while [ $a -eq 1 ];do
 
echo "########################"
echo `date "+%Y-%m-%d %H:%M:%S"`


echo "free"
free -h

for pid in `ls -1 /proc/ | egrep "[[:digit:]]"`; 
do if [ -f "/proc/$pid/status" ]; 
	then proc_name=`grep '^Name' /proc/$pid/status | awk '{print $2}'`; 
	mem_VmPeak=`grep '^VmPeak' /proc/$pid/status | awk '{print $2}'`; 
	mem_VmRSS=`grep '^VmRSS' /proc/$pid/status | awk '{print $2}'`;
	mem_VmSize=`grep '^VmSize' /proc/$pid/status | awk '{print $2}'`;
	mem_VmData=`grep '^VmData' /proc/$pid/status | awk '{print $2}'`;
	if [[ $mem_VmPeak != "" ]]; then echo "]$proc_name] VmPeak : ]$mem_VmPeak] kB VmRSS : ]$mem_VmRSS] kB VmSize : ]$mem_VmSize] kB VmData : ]$mem_VmData] kB";
	fi
 fi
 done



 echo "########################"
 sleep 30s
 done

对特定模块进行内存统计

当确认是某一个模块的问题时,在通过下面的脚本对单独的模块进行内存统计

(下面的脚本中替换loggmr为想调查的进程名即可)

#!/bin/bash
while [ 1 -eq 1 ];do
echo "########################"
echo `date "+%Y-%m-%d %H:%M:%S"`
free
pid=$(ps -aux |grep logmgr|head -n 1|awk '{print $2}')
echo "++++++++++++++++++++"
echo RssSum_SUM:`cat /proc/$pid/smaps |grep Rss|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo PssSum_SUM:`cat /proc/$pid/smaps |grep Pss|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Shared_Clean_SUM:`cat /proc/$pid/smaps |grep Shared_Clean|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Shared_Dirty_SUM:`cat /proc/$pid/smaps |grep Shared_Dirty|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Private_Clean_SUM:`cat /proc/$pid/smaps |grep Private_Clean|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo Private_Dirty_SUM:`cat /proc/$pid/smaps |grep Private_Dirty|awk 'BEGIN{sum=0;}{sum=sum+$2;}END{print sum}'`KB
echo "-----------------------"
cat /proc/$pid/status

sleep 30s
done

 

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linux分为:redhat linux系列和debian系列。 X Window是一种协议。 unix图形环境是CDE:common desktop environment通用桌面环境。 linux系统结构:硬件、内核层、shell层、应用层、用户。 在安装linux的时候,会弹出 CD Found To begin testing the CD media before installation press OK. Choose Skip to skip the media test and start the installation. OK Skip 选择:"OK"就开始检测CD光盘的完好性,"Skip"则跳过光盘介质的检测,直接开始安装。 说明:下载镜像文件的时候一般会给出MD5值,只要检测MD5值是不是一样就行了,就不必进行检测了。检测过程很长。 安装linux的时候,选择语言为简体中文,并不代表安装完后linux就显示为简体中文,这里选择语言是安装过程的语言。这是安装界面上会提示:What language would you like to use during the installation process?在安装过程中你想使用什么语言? linux中每一个目录可以单独划分磁盘空间,但这个目录仍在/目录下,例如将tmp目录单独划分磁盘空间为100M,如果/目录在第一块磁盘中,则tmp在第二块磁盘中。但tmp目录仍然在/目录下。在做服务器时应该将web目录单独划分一个磁盘空间。如果sda1表示/分区,则sda2表示tmp分区。sdb表示第二块scsi硬盘,即电脑上有两块硬盘。sda1和sda2相当于windows下的c盘和d盘的关系。 各种接口的磁盘在linux中文件名分别为: /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名。第一块硬盘为sda,第二块硬盘为sdb,根据主板上的接口来决定的。将第一块硬盘分两个区,就有sda1和sda2。 /dev/hd[a-p][1-63]:为IDE接口的磁盘文件名。 linux中必须要划分的分区有两个:根分区/、swap分区。 linux中的文件(普通文件或设备文件等)都必须有挂在点,只有挂载到一个目录下才能访问,swap分区是不需要挂载点的,在分区的时候,将文件系统类型选为swap,挂载点自动会变为灰色。一般linux中的swap大小为内存的两倍。swap类似windows下的虚拟内存。 切换用户命令:su - 用户名 vim中的插入命令: a 在光标后附加文本 A 在本行行末附加文本 i 在光标前插入文本 I 在本行开始处插入文本 o 在光标下一行插入新行附加文本 O 在光标上一行插入新行附加文本 查找时区分大小写使用命令:set noic 查找时忽略大小写使用命令:set ic 退出命令:wq与ZZ命令等价。 导入文件:在末行模式下,输入:r /home/text,即将text文件中的内容导入到当前编辑的文件中,导入到光标处。在gvim中也可以使用此命令。 在末行模式下输入:!命令,如:!ls /home,就会显示ls命令的结果,会提示按enter键或任意键返回。在gvim中也可以执行此命令,如:!dir,就会显示当前目录中的信息。 导入文件命令和!命令以结合起来使用,在末行模式下输入:r !命令。就会将命令的结果导入到当前文件光标处。 bin:binary usr:user sbin:super binary linux中命名规则:除了/之外,所有的字符都合法。大小写敏感,以.开头的文件是隐藏文件。 命令格式:命令 -选项 参数 当有多个选项时,可以写在一起。 ..表示当前目录的父目录,cd ..当中一定有个空格。 文件处理命令:ls 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示当前或指定目录中的文件 语法:ls 选项[-ald] [文件或目录] -a 显示所有文件,包括隐藏文件,a是all的缩写。 -l 详细信息显示,l是long的缩写。 -d 查看目录属性 在一个目录中查看当前目录的详细信息:ls -ld .即可。 在一个目录中查看当前目录的父目录的详细信息:ls -ld ..即可。 root执行的命令一般放在/sbin或/usr/sbin目录中,所有用户都能执行的命令一般放在/bin或/usr/bin目录中。 d 表示目录 - 表示二进制文件 l 软链接文件link 详细分析:drwxr-xr-x 2 root root 4096 12-01 20:52 bin drwxr-xr-x r:read w:write x:execute执行 -:表示无此权限 所有者:u user 所属组:g group 其他人:o other 2:表示硬链接数。 第一个root:是所有者。 第二个root:是所属组。 4096:目录大小,不是目录中所有文件的大小。 12-01 20:52是创建时间或最后修改的时间 bin 文件名或目录名 Linux中数据块是储存数据的基本数据单元,在linux中可以设置3中数据块大小分别是1024(1kB),2048(2KB),4096(4KB)。数据块大小决定了文件磁盘占有量,如果设置了数据块大小是1024,不管文件有多大,至少要占1KB的空间,所以可以根据存放文件的大小来合理设置数据块大小。 设置数据块:mkfs.ext3 -b 2046 /dev/hda5,格式化并设置数据块为2KB。另外linux在每个分区都有保留块,这是专门留给root用户及其所属组使用,别的用户是无法使用的,一般为总数据块的5%,但是如果你的磁盘大的话,就显的浪费了。 mkfs.ext3 -b 2046 -m 2 /dev/hda5。格式化并设置数据块为2KB,设置保留块为2%。或者用tune2fs -m 2 /dev/hda4 这种方法不用格式化就可设置。 tune2fs -l /dev/hda5,可以查看文件系统的详细信息. tune2fs -j /dev/hda4,可以将ext2转换为ext3而不损坏数据。 文件系统的检查工具:fsck e2fsck e2fsck 用时有危险,不能很好的辨识文件系统,特别是ext2,ext3混用时。 fsck得用法:fsck -t ext3 /dev/hda5 或 fsck.ext3 /dev/hda5。 root用户使用su -用户名切换用户时是不需要密码的,但是普通用户切换账户需要密码。 查看一个文件的信息,ls -l /.../文件名。 查看一个目录的信息,ls -ld 目录名。 查看/目录的详细信息,而不是/目录下目录或文件的详细信息。-d查看目录属性。 ls的-d选项是查看目录属性。 文件处理命令:mkdir 命令名称:mkdir 命令英文原意:make directories 命令所在路径:/bin/mkdir 执行权限:所有用户 语法:mkdir [ 目录名] 功能描述:创建新目录 范例:$ mkdir newdir 文件处理命令:touch 命令名称:touch 命令所在路径:/bin/touch 执行权限:所有用户 语法:touch [文件名] 功能描述:创建空文件 范例:$ touch newfile 文件处理命令:cp 命令名称:cp 命令英文原意:copy 命令所在路径:/bin/cp 执行权限:所有用户 语法:cp -R [源文件或目录] [ 目的目录] -R 复制目录 -p 复制后的文件的时间和原文件时间一样 功能描述:复制文件或目录 范例: $ cp file1 file2 dir1 将文件file1、file2复制到目录dir1 $ cp -R dir1 dir2 将dir1下的所有文件及子目录复制到dir2 文件处理命令:mv 命令名称:mv 命令英文原意:move 命令所在路径:/bin/mv 执行权限:所有用户 语法:mv [源文件或目录] [目的目录] 功能描述:移动文件、更名 范例: $ mv file1 file2 将当前目录下文件file1更名为file2 $ mv /home/zk/text.c /home/text.cpp 将文件text.c移动到目录home下,并更名为text.cpp 文件处理命令:rm 命令名称:rm 命令英文原意:remove 命令所在路径:/bin/rm 执行权限:所有用户 语法:rm -r [文件或目录] -r 删除目录 功能描述:删除文件 范例: $ rm file3 删除文件file3,删除时会出现提示。 $ rm -r dir1 删除目录dir1,删除目录时会出现提示。 由于linux中的别名机制,使用rm等价与使用rm -i,这样在删除文件或目录时会有提示,如果不想出现提示内容,需要加选项-f。写脚本的时候需要加上-f,因为批量删除文件或目录不需要每次都提示询问。 在unix中rm删除文件是不是出现提示询问的。 文件处理命令:cat 命令名称:cat 命令英文原意:concatenate and display files 命令所在路径:/bin/cat 执行权限:所有用户 语法:cat [文件名] 功能描述:显示文件内容 范例:$ cat /etc/issue $ cat /etc/services cat查看文件内容,当文件较长时,无法查看到文件开头的内容,只能看到最后的内容。cat是一次性显示完文件内容。 文件处理命令:more 命令名称:more 命令所在路径:/bin/more 执行权限:所有用户 语法:more [文件名] (空格) 或f 显示下一页 (Enter) 显示下一行 q或Q 退出 功能描述:分页显示文件内容 范例: $ more /etc/services 文件处理指令:head 指令名称:head 指令所在路径:/bin/head 执行权限:所有用户All User 语法:head -num [文件名] -num 显示文件的前num行 功能描述:查看文件的前几行 范例:$ head -20 /etc/services 不加选项默认是查看前10行。 文件处理指令:tail 指令名称:tail 指令所在路径:/bin/tail 执行权限:All User 语法:tail -num [文件名] -num 显示文件的后num行 -f 动态显示文件内容 功能描述:查看文件的后几行 范例:$ tail -30 /etc/services 查看日志文件的时候,日志文件是动态变化的。 文件处理命令:ln 命令名称:ln 命令英文原意:link 命令所在路径:/bin/ln 执行权限:所有用户 语法:ln [源文件][ 目标文件] 创建硬链接 ln -s [源文件][ 目标文件] 创建软链接 功能描述:产生链接文件 范例: $ ln -s /etc/issue /issue.soft 创建文件/etc/issue的软链接/issue.soft $ ln /etc/issue /issue.hard 创建文件/etc/issue的硬链接/issue.hard $ln -s /etc/issue /issue.soft 用ls -l查看软链接文件有如下信息 lrwxrwxrwx root root 10 12-01 23:12 /issue.soft ->/etc/issue 软链接文件的权限都是lrwxrwxrwx,信息中有一个箭头指向原文件,且软链接文件的大小很小,时间和原文件也不同。软链接文件类似windows下的快捷方式。 1、不允许给目录创建硬链接; 2、只有在同一文件系统中的文件之间才能创建链接。 生成一个硬链接文件后查看原文件和硬链接文件,除了文件位置或文件名不同外,其余的信息都是相同的。硬链接文件和原文件是同时更新的,因为他们有相同的inode节点。索引节点inode:Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。建立硬连接实际上只是增加了一个目录项,但并没有复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。 ls -i或--inode 显示文件和目录的inode编号。 权限管理命令:chmod 命令名称:chmod 命令英文原意:change the permissions权限 mode of a file 命令所在路径:/bin/chmod 执行权限:
Linux系统中,我们可以通过多种方法查看内存分配情况。其中一种方法是通过运行命令"cat /proc/meminfo"来查看系统的内存信息。这个命令会显示系统的总内存大小、可用内存大小、已使用内存大小等相关信息。 另一种常用的方法是通过运行命令"cat /proc/PID/maps"来查看特定进程的内存分配情况。其中,PID是指进程的ID号。这个命令会显示该进程的虚拟内存分配情况,包括栈信息、堆信息和已加载的库等。通过观察该命令的输出,我们可以了解到该进程使用了哪些内存资源。 此外,还可以使用其他工具来查看内存分配情况,比如top命令和free命令。top命令可以实时查看系统的进程和内存使用情况,而free命令可以显示系统的内存使用情况和交换空间的情况。这些命令可以帮助我们更全面地了解系统中的内存分配情况。 总之,在Linux系统中,我们可以使用命令行工具来查看内存分配情况,包括系统整体的内存使用情况以及特定进程的内存分配情况。这些工具可以帮助我们监控系统的内存情况,及时发现并解决内存泄漏等问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux内存查看通用方法(二): kernel空间](https://blog.csdn.net/qq_34597963/article/details/128315575)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux内存查看通用方法(一): user空间](https://blog.csdn.net/qq_34597963/article/details/126023451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值