工作中难免遇到服务器内存不足,导致服务无法正常运行的情况,这里总结几种在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 命令下的交互指令
- 增加或减少展示列
按f,可选择显示内容(前标*为当前展示内容)
按a-z选择显示/隐藏对应内容,enter确认
- 改变显示顺序
按o,改变显示的顺序。
按a-z将列右移,A-Z左移,enter确认
- 排序/倒序
按F 或 O,再按a-z将进程按照相应的列进行排序
R,将当前排序倒置
- 其它
按 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等。
(不能随便乱写,否则用户无法登录)