Linux进程(2)
pstree:display a tree of processes
Note:可能需要安装 psmisc
pstree [-p] [-s] [-u] [-a] [pid , user]
-p :显示进程的 PID
-s :显示指定 PID 或 USER 的父进程及子进程
-u :每当进程的uid与其父进程的uid不同时,新的uid就会在进程名后面的括号中显示
-a:显示进程的命令行
ps :report a snapshot of the current processes
ps 命令查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,
每秒刷新一次),使用top或htop命令
这个命令的man文档及其复杂,它同时支持3种类型的选项:GUN/BSD/UNIX,不同类型的选项其展示的信息格式不一样。
有些加了"-"的是 UNIX 风格 的选项,不加"-"的是BSD选项,加不加"-"它们的意义是不一样的,例如ps aux 和ps -aux是不同的
其实只需掌握少数几个选项即可,关键的是要了解ps显示出的进程信息中每一列代表什么属性
- ps [options]
-p pidlist :显示指定 pid 列表的基本信息
--no-header
- 常用组合:aux
u :以用户为中心组织进程状态信息显示
a :与终端相关的进程
x :与终端无关的进程
[root@xiao ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
%CPU :该进程使用掉的 CPU 资源百分比,百分比的计算方式是"进程占用cpu时间/cpu总时间"
%MEM :该进程所占用的物理内存百分比
VSZ :使用掉的虚拟内存量 ( KB )
RSS :常驻内存集 ( KB )
TTY:表示属于哪个终端的进程,"?"表示不依赖于终端的进程
STAT :该进程目前的状态 ( 中括号内的进程是内核进程 )
R :running
S :interruptable sleep
D :uninterruptable sleep
T :stopped
Z :zombie
s :表示该进程是session leader,即进程组的首进程。例如管道左边的进程,
shell脚本中的shell进程
+ :前台进程
l (小L):表示该进程是一个线程
N :低优先级进程
< :高优先级进程
START :该进程触发启动的时间
TIME :该进程实际使用 CPU 运行的时间
COMMAND:表示进程的命令行。如果是内核线程,则使用方括号"[]"包围
- 常用组合:-eFH ,-ef
-e :显示所有进程,与 -A 有相同的效果
-F :显示完整格式的进程信息,与 -f 有相同效果
-H :以进程层级格式显示进程相关信息
[root@node2 ~]# ps -ef | head
UID PID PPID C STIME TTY TIME CMD
[root@node2 ~]# ps -eFH
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
PSR:运行于哪颗CPU之上
- 常用组合:-eo , axo
-eo format
axo format
-o format :在 -o 后面指定要显示的进程信息
%cpu (%CPU):该进程使用掉的 CPU 资源百分比,百分比的计算方式是"进程占用cpu时间/cpu总时间"
cputime (TIME):累积CPU时间, 格式"[DD-]hh:mm:ss"
psr (PSR):当前分配给进程的处理器
%mem (%MEM):该进程所占用的物理内存百分比
args (COMMAND):表示进程的命令行。如果是内核线程,则使用方括号"[]"包围
start (STARTED):进程启动的时间
c (C):处理器利用率。目前,这是进程生命周期内使用百分比的整数值
class (CLS):进程的调度类
- not reported
TS SCHED_OTHER
FF SCHED_FIFO
RR SCHED_RR
B SCHED_BATCH
ISO SCHED_ISO
IDL SCHED_IDLE
DLN SCHED_DEADLINE
? unknown value
f (F):与进程关联的标志
4 :标识进程的权限为 root
1 :此子进程仅执行 (fock) 而没有实际执行 (exec)
0 :此子进程仅执行 (fock) 后执行 (exec)
s (S):表示进程当前的状态
R:当前正在运行(RUNNING)
S:睡眠(SLEEP)
D:不可中断
T:停止(STOP)
Z:僵尸进程(ZOMBIE)
pri:优先级;范围:0~139;其中实时进程:40~139;非实时进程:0~39;值越大优先级越高
ni:nice值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)-NI,所以NI为负数的时候,越小
将导致进程优先级越高
pid (PID)
ppid (PPID)
rtprio:表示实时优先级;范围:1~99,值越大优先级越高
rss (RSS):常驻内存集大小 ( KB ),任务使用的非交换物理内存
vsz (VSZ):使用掉的虚拟内存量 ( KB )
wchan (WCHAN):进程处于睡眠状态的内核函数的名称,如果进程正在运行,用"-"表示,如果进程
是多线程的,而ps不显示线程,用"*"表示
user (USER)
gid (GID)
uid (UID)
unit (UNIT):显示一个进程所属的单元(支持systemd)
tty (TT)
sz (SZ):进程的核心映像的物理页面的大小。这包括文本、数据和堆栈空间
stat (STAT) :该进程目前的状态 ( 中括号内的进程是内核进程 )
R :running
S :interruptable sleep
D :uninterruptable sleep
T :stopped
Z :zombie
s :表示该进程是session leader,即进程组的首进程。例如管道左边的进程,
shell脚本中的shell进程
+ :前台进程
l (小L):表示该进程是一个线程
N :低优先级进程
< :高优先级进程
priority:优先级;范围:-100~39;其中实时进程:-100~-1;非实时进程:0~39;值越小优先级越高
ni:nice值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以NI为负数的时候,越小
将导致进程优先级越高
- 常用选项:-l
-l (小L):仅显示当前 shell 相关的进程
[root@xiao ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 21985 21981 0 80 0 - 29143 do_wai pts/1 00:00:00 bash
0 R 0 22773 21985 0 80 0 - 37235 - pts/1 00:00:00 ps
F :表示进程旗标 (process flags),标识进程所拥有的权限 ,常见号码有:
4 :标识进程的权限为 root
1 :此子进程仅执行 (fock) 而没有实际执行 (exec)
0 :此子进程仅执行 (fock) 后执行 (exec)
S:表示进程当前的状态
R:当前正在运行(RUNNING)
S:睡眠(SLEEP)
D:不可中断
T:停止(STOP)
Z:僵尸进程(ZOMBIE)
UID:拥有该进程用户的用户ID
PID:进程号
PPID:该进程父进程的进程好
C:该进程使用掉的 CPU 资源百分比,百分比的计算方式是"进程占用cpu时间/cpu总时间"
PRI :该进程执行的优先级,值越小,优先级越高,越早被调度类选中运行
范围为:-40~99 :其中非实时进程:60~99 ;实时进程:-40~59
NI:nice 值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以NI为负数的时候,越小将
导致进程优先级越高
ADDR :kernel function,指该进程在内存的那个部分,如果是 running,一般会显示 " - "
SZ :该进程占用的内存空间
WCHAN :当前进程是否正在运行," - " 表示运行
TTY:表示属于哪个终端的进程
TIME :使用 CPU 时间,注意,此进程花费 CPU 运行进程的时间,而不是系统时间
CMD:表示进程的命令行。如果是内核线程,则使用方括号"[]"包围
ps后grep问题:
在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来
[root@node2 1]# ps aux | grep "crond" root 77700 0.0 0.1 126276 1020 ? Ss Nov10 0:00 /usr/sbin/crond -n root 100534 0.0 0.0 112712 960 pts/0 R+ 22:03 0:00 grep --color=auto crond |
先解释下为何会如此。管道是bash创建的,bash创建管道后fork两个子进程,然后两子进程各自exec加载ps程序和grep程序,
exec之后这两个子进程就称为ps进程和grep进程,所以ps和grep进程几乎可以认为是同时出现的,尽管ps进程作为管道的首
进程(进程组首进程)它是先出现的,但是在ps出现之前确实两个进程都已经fork完成了。也就是说,管道左右两端的进程是同时
被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收
要将grep自身进程排除在结果之外,方法有二:
[root@node2 1]# ps aux | grep "crond" | grep -v "grep" root 77700 0.0 0.1 126276 1020 ? Ss Nov10 0:00 /usr/sbin/crond -n |
[root@node2 1]# ps aux | grep "cron[d]" root 77700 0.0 0.1 126276 1020 ? Ss Nov10 0:00 /usr/sbin/crond -n |
pidof :find the process ID of a running program
pidof [-x] program [program..]
-x :这导致程序也返回运行命名脚本的shell的进 pid
uptime:Tell how long the system has been running
使用 uptime 命令查看系统的运行时间,uptime 命令会读取 /proc/uptime 文件中的数据
[root@shy ~]# cat /proc/uptime
11420393.23 10802695.23
第一列输出的是,系统启动到现在的时间(以秒为单位),这里简记为num1;
第二列输出的是,系统空闲的时间(以秒为单位),这里简记为num2
Note:
很多很多人都知道第二个是系统空闲的时间,但是可能你不知道是,在SMP系统里,系统空闲的时间有时会是系统运行时间
的几倍,这是怎么回事呢?
因为系统空闲时间的计算,是把SMP算进去的,就是所你有几个逻辑的CPU(包括超线程)
系统的空闲率(%) = num2/(num1*N) 其中N是SMP系统中的CPU个数
[root@node2 1]# uptime
22:08:07 up 4 days, 9:12, 2 users, load average: 0.00, 0.02, 0.05
当前时间为 22:08:07,启动了 4 天9小时12分钟,当前有2个用户登陆,以及3个平均负载值
所谓负载率(load),即特定时间长度内,cpu运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于3都认为正常,
大于5时负载已经非常高。在UNIX系统中,运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。
在Linux系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load就加1,进程每退出运行队列,
Load就减1。如果是多核cpu,则还要除以核数
- 例如,单核cpu上的负载值为"1.73 0.60 7.98"时,表示:
最近1分钟:1.73表示平均可运行的进程数,这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu
最近5分钟:平均进程数还不足1,表示该核cpu在过去5分钟空闲了40%的时间
最近15分钟:7.98表示平均可运行的进程数
如果是多核cpu,则还要将结果除以核数。例如4核时,某个最近一分钟的负载值为3.73,则意味着有3.73个进程在运行队列中,
这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6,表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间
所以,load的理想值是正好等于CPU的核数,小于核数的时候表示cpu有空闲,超出核数的时候表示有进程在等待cpu,
即系统资源不足
top :display Linux processes
- top [option]
-p pid……:只监视具有指定 pid的进程;可以提供一个逗号分隔的列表,其中包含最多20个 pid
-n number :显示刷新多少次退出 top
-d secs :指定刷新时间间隔,默认为 3 秒
-b :以批处理模式启动top,这对于将 top 的输出发送到其他程序或文件非常有用
-u user :只显示具有与给定匹配的用户id或用户名的进程
[root@node2 1]# top -b -n 1 top - 22:27:54 up 4 days, 9:32, 2 users, load average: 0.02, 0.04, 0.05 Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie %Cpu(s): 5.9 us, 5.9 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 999696 total, 422580 free, 104028 used, 473088 buff/cache KiB Swap: 2097148 total, 2044072 free, 53076 used. 705648 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 100569 root 20 0 157672 2068 1508 R 6.2 0.2 0:00.01 top 1 root 20 0 125352 2756 1576 S 0.0 0.3 0:26.37 systemd
us :用户进程占用 CPU 时间(用户空间) sy :内核进程占用 CPU 时间(内核空间) ni :low priority user mode (nice)(用户空间中低优先级进程的cpu占用百分比) id :CPU 内核空闲时间 wa :等待 I/O 完成的时间 hi :用于服务硬件中断的时间;servicing IRQs(不可中断睡眠,hard interruptible) si :用于服务软件中断的时间;servicing soft IRQs(可中断睡眠,soft interruptible) st :steal (time given to other DomU instances)(被偷走的cpu时间,一般被虚拟化软件偷走)
PR :该进程执行的优先级,值越小,优先级越高,越早被调度类选中运行 和 ps axo priority,rtprio 和 ps -l 相同 NI:nice 值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以NI为负数的时候,越小将 导致进程优先级越高 VIRT :虚拟内存集 RES :常驻内存集 SHR :共享内存集 S :进程状态 R :running S :interruptable sleep D :uninterruptable sleep T :stopped Z :zombie s :表示该进程是session leader,即进程组的首进程。例如管道左边的进程, shell脚本中的shell进程 + :前台进程 l (小L):表示该进程是一个线程 N :低优先级进程 < :高优先级进程 TIME+ :进程占用的cpu的累积时间(若开启了时间累积模式,则此处显示的是累积时间) |
- top 的内部命令:
P :以占据的 CPU 百分比排序
M :以占据的内存百分比排序
N:以PID 来排序
T :以累积占据 CPU 时长排序
r :给予某个 PID 重新定制一个 nice 值
l(小 L) :隐藏或显示 top 第一行的信息,系统运行时间,几个用户登录,CPU 1 ,5,15 分钟的使用情况
t :改变 task 及 CPU 信息显示格式
1 :CPU 分别显示,将多颗cpu 或多核 cup 分别显示
m :改变 memory 信息显示格式
q :退出 top
d | s :修改刷新时间间隔
k :终止指定的进程
c:表示是否要展开进程的命令行
x,y:x高亮排序的列,y表示高亮running进程
u:仅显示指定用户的进程
n:设置要显示最大的进程数量
?| h
E :切换 内存 容量的单位
H:表示是否要显示线程,默认不显示
S:表示显示的cpu时间是否是累积模式,cpu累积模式下已死去的子进程cpu时间会累积到父进程中
htop :interactive process viewer
需要安装,EPEL 中有此命令的程序
- htop [-dut]
-p pid……:只监视具有指定 pid的进程;可以提供一个逗号分隔的列表,其中包含最多20个 pid
-t :以树状图的形式显示进程
-u USER :仅显示属于给定用户的进程
-d DELAY:指定刷新时间间隔
- htop 内部命令:
Space :标记或取消标记进程。可以在多个进程上操作的命令,比如"kill"
U:取消所有进程的标记(删除所有用空格键添加的标记)
P :以占据的 CPU 百分比排序
M :以占据的内存百分比排序
T :以累积占据 CPU 时长排序
PgUp, PgDn:向上或向下滚动一个窗口的进程列表
Home:滚动到流程列表的顶部并选择第一个流程
end:滚动到流程列表的底部并选择最后一个流程
Numbers :输入 PID,选中的高亮显示将被移动到它
Ctrl + L :刷新:重新绘制屏幕和重新计算值
p :显示进程的完整路径
s :跟踪进程系统调用:如果安装了strace,按下此键将把它附加到当前选择的进程,显示进程发出的系统
调用的实时更新
l(下 L):显示进程打开的文件:如果安装了lsof,按下此键将显示进程打开的文件描述符列表
F3, /:递增地搜索所有显示进程的命令行
F4, \:增量进程过滤:在进程命令行中键入部分内容,只显示名称匹配的进程
F5, t:树形视图:通过父母关系组织过程,并将它们之间的关系布置成树形;选择排序视图将退出树视图
F6:在已排序视图中,选择用于排序的字段,也可以通过 '<' 和 '>' 进行访问。当前排序字段由标题中的高亮
显示指示。在树视图中,展开或折叠当前子树。树节点中的"+"指示符表示它已折叠
F7, ]:增加所选进程的优先级(减少 'nice'值)。这只能由超级用户来完成
F8, [:降低所选进程的优先级(增加"nice"值)
F9, k:"kill"进程:将在菜单中选择的信号发送给一个或一组进程。如果进程被标记,则向所有标记的进程
发送信号。如果没有标记,则发送到当前选择的进程
F10, q:退出 htop
I:逆向排序
+, - :在树视图模式下,展开或折叠子树。当一个子树被折叠时,一个"+"符号显示在进程名的左边
a :设置CPU关联性:标记一个进程可以使用哪个CPU
u:只显示指定用户拥有的进程
F:"跟随"进程:如果排序顺序导致当前选择的进程在列表中移动,则使选择栏跟随它
K:隐藏内核线程:防止属于内核的线程显示在进程列表中
H:隐藏用户线程
Arrows:上下选择进程行
F1 ,h ,?:显示帮助信息
分析系统负载(system load average):
根据前文uptime中对系统负载(system load)的描述,分析一下这个top的结果
上图中,系统负载非常之高,最近一分钟的负载量高达383.19,这表示这一分钟有383.19个进程正在运行或等待调度,如果是单核
CPU,表示这一分钟要毫不停留地执行这么多进程,如果是8核CPU,表示这一分钟内平均每核心CPU要执行大概50个进程
从load average上看,确实是非常繁忙的场景。但是看CPU的idle值为98.8,说明CPU非常闲。为什么系统负载如此高,
CPU却如此闲?
前面解释system load average的时候,已经说明过可运行的(就绪态,即就绪队列的长度)、正在运行的(运行态)和不可中断睡眠
(如IO等待)的进程任务都会计算到负载中。现在负载高、CPU空闲,说明当前正在执行的任务基本不消耗CPU资源,大量的负载
进程都在IO等待中
可以从ps的进程状态中获取哪些进程是正在运行或运行队列中的(状态为R),哪些进程是在不可中断睡眠中的(状态为D)
[root@node2 ~]# ps -eo stat,pid,ppid,comm --no-header |grep -E "^(D|R)" R 9 2 rcu_sched Rsl 662 1 vmtoolsd R+ 101157 100877 ps |
vmstat:Report virtual memory statistics
Note:vmstat 是从 /proc/vmstat 文件中提取的信息
vmstat [options] [delay [count]]
-s :显示各种事件计数器和内存统计信息的表
-f:统计自开机起fork的次数。包括fork、clone、vfork的次数。但不包括exec次数
-d:显示磁盘统计信息
-S character:1000 (k), 1024 (K), 1000000 (m), or 1048576 (M) bytes
delay:刷新时间间隔,若不指定,则只统计一次信息就退出vmstat
count:总共要统计的次数
[root@node2 ~]# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 53076 399964 680 493560 0 0 26 8 101 46 0 0 100 0 0
procs: r: 等待队列中的进程数 b: 不可中断睡眠的进程数
memory: swpd: 虚拟内存使用总量 free: 空闲内存量 buff: buffer占用的内存量(buffer用于缓冲) cache: cache占用的内存量(cache用于缓存)
swap: si:从内存加载到swap分区的数据流量,单位为"kb/s" so: 从swap分区写到内存的数据流量,单位为"kb/s"
io: bi: 从块设备读取到数据的速率,单位为blocks/s bo: 写数据到块设备的速率,单位为blocks/s
System: in: 每秒中断数,包括时钟中断数量 cs: 每秒上下文切换次数
CPU:统计的是cpu时间百分比,具体信息和top的cpu统计列一样 us :用户进程占用 CPU 时间(用户空间) sy :内核进程占用 CPU 时间(内核空间) id :CPU 内核空闲时间 wa :等待 I/O 完成的时间 st :steal (time given to other DomU instances)(被偷走的cpu时间,一般被虚拟化软件偷走) |
[root@node2 ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sda 36566 2620 4430686 764940 66105 41780 6092197 534416 0 505 sr0 79225 0 15665252 234960 0 0 0 0 0 165 dm-0 33979 0 4383391 752477 73328 0 5807531 705149 0 482 dm-1 3075 0 28304 93538 34171 0 273368 5601228 0 19 dm-2 110 0 2419 317 337 0 6822 8136 0 4
reads : total : 成功读取的总大小 merged : 分组读取的次数( 即一次 I/O ) sectors : 成功读取的扇区数 ms : 读取消耗的时间 Writes total : 成功写入磁盘的总大小 merged : 分组写入磁盘的次数 ( 即一次 I/O ) sectors : 成功写入扇区的数量 ms : 写入磁盘消耗的时间 IO: cur:正在进行的 I/O sec:I/O 花费的秒数 |
iostat:Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.
Note:可能需要安装 sysstat
iostat主要统计磁盘或分区的整体使用情况。也可以输出cpu信息,甚至是NFS网络文件系统的信息。同vmstat/sar一样,
第一次统计的都是自系统开机起的平均统计信息
iostat [ -c ] [ -d ] [ -n -h ][ -k | -m ] [ -p [device][,...] ] [ interval [ count ] ]
-c:统计cpu信息
-d:统计磁盘信息
-n:统计NFS文件系统信息
-h:使NFS统计信息更人类可读化
-k:指定以kb/s为单位显示
-m:指定以mb/s为单位显示
-p:指定要统计的设备名称
-y:指定不显示第一次统计信息,即不显示自开机起的统计信息。
interval:刷新时间间隔
count:总统计次数
[root@node2 ~]# iostat Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle 0.14 0.00 0.25 0.08 0.00 99.53
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.26 5.67 7.77 2215231 3039144 scd0 0.20 20.04 0.00 7832626 0 dm-0 0.27 5.61 7.41 2191583 2896811 dm-1 0.10 0.04 0.35 14152 136684 dm-2 0.00 0.00 0.01 1209 3411
avg-cpu: %user:CPU处在用户模式下的时间百分比 %nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比 %system:CPU处在系统模式下的时间百分比 %iowait:CPU等待输入输出完成时间的百分比 %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比 %idle:CPU空闲时间百分比
tps:每秒transfer速率(transfers per second),一次对物理设备的IO请求为一个transfer,但多个逻辑请求可能只 组成一个transfer Blk_read/s:每秒读取的block数量 Blk_wrtn/s:每秒写入的block总数 Blk_read:读取的总block数量 Blk_wrtn:写入的总block数量 |
sar:Collect, report, or save system activity information
Note:可能需要安装 sysstat
sar是一个非常强大的性能分析工具,它可以获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标
功能多的必然结果是选项多,应用复杂,但只要知道一些常用的选项足以
sar [options] [-o filename] [delay [count] ]
-A:显示系统所有资源运行状况
-B:查看内存分页信息
-b:显示磁盘IO和tranfer速率信息,和iostat的信息一样,是总体IO统计信息
-d:显示磁盘在刷新时间间隔内的活跃情况,可以指定一个或多个设备,和-b不同的是,它显示的是单设备的IO、transfer
信息;建议配合-p使用显示友好的设备名,否则默认显示带主次设备号的设备名
-P:显示指定的某颗或某几颗cpu的使用情况。指定方式为,-P 0,1,2,3或ALL
-u:显示每颗cpu整体平均使用情况。-u和-P的区别通过下面的示例很容易区分
-r:显示内存在刷新时间间隔内的使用情况
-n:显示网络运行状态。后可接DEV/NFS/NFSD/ALL等多种参数
:DEV表示显示网路接口信息,NFS和NFSD分别表示显示NFS客户端和服务端的流量信息,ALL表示显示所有信息
-q:显示等待队列大小
-o filename:将结果存入到文件中
delay:状态刷新时间间隔
count:总共刷新几次
统计网络流量:
/proc/net/dev 文件保存了网络流量的数据信息
- 第一种方法是查看 /proc/net/dev:
[root@node2 ~]# cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed ens37: 296178912 425890 0 6 0 0 0 0 36129103 178334 0 0 0 0 0 0 lo: 116280 1396 0 0 0 0 0 0 116280 1396 0 0 0 0 0 0 ens33: 2200550 27661 0 6 0 0 0 0 0 0 0 0 0 0 0 0
关注列:receive和transmit分别表示收包和发包,关注每个网卡的bytes即可获得网卡的情况。写一个脚本计算每秒的差值即为网络流量 |
- 第二种方法是使用 sar -n DEV :
[root@node2 ~]# sar -n DEV Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
02:50:02 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 03:00:01 PM ens37 0.38 0.11 0.03 0.02 0.00 0.00 0.00 03:00:01 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:00:01 PM ens33 0.02 0.00 0.00 0.00 0.00 0.00 0.00 Average: ens37 0.38 0.11 0.03 0.02 0.00 0.00 0.00 Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: ens33 0.02 0.00 0.00 0.00 0.00 0.00 0.00
rxpck/s:每秒收到的包数量 txpck/s:每秒发送的包数量 rxkB/s:每秒收到的数据,单位为kb txkB/s:每秒发送的数据,单位为kb rxcmp/s:每秒收到的压缩后的包数量 txcmp/s:每秒发送的压缩后的包数量 rxmcst/s:每秒收到的多播包数量 |
内存和交换空间监控:
可以直接查看 /proc/meminfo 文件,获取内存和交换空间的数据
[root@node2 ~]# sar -r 3 2
Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
03:22:36 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
03:22:39 PM 393000 606696 60.69 680 421684 285648 9.22 293328 156936 0
03:22:42 PM 393000 606696 60.69 680 421684 285648 9.22 293328 156936 0
Average: 393000 606696 60.69 680 421684 285648 9.22 293328 156936 0
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比
kbdirty:表示内存中脏页的大小,即内存中还有多少应该刷新到磁盘的数据
内存分页监控:
[root@node2 ~]# sar -B 3 2
Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
03:26:25 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
03:26:28 PM 0.00 0.00 23.83 0.00 10.74 0.00 0.00 0.00 0.00
03:26:31 PM 0.00 0.00 9.06 0.00 8.72 0.00 0.00 0.00 0.00
Average: 0.00 0.00 16.44 0.00 9.73 0.00 0.00 0.00 0.00
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
进程队列长度和平均负载状态监控:
[root@node2 ~]# sar -q 3 2
Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
03:27:53 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
03:27:56 PM 2 126 0.00 0.01 0.05 0
03:27:59 PM 2 126 0.00 0.01 0.05 0
Average: 2 126 0.00 0.01 0.05 0
runq-sz:等待队列的长度,不包括正在运行的进程
plist-sz:任务列表中的进程数量,即总任务数
ldavg-N:过去1分钟、5分钟、15分钟内系统的平均哎
blocked:当前因为IO等待被阻塞的任务数量
I/O和传送速率监控:
[root@node2 ~]# sar -b 3 2
Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
03:28:51 PM tps rtps wtps bread/s bwrtn/s
03:28:54 PM 0.00 0.00 0.00 0.00 0.00
03:28:57 PM 0.00 0.00 0.00 0.00 0.00
Average: 0.00 0.00 0.00 0.00 0.00
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s
系统交换活动信息监控:
[root@node2 ~]# sar -W 3 2
Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
03:29:54 PM pswpin/s pswpout/s
03:29:57 PM 0.00 0.00
03:30:00 PM 0.00 0.00
Average: 0.00 0.00
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量
设备使用情况监控:
[root@node2 ~]# sar -d 3 1 -p
Linux 3.10.0-693.el7.x86_64 (node2.song.com) 11/12/2019 _x86_64_ (1 CPU)
03:33:58 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
03:34:01 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:34:01 PM sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:34:01 PM centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:34:01 PM centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:34:01 PM centos-home 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: centos-home 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
tps:transfer per second,每秒的transfer速率,一次物理IO请求算一次transfer,但多次逻辑IO请求可能组合起来才算
一次transfer
rd_sec/s:每秒读取的扇区数,扇区大小为512字节
wr_sec/s:每秒写入的扇区数
avgrq-sz:请求写入设备的平均大小,单位为扇区。(The average size (in sectors) of the requests that were issued to
the device)
avgqu-sz:请求写入设备的平均队列长度。(The average queue length of the requests that were issued to the device.)
await:写入设备的IO请求的平均(消耗)时间,单位微秒(The average time for I/O requests issued to the device
to be served.)
svctm:不可信的列,该列未来将被移除,所以不用管
%util:最重要的一列,显示的是设备的带宽情况。该列若接近100%,说明磁盘速率饱和了
dstat:用于生成系统资源统计的工具
Note:可能需要安装 dstat
dstat [-afv] [options..] [delay [count]]
-c :启用cpu统计信息(系统、用户、空闲、等待、硬件中断、软件中断)
-C 0,3,total
-d :启用磁盘状态(读、写)
-D :total,sda1
-g :启用页面状态(page in,page out)
-i :启用中断数据
-I 5,10(大 i )
-l (小 L):启用负载平均状态
-m :启用内存统计(使用、缓冲区、缓存、空闲)
-n :启用网络统计信息(接收、发送)
-N eth1,total
-p :启用进程状态(可运行、不可中断、新建)
-r :启用I/O请求统计(读、写请求)
-s :启用交换状态(已使用,空闲)
-S swap1,total
-y :启用系统状态(中断、上下文切换)
--aio :启用aio stats(异步I/O)
--fs :启用文件系统统计信息(打开文件、inode)
--ipc :启用ipc统计信息(消息队列、信号量、共享内存)
--lock :启用文件锁定状态(posix、flock、read、write)
--tcp , --udp , --unix , --raw , --socket
--top-io :显示最占用 io 的进程
--top-cpu :显示最占用 cpu 的进程
--top-mem :显示最占用 memory 的进程
--top-lantency :显示延迟最大的进程
glances :一个跨平台的基于 curses 的系统监控工具
Note:可能需要安装 glances
glances [OPTIONS]
-C CONF_FILE, --config CONF_FILE:指定配置文件
-b:以Byte为单位显示网上数据速率
-d :启用调试模式 ( 日志文件为 /tmp/glances.log )
-t TIME :设置刷新的时间 ( 默认为 3 秒 )
--hide-kernel-threads :在进程列表中隐藏内核线程
--tree :进程以数的形式显示
--fs-free-space:显示系统空闲空间而不是已使用空间
--process-short-name:强制进程使用短名称
-f PROCESS_FILTER, --process-filter PROCESS_FILTER:设置进程模式匹配(正则表达式)
-q, --quiet
--enable-history:启动 history 模式(需要 python-matplotlib 库)
服务器端
-s :在服务器模式下运行 glances
-B BIND_ADDRESS :将服务器绑定到给定的 IPv4/IPv6 地址或主机名
--password :定义 client/server 密码
-p PORT, --port PORT : 定义 client/server TCP 端口 [默认为: 61208]
客户端
-c IPADDR:客户端模式运行 glances
--password :输入 client/server 密码
-p PORT, --port PORT : 指定 client/server TCP 端口 [默认为: 61208]
web端
-w, --webserver:run Glances in web server mode (依赖 python2-bottle)
-B BIND_ADDRESS :将服务器绑定到给定的 IPv4/IPv6 地址或主机名
--password :输入 client/server 密码
-p PORT, --port PORT : 指定 client/server TCP 端口 [默认为: 61208]
glances 内部操作命令:
ENTER: Edit the process filter pattern
c:根据CPU使用率对进程进行排序
i:按照进程的 I/O 速率排序
m:依据进程对内存的使用率排序
p:按照进程名称排序
u :按照 USER 排序进程
t:按进程使用CPU时间排序 (TIME+)
a:进程列表自动排序
1:在全局CPU和每个CPU状态之间切换
g:生成当前历史记录的图表
b:网络I/O在bit/s或Byte/s之间进行切换
d:显示或隐藏磁盘 I/O 状态
f:显示或隐藏文件系统状态
F:在使用的文件系统和空闲空间之间进行切换
h
l(小L):显示或隐藏日志信息
n:显示或隐藏网络状态
q
r:重置历史
U:查看累计网络I/O
w:删除已完成的警告日志消息
x:删除已完成的警告和关键日志消息
0:Task的cpu使用量将除以cpu的总数
/:Switch between short name/command line (processes name)
pmap:report memory map of a process
pmap [options] pid [...]
-x:显示详细格式的信息
另一种查看方式:cat /proc/PID/maps