linux运维(二)内存占用分析

一、centos内存高,查看占用内存, top命令详解

1.1: free 命令是

复制代码
free
单位K
free -m
单位M
free -h 
单位G

free最常规的查看内存占用情况的命令

1.2: 参数说明

复制代码
total 总物理内存
used 已经使用的内存
free 没有使用的内存
shared 多进程共享内存
buff/cache 读写缓存内存
available 应用程序可用物理内存 

二、top命令

  • top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令。
  • 按 q 退出
  • top命令也可以用来查内存
  • 输入top命令
  • 按x,高亮排序列,默认应该是%CPU,按CPU占用排序。
  • 按shift +M (或 按shift+> ), 可以看到高亮部分到%MEM,按内存占用排序。
  • 就可以查到具体是哪个进程在占用内存:
  • 然后 ps -ef |grep PID

三、ps命令

查看内存占用前10位:

root@www \~# ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -10

复制代码
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql      1183 20.1 13.6 2522020 525860 ?      Ssl  11:42  52:13 /usr/local/mysql8/msql-8.0.30/bin/mysqld --defaults-file=/etc/my.cnf
root       1194  0.2  3.8 1017104 150568 ?      Ssl  11:42   0:31 /data/minio_data/minio server --console-address 192.168.1.100:33806 --address 192.168.1.100:9666 /data/minio_data >/data/minio_data/minio-start.log 2>&1 &
root       1196  0.0  0.5 1002932 19924 ?       Ssl  11:42   0:01 /usr/sbin/libvirtd
root       1181  0.0  0.5 574280 19504 ?        Ssl  11:42   0:04 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root        886  0.1  0.2 272008  8504 ?        Sl   11:42   0:20 /usr/sbin/vmtoolsd
root        724  0.0  0.2 474848  8988 ?        Ssl  11:42   0:02 /usr/sbin/NetworkManager --no-daemon
root       1186  0.0  0.2 216400  7944 ?        Ssl  11:42   0:01 /usr/sbin/rsyslogd -n
polkitd     666  0.0  0.2 612232 10076 ?        Ssl  11:42   0:00 /usr/lib/polkit-1/polkitd --no-debug
root        924  0.0  0.1  59484  5980 ?        S    11:42   0:00 /usr/lib/vmware-vgauth/VGAuthService -s
root       3477  0.0  0.1 161804  6120 ?        Ss   15:01   0:00 sshd: root@pts/1

或者:

root@www \~# ps aux --sort -rss | head -n 10

复制代码
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql      1183 20.2 13.6 2522020 525860 ?      Ssl  11:42  52:46 /usr/local/mysql8/msql-8.0.30/bin/mysqld --defaults-file=/etc/my.cnf
root       1194  0.2  3.8 1017104 150568 ?      Ssl  11:42   0:31 /data/minio_data/minio server --console-address 192.168.1.100:33806 --address 192.168.1.100:9666 /data/minio_data >/data/minio_data/minio-start.log 2>&1 &
root       1196  0.0  0.5 1002932 19924 ?       Ssl  11:42   0:01 /usr/sbin/libvirtd
root       1181  0.0  0.5 574280 19504 ?        Ssl  11:42   0:04 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
polkitd     666  0.0  0.2 612232 10076 ?        Ssl  11:42   0:00 /usr/lib/polkit-1/polkitd --no-debug
root        724  0.0  0.2 474848  8988 ?        Ssl  11:42   0:02 /usr/sbin/NetworkManager --no-daemon
root        886  0.1  0.2 272008  8504 ?        Sl   11:42   0:20 /usr/sbin/vmtoolsd
root       1186  0.0  0.2 216400  7944 ?        Ssl  11:42   0:01 /usr/sbin/rsyslogd -n
root       3038  0.0  0.1 161804  6120 ?        Ss   14:12   0:00 sshd: root@pts/0

还可以查CPU:

查看CPU占用前10位:

root@www \~# ps aux | head -1;ps aux |grep -v PID |sort -rn -k +3 | head -10

或者:

root@www \~# ps aux --sort -pcpu | head -n 10

复制代码
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql      1183 20.6 13.6 2522020 525860 ?      Ssl  11:42  54:00 /usr/local/mysql8/msql-8.0.30/bin/mysqld --defaults-file=/etc/my.cnf
root       3623  0.7  0.0      0     0 ?        S    15:08   0:26 [kworker/3:2]
root        419  0.4  0.0      0     0 ?        S<   11:42   1:06 [kworker/3:1H]
root       1194  0.2  3.8 1017104 150568 ?      Ssl  11:42   0:31 /data/minio_data/minio server --console-address 192.168.1.100:33806 --address 192.168.1.100:9666 /data/minio_data >/data/minio_data/minio-start.log 2>&1 &
root        141  0.1  0.0      0     0 ?        S    11:42   0:24 [kworker/6:1]
root        350  0.1  0.0      0     0 ?        S<   11:42   0:19 [kworker/5:1H]
root        351  0.1  0.0      0     0 ?        S<   11:42   0:19 [kworker/6:1H]
root        435  0.1  0.0      0     0 ?        S<   11:42   0:19 [kworker/4:1H]
root        455  0.1  0.0      0     0 ?        S    11:42   0:24 [kworker/4:2]

top命令详解

1、命令用法

首先解释一下该命令的具体用法。

top使用格式:

复制代码
top [-] [d] [p] [q] [c] [C] [S] [s] [n]

参数说明:

  • d 指定每两次屏幕信息刷新之间的时间间隔;
  • p 通过指定监控进程ID来仅仅监控某个进程的状态;
  • q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行;
  • S 指定累计模式;
  • s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险;
  • i 使top不显示任何闲置或者僵死进程;
  • c 显示整个命令行而不只是显示命令名;

比如:

复制代码
top                                // 每隔5秒显式所有进程的资源占用情况;
top -d 2                        // 每隔2秒显式所有进程的资源占用情况;
top -c                           // 每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名);
top -p 12345 -p 6789  // 每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况;
top -d 2 -c -p 123456  // 每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数;

2、实例解读

然后,我们结合实际的例子,来聊一聊该命令执行过程中所输出的信息,如何进行解读

第一行:运行概览

复制代码
top - 09:15:56 up 31 min, 2 users, load average: 0.01, 0.03, 0.05
内容 含义
09:15:56 当前系统时间
up 31 min 系统已经运行了31分钟(在这期间没有重启过)
2 users 当前有2个客户端登录系统
load average: 0.01, 0.03, 0.05 过去1分钟、5分钟、15分钟内系统的负载情况

注:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行:任务概览

Tasks: 191 total, 2 running, 189 sleeping, 0 stopped, 0 zombie

这一行比较简单,就不多解释了,只说明一点,zombie表示僵尸进程,不理解的可自行百度。

第三行:CPU状态

复制代码
%Cpu(s): 0.7 us, 0.5 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
内容 含义
0.7 us 用户空间所占百分比
0.5 sy 内核空间所占百分比
0.0 ni 改变过优先级的进程所占百分比
98.8 id 空闲进程所占百分比
0.0 wa IO等待进程所占百分比
0.0 hi 硬中断(Hardware IRQ)所占百分比
0.0 si 软中断(Software Interrupts)所占百分比
0.0 st 虚拟机所占百分比

同样也要说明一点,这里CPU的使用比率和windows概念不同,如果你不理解用户空间和内核空间,自行百度吧。

第四行:内存状态

复制代码
KiB Mem: 3081144 total, 1445648 used, 1635496 free, 323064 buffers
KiB Swap: 4191228 total, 0 used, 4191228 free. 527176 cached Mem
内容 含义
3081144 total 物理内存总量(3G)
1445648 used 使用中的内存总量(1.38GB)
1635496 free 空闲内存总量(1.56G)
323064 buffers 缓存的内存量 (315M)
4191228 total 交换分区总量(4G)
0 used 已使用的交换分区(0)
4191228 free 空闲状态的交换分区(4G)
527176 cached Mem 缓冲状态的交换分区(514K)

这里要说明一下,我们不能用windows的内存概念来理解这些数据,Linux的内存管理有其特殊性,复杂点需要一本书来说明,这里只是简单说点和我们传统概念(windows)的不同。

MEM一行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

对于内存监控,在top里我们要时刻监控SWAP一行中的已用数值used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

剩余行:进程详情

首先说明一点,上述命令的显示状态,是在Ubuntu 14.04(64位)系统的缺省状态下所显示的。在其他的系统下,或者同一个系统的不同设置状态下,top命令所显示出来的列项目是有所区别的,有可能与上述图片中的不一样。换句话说,top命令其实能显示非常多的项目信息,远不止上述图片中所述,究竟有哪些呢,如下表所述:

序号 名称 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数
w S 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

从上表可以看出,其实top命令可以显示的信息列最多有26列,每一列的代号分别对应为a-z,只不过在缺省状态下,系统只显示其中比较重要的【PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND】列,而用户是完全通过指定的方式可以进行随意增减的。同时,在top命令运行的过程中,还可以进行一些其他的自定义设置,包括刷新速度、排序方式等,那么,究竟应该如何操作呢?请看下节:

3、个性化设置

上文说到,可以在输入top命令的时候携带一些参数来进行配置,可是有时候,输入top命令的时候,并不很清楚它的运行状态,有些参数也不知道如何设置,比如排序模式、需要显示的列等,而是要等到top命令运行起来了,才好进行设置。因此,有没有一种方法是在top命令运行的过程中,能够对其显示的模式、内容等进行临时的设置呢?

答案当然是有的!下面就介绍一下在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。

h或者? 显示帮助画面,给出一些简短的命令总结说明;

k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽;

i 忽略闲置和僵死进程。这是一个开关式命令;

q 退出程序;

r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10;

S 切换到累计模式;

s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;

f或者F 从当前显示中添加或者删除项目。按下此键之后,系统会进入配置界面,显示出目前所能支持的全部条目,用户可以进行自定义的删减和配置;

o或者O 改变显示项目的顺序;

l 切换显示平均负载和启动时间信息;

m 切换显示内存信息;

t 切换要不要显示进程和CPU状态信息这两行;

c 切换显示命令名称和完整命令行;

M 根据内存大小进行排序;

P 根据CPU使用百分比大小进行排序;

T 根据时间/累计时间进行排序;

W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法;

怎么样,是不是非常灵活?自己去试试吧?

相关推荐
AlfredZhao2 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334668 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪9 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信