Linux服务器查看内存占用

Linux下查看内存占用

  • ps
  • pmap
  • cat
  • top
    • top命令的交互
    • 结果集参数
  • 用户信息

工作中难免遇到服务器内存不足,导致服务无法正常运行的情况,这里总结几种在Linux服务器下,查看内存占用情况的方法。

ps

使用 ps 命令,根据服务进程号,查看内存占用情况。命令及结果集如下:

[root@localhost service]$ ps -eo 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | awk '$1 ~ /[pid]/'
49662 java java -jar service.jar 0.1 1028144 5711632 Jan08 user 504

[pid] 代表的是目标进程的进程号
查询结果依次展示的,即是命令中标识出来的含义。

pid: 进程号,此处为 49662
comm: 启动命令名称 此处为 java
args:启动进程使用的命令 此处为 java -jar service.jar(若命令较长,可能展示不完整)
pcpu:占用cpu使用率,此处为 0.1
rsz:占用的物理内存,此处为 1028144
vsz:占用的虚拟内存,此处为 5711632
stime:进程启动时间,此处为 Jan08
user:用户,此处为 root

pmap

使用pmap -x命令,也可以查看内存占用情况

[root@localhost service]$ pmap -x [pid]
49662:   java -jar ./service.jar
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000       4       4       0 r-x--  java
0000000000600000       4       4       4 r----  java
0000000000601000       4       4       4 rw---  java
----------------  ------  ------  ------
total kB         5711632 1028520 1014620

在返回结果中,最下方的 total 行,就是内存占用情况。结果集各关键参数代表的含义如下

首行,49662:进程ID;java -jar ./service.jar:启动进程使用的命令
尾行,5711632:占用的虚拟内存;1028520:占用的物理内存,单位Kb

cat

命令及结果集如下

[root@localhost service]$ cat /proc/[pid]/status
Name:	java
State:	S (sleeping)
Tgid:	49662
Pid:	49662
PPid:	1
TracerPid:	0
Uid:	504	504	504	504
Gid:	504	504	504	504
Utrace:	0
FDSize:	512
Groups:	504 
VmPeak:	 5755620 kB
VmSize:	 5711632 kB
VmLck:	       0 kB
VmHWM:	 1039992 kB
VmRSS:	 1028520 kB
VmData:	 5565984 kB
VmStk:	      88 kB
VmExe:	       4 kB
VmLib:	   16240 kB
VmPTE:	    2416 kB
VmSwap:	       0 kB
Threads:	41
SigQ:	0/63733
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000000003
SigCgt:	2000000181005ccc
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	ffffffffffffffff
Cpus_allowed:	ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:	0-127
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	1
nonvoluntary_ctxt_switches:	2

结果集中关键参数意义如下

VmSize:占用虚拟内存
VmRss: 占用物理内存
VmData:数据或栈占用的内存

top

本文介绍的最后一种,也是最为常见常用的一种,top命令。
当内存或cpu出现一些问题的时候,top命令也是我们查看问题的首选。
命令及结果集如下

[root@localhost service]$ top
top - 17:05:21 up 129 days, 22:09,  3 users,  load average: 0.00, 0.00, 0.00
Tasks: 215 total,   1 running, 214 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8177924k total,  8008908k used,   169016k free,   172512k buffers
Swap:  8191992k total,  1037684k used,  7154308k free,  1318064k cached
   PID USER   PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  DATA COMMAND            
   339 root   20   0     0    0    0 S  0.3  0.0  40:29.88    0 scsi_eh_3
  2952 user   20   0 6080m 190m 7108 S  0.3  2.4 399:59.42 5.8g java
 49662 user   20   0 5577m 1.0g  13m S  0.3 12.6   2:03.84 5.3g java    
 76511 user   20   0 15152 1340  956 R  0.3  0.0   0:00.35  616 top
112124 user   20   0 5674m 549m  11m S  0.3  6.9  64:30.19 5.4g java

这部分结果集中,各参数代表的含义如下
首行,top - 17:05:21 up 129 days, 22:09, 3 users, load average: 0.00, 0.00, 0.00

表示标识系统运行时间和平均负载,“top - ”后依次是:
当前时间 17:05:21
系统已运行时间:129 days, 22:09
当前登录用户的数量:3 users
最近五分钟、十分钟、十五分钟的平均负载:0.00, 0.00, 0.00

第二行,Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie

表示任务,依次是
系统当前总进程个数:215 total
运行中的进程:1 running
睡眠中的进程:214 sleeping
stoped状态的进程:0 stopped
zombie(僵尸)状态的进程:0 zombie

第三行,Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

表示CPU状态,显示不同模式下所占用的CPU时间百分比:
us: 运行用户进程的CPU时间
sy:运行内核进程的CPU时间
ni:运行以调整优先级的用户进程的CPU时间
wa:用于等待IO完成的CPU时间
hi:处理硬件中断的CPU时间
si:处理软件中断的CPU时间
st:这个虚拟机被hypervisor偷去的CPU时间

第四行,Mem: 8177924k total, 8008908k used, 169016k free, 172512k buffers

表示物理内存使用情况,左到右依次是:
物理内存总量,此处为 8177924k
已占用内存总量,此处为 8008908k
空闲内存总量,此处为 169016k
缓存内存量,此处为 172512k

第五行,Swap: 8191992k total, 1037684k used, 7154308k free, 1318064k cached

SWAP交换分区内存使用情况,左到右依次是:
交换区总量,此处为 8191992k
已占用交换区总量,此处为 1037684k
空闲交换区总量,此处为 7154308k
缓冲的交换区总量,此处为 1318064k

第六行及更下方,展示的是各进程参数的监控情况,下方稍后做更加详细直观的介绍。

top命令的交互

先来了解下 top 命令下的交互指令

  1. 增加或减少展示列

按f,可选择显示内容(前标*为当前展示内容)
按a-z选择显示/隐藏对应内容,enter确认

  1. 改变显示顺序

按o,改变显示的顺序。
按a-z将列右移,A-Z左移,enter确认

  1. 排序/倒序

按F 或 O,再按a-z将进程按照相应的列进行排序
R,将当前排序倒置

  1. 其它

按 s 改变画面更新频率
按 N 以PID大小顺序展示列表
按 P 以CPU使用率大小顺序展示列表
按 M 以内存占用率大小顺序展示列表
按 h 显示帮助
按 n 设置在列表中展示的进程数量
按 q 退出top

注意:这里介绍的交互命令都是区分大小写的

结果集参数

前文展示的top命令结果集,是我这边服务器的默认结果集。
根据上述的交互指令,可以设置其它列内容的展示/隐藏。
当使用命令将全部内容选中为展示列后,结果如下:

   PID USER PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+    PPID RUSER  UID GROUP  TTY   P SWAP   TIME CODE DATA nFLT nDRT WCHAN     Flags    COMMAND
  2952 user 20   0 6080m 190m 7108 S  0.7  2.4 400:01.31      1 user   504 user   ?     0 664m 400:01    4 5.8g  675    0 futex_wai ..4.2... java
 76715 user 20   0 15032 1344  964 R  0.7  0.0   0:00.17  66327 user   504 user   pts/1 0    0   0:00   56  496    0    0 -         ..4.2... top
  1722 root 20   0  244m 2488 1660 S  0.3  0.0 124:59.65      1 root     0 root   ?     0 2100 124:59  688  76m   24    0 poll_sche ..4.21.. vmtoolsd
 49662 user 20   0 5577m 1.0g  13m S  0.3 12.6   2:04.54      1 user   504 user   ?     1    0   2:04    4 5.3g    0    0 futex_wai ..4.2... java
120837 user 20   0 5732m 1.1g  14m S  0.3 13.6   6:29.97      1 user   504 user   ?     2    0   6:29    4 5.5g    0    0 futex_wai ..4.2... java
127176 user 20   0 5737m 1.1g  11m S  0.3 14.4 135:06.98      1 user   504 user   ?     0    0 135:06    4 5.5g   70    0 futex_wai ..4.2... java

以上述结果集为例,在此详细介绍一下各个参数

PR: 优先级别,越小越高
NI:nice值,负值标识高优先级,正值表示低优先级
VIRT:占用的虚拟内存
RES:占用的物理内存
SHR:进程使用的共享内存
S:进程状态。D-不可中断的睡眠状态;R-运行;S-睡眠;T-被跟踪/已停止;Z-僵尸进程;N-表示该进程优先值负数
%CPU:CPU使用百分比
%MEM:物理内存使用百分比
TIME+:进程使用CPU的总时间,精度-百分秒
PPID:父进程ID
RUSER:Real user name
UID: 用户ID
TTY:启动进程的终端名字。不是终端启动的进程则显示为"?"
P:最后使用的CPU,仅在多CPU环境下有意义
TIME:进程使用CPU的总时间,精度-秒
SWAP:进程使用的虚拟内存中被换出的大小,单位Kb
CODE:可执行代码占用的物理内存大小,单位Kb
DATA:可执行代码意外的部分(数据+栈)占用的内存的大小
nFLT:页面错误次数
nDRT:最后一次写入到现在,被修改过的页面数
WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
Flags:任务标志
COMMAND:启动进程使用的命令名

用户信息

第一种查询方法,即 ps 命令中,涉及到了uid参数,索性直接把查询Linux用户的命令也做一下介绍

[user@localhost service]$ cat /etc/passwd

执行上述命令,可查看服务器上全部用户及对应用户的信息。
具体信息格式如下

user:x:504:504::/home/user:/bin/bash

在该返回信息中,以":" 相分隔的各参数从左到右依次是:

user:用户
x:x表示有密码;删除x表示没有密码
504:UID,用户ID,唯一标识
504:GID,用户组ID(用户组有初始组和附加组,此处GID为初始组ID)
空:描述性信息,相当于描述、备注类信息
/home/user:主目录
/bin/bash:命令解释器权限.若为/bin/bash,则拥有命令权限;若为/sbin/nologin,则无登录权限;若为/usr/bin/passwd,则只有修改密码权限;此外还有/bin/sync、/sbin/halt、/sbin/shutdown等。
(不能随便乱写,否则用户无法登录)

你可能感兴趣的:(服务器,linux,运维,bash)