Linux 进程与系统性能管理

进程与系统性能管理

文章目录

1 进程和内存管理

内核功能:进程管理,文件系统,网络功能,内存管理,驱动程序,安全等

1.1 进程概念

Process: 运行中的程序的一个副本,是被载入内存的一个指令集和,是资源分配的单位

  • 使用进程id(PID)标记不同的进程

  • UID,GID和SELINUX语境决定对文件系统的存取和访问权限

  • 通常从执行进程的用户来继承

  • 存在生命周期

进程创建

  • init:第一个进程

在CentOS7及后续的系统中,第一个进程为systemd,可通过pstree命令进行查看

  • 进程:都是通过父进程进行创建,fork()/clone(),存在父子关系,CoW(Copy On Write/写时复制)
1.1.1 进程、线程和协程

查看进程中的线程

[root@shellenv ~]# cat /proc/PID/status | grep -i threads
Threads:        1

线程:在命令pstree -p中以“ { } ”为体现,线程同样存在编号

      ├─tuned(1249)─┬─{tuned}(1788)
                    ├─{tuned}(1789)
                    ├─{tuned}(1791)
                    └─{tuned}(1792)

1.2 进程结构

内核将进程存放在任务队列(Task List)的双向循环链表中

链表中的每一项都是类型为task_struct,称为进程控制块(PCB),PCB中包含一个具体进程的所有信息

/PROC/PID/目录下,可以看到进程相关的详细信息

[root@shellenv ~]# cd /proc/1
[root@shellenv 1]# ll
total 0
dr-xr-xr-x. 2 root root 0 Aug  6 16:13 attr
-rw-r--r--. 1 root root 0 Aug  6 16:35 autogroup
-r--------. 1 root root 0 Aug  6 16:35 auxv
-r--r--r--. 1 root root 0 Aug  6 16:12 cgroup
--w-------. 1 root root 0 Aug  6 16:35 clear_refs
-r--r--r--. 1 root root 0 Aug  6 16:12 cmdline
-rw-r--r--. 1 root root 0 Aug  6 16:12 comm
-rw-r--r--. 1 root root 0 Aug  6 16:35 coredump_filter
-r--r--r--. 1 root root 0 Aug  6 16:35 cpuset
lrwxrwxrwx. 1 root root 0 Aug  6 16:35 cwd -> /
-r--------. 1 root root 0 Aug  6 16:12 environ
lrwxrwxrwx. 1 root root 0 Aug  6 16:12 exe -> /usr/lib/systemd/systemd	#执行程序的目录
dr-x------. 2 root root 0 Aug  6 16:12 fd								#文件描述符
dr-x------. 2 root root 0 Aug  6 16:12 fdinfo
-rw-r--r--. 1 root root 0 Aug  6 16:35 gid_map
-r--------. 1 root root 0 Aug  6 16:35 io
-r--r--r--. 1 root root 0 Aug  6 16:35 limits
-rw-r--r--. 1 root root 0 Aug  6 16:12 loginuid
dr-x------. 2 root root 0 Aug  6 16:35 map_files
-r--r--r--. 1 root root 0 Aug  6 16:12 maps
-rw-------. 1 root root 0 Aug  6 16:35 mem
-r--r--r--. 1 root root 0 Aug  6 16:12 mountinfo
-r--r--r--. 1 root root 0 Aug  6 16:12 mounts
-r--------. 1 root root 0 Aug  6 16:35 mountstats
dr-xr-xr-x. 6 root root 0 Aug  6 16:12 net
dr-x--x--x. 2 root root 0 Aug  6 16:13 ns
-r--r--r--. 1 root root 0 Aug  6 16:35 numa_maps
-rw-r--r--. 1 root root 0 Aug  6 16:35 oom_adj
-r--r--r--. 1 root root 0 Aug  6 16:35 oom_score
-rw-r--r--. 1 root root 0 Aug  6 16:35 oom_score_adj
-r--r--r--. 1 root root 0 Aug  6 16:35 pagemap
-r--------. 1 root root 0 Aug  6 16:35 patch_state
-r--r--r--. 1 root root 0 Aug  6 16:35 personality
-rw-r--r--. 1 root root 0 Aug  6 16:35 projid_map
lrwxrwxrwx. 1 root root 0 Aug  6 16:12 root -> /
-rw-r--r--. 1 root root 0 Aug  6 16:35 sched
-r--r--r--. 1 root root 0 Aug  6 16:35 schedstat
-r--r--r--. 1 root root 0 Aug  6 16:12 sessionid
-rw-r--r--. 1 root root 0 Aug  6 16:35 setgroups
-r--r--r--. 1 root root 0 Aug  6 16:35 smaps
-r--r--r--. 1 root root 0 Aug  6 16:35 stack
-r--r--r--. 1 root root 0 Aug  6 16:12 stat
-r--r--r--. 1 root root 0 Aug  6 16:35 statm
-r--r--r--. 1 root root 0 Aug  6 16:12 status						#状态信息
-r--r--r--. 1 root root 0 Aug  6 16:35 syscall
dr-xr-xr-x. 3 root root 0 Aug  6 16:12 task
-r--r--r--. 1 root root 0 Aug  6 16:35 timers
-rw-r--r--. 1 root root 0 Aug  6 16:35 uid_map
-r--r--r--. 1 root root 0 Aug  6 16:35 wchan

Task struct:LINUX内核存储进程信息的数据结构格式

Task list:多个任务的Task struct组成的链表

PCB包含的信息

进程ID,用户id和组id

程序计数器

进程的状态(就绪,运行,阻塞)

进程切换时需要保存或回复的cpu寄存器的值

描述虚拟地址空间的信息

描述控制终端的信息

当前工作目录

文件描述符表,包含很多指向file结构体的指针

进程可以使用的资源上限(limit -a可以查看)

输入输出状态: 配置进程使用I/O设备

1.3 进程相关概念

Page Frame: 页框,用存储页面数据,存储页大小为4k————[内存空间的最小单位]

[root@shellenv ~]# getconf -a | grep -i page
PAGESIZE                           4096
PAGE_SIZE                          4096
_AVPHYS_PAGES                      602177
_PHYS_PAGES                        965322
1.3.1 物理地址空间和虚拟地址空间

MMU: Memory Management Unit 负责虚拟地址转换为物理地址

程序在访问一个内存地址指向的内存时,CPU不是直接将这个地址送到内存总线上,二十被送到MMU,然后将这个内存地址映射到实际的物理内存地址上,接着通过总线再去访问内存,程序操作的地址称为虚拟内存地址

TLB: Translation Lookaside Buffer 翻译后备缓冲器

用于保存虚拟地址和物理地址映射关系的缓存

LRU:Least Recently Used 近期最少使用算法,释放内存

1.3.2 用户和内核空间
1.3.3 c代码和内存布局之间的对应关系

每个进程都包括5种不同的数据段

  • 代码段: 用于存放可执行文件的操作指令,也就是说它是可执行程序在内存中的镜像(副本)。代码段需要防止在运行时被非法修改,所以是只读的,而不允许写入(修改)

  • 数据段: 用来存放可执行文件中已初始化的全局变量。也就是存放了程序静态分配的变量和全局变量

  • BSS段: Block Started by Symbol (以符号开始的块)。 包含了程序中未初始化的全局变量,在内存中BSS段全部置零

  • 堆(heap): 存放数组和对象,对是用于存放进程运行中被动态分配的内存段,大小并不固定,可以动态的增加或减少。当进程调用malloc等函数分配内存时,新分配的内存被动态添加到堆上 堆被扩张;当利用free等函数释放内存时,内存从堆中被剔除堆被缩减

  • 栈(stack): 栈是用户存放程序时临时创建的局部变量,也就是函数括弧{}中定义的变量,(但不包括static声明的变量,static的含义在于变量存放于数据段中)。除此以外,在函数调用时,函数的参数也会被压入发起调用的进程栈中,等待调用结束后,函数的返回值也会被存放到栈中。由于栈的后进先出的特点,方便用于保存或调用恢复现场。可以将堆栈看成一个寄存,交换临时数据的内存区。

local VAR=VALUE 本地变量只能应用于function中

1.3.4 进程使用内存问题
1.3.4.1 内存泄漏 Memory Leak

程序中使用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致内存一直处于占用状态

1.3.4.2 内存溢出 Memory Overflow

程序申请了10M的内存空间,使用写入超过10M以上的数据,即为溢出

1.3.4.3 内存不足 Out Of Memory

在java程序中比较场景。系统会选择一个进程将其杀死,在日志message中看到类似下面的提示

Out of memory : Kill Process 9527(java)…

不做具体的展开

1.4 进程状态

[ Create ]  --Allow-- > [ Ready ]  --进程调度-- >  [ Exec ] ——(Erase)-->  [End] 
					   		||					     ||
					   		||					     ||
                       		++     < (时间片完)       ++
                       		||    				     ||
                    	(IOFinish)      		     ||	
 					 	[ 阻塞 ]	  < (IORequest)  ++     
                        
Create:创建
Allow:许可
Ready:就绪
Exec:执行
End:终止
1.4.1 进程的基本状态
  • 创建状态:进程在创建时需要申请—个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

  • 就绪状态:进程己准备好,已分配到所需资源,只要分配到CPU就能够立即运行

  • 执行状态:进程处于就绪状态被调度后,进程进入执行状态

  • 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用

  • 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

1.4.2 其他更多的状态

运行态: running

就绪态: ready

睡眠态: 分为两种 可中断 interruptable / 不可中断uninterruptable

停止态: stopped,暂停与内存中,但不会被调度,除非手动启动

僵死态: zombie,结束进程,父进程结束前,子进程不关闭

1.4.3 状态之间的转换
运行 > 就绪:
	1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;
	2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
	
就绪 > 运行:
	运行的进程的时间片用完,调度就转到就绪队列中选择合适
	
运行 > 阻塞:正在执行的进程因发生某等待事件市无法执行,则进程由执行状态变为阻塞状态,如发生了I0请求

阻塞 > 就绪:
	进程所等待的事件己经发生,就进入就绪队列,
	
'以下两种状态是不可能发生的:'
阻塞 > 运行:	
	即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
就绪 > 阻塞:
	就绪态根本就没有执行,谈不上进入阻塞态

可以通过ps命令中 stat查看进程状态

STAT:进程状态
	R:running
	S:interruptable sleeping
	D:uninterruptable sleeping
	T:stopped
	Z:zombie
	+:前台进程
	l:多线程进程
	L:内存分页并带锁
	N:低优先级
	<:高优先级
	s:session leader,会话(子进程)发起者

1.5 LRU算法

LRU: 近期最少使用算法,释放内存。

1.6 IPC进程间通信

同一主机下:

pipe	管道
	>	基于FIFO / 先进先出  
	>	工作模式:单工
socket	套接字文件	
Memory-maped file 文件映射,将文件中的一段数据映射到物理内存,多个进程共享该内存	
signal 信号 
	>	trap -l 可以查询信号对应的数字
shm SharedMemory
LOCK		对资源上锁,如果资源被某进程LOCK,则其他进程想要修改或读取资源,都将被阻塞,直到lock被打开
semaphore	信号量,一种计数器

创建pipe文件

[root@shellenv ~]# mkfifo /data/test.fifo
[root@shellenv ~]# cat > /data/test.fifo			# 终端1
abc
													#等待输入
[root@shellenv ~]# cat /data/test.fifo				# 终端2
abc
													#等待输出
[root@shellenv ~]# cat > /data/test.fifo			# 终端1
abc
aaa													# 新增输入
							
[root@shellenv ~]# cat /data/test.fifo				# 终端2
abc
aaa													#
													#等待输出
													
#	通过ctrl+c终止状态
#	仅支持单项传输 也就是工作模式为单工模式

查找 socket文件

[root@shellenv ~]# find / -type s
/dev/log
/run/vmware/guestServicePipe
/run/mcelog-client
/run/abrt/abrt.socket
/run/gssproxy.sock
/run/dbus/system_bus_socket
/run/rpcbind.sock
/run/avahi-daemon/socket
/run/libvirt/libvirt-admin-sock

不同主机: socket: IP和端口号

man 2 socket 查看开发相关内容 但是实际几乎不再使用

RPC: remote Procedure call
MQ 消息队列 如:Kafka RabbitMQ ActiveMQ

1.7 进程优先级[图片待完善]

linux2.6内核将任务优先级进行了划分:

实时优先级范围: 0 - MAX_RT_PRIO-1 [ 0 - 99 ]

普通进程的静态优先级范围: MAX_RT_PRIO - MAX_PRIO-1 [ 100 - 139 ]

Centos优先级

[PIC]

系统(System)优先级分为 0-139

0-99 为实时优先级

100-139 为普通优先级

RealTime(RT)优先级 99-0

​ COMMAND:chrt 后的优先级数字越高,代表优先级越高

Nice(命令)优先级 -20 - 19 (对应为系统优先级的 100-139)

TOP(命令)优先级[PR] RT代表实时优先级, 0-39 (对应为系统优先级的100-139)

进程优先级:

​ 系统优先级: 数字越小,优先级越高

​ 实时优先级: 99-0 数字值越大,优先级越高

​ nice值: -20 - 19 (对应为系统优先级的 100-139)

时间复杂度Big O:时间(空间)复杂度,用时(空间)和规模的关系描述

1.8 进程分类

1.8.1 按OS分类
  • 协作式多任务:早期windows使用

  • 抢占式多任务:主要应用于Linux内核中,CPU控制在OS中,操作系统会轮询每个人物是否需要使用CPU,依据时间片分配资源

1.8.2 按进程类型分类
  • 守护进程: daemon 在系统引导过程中启动的进程,和终端无关

  • 前台进程:和终端相关,通过终端启动的进程

注意:两者可以相互转换

1.8.3 按进程资源使用分类
  • CPU-BOUND: CPU密集型,非交互

  • IO-BOUND: IO密集型,交互式

1.9 IO调度算法

在linux2.6中主要有以下4种

  • NOOP

  • Deadline scheduler

  • Anticipatory scheduler

  • CFQ

具体的算法内容不做展开

查看方式

[root@shellenv ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

2 进程管理和性能相关工具

linux系统状态的查看和管理工具

pstree  
ps 
pidof 
pgrep 
top  
htop  
glance 
pmap 
vmstat
dstat
kill
pkill
job
bg
fg
nohup

2.1 进程树 pstree

以树状结构显示进程的父子关系

man 1 pstree 查看命令帮助手册

格式:

pstree [OPTION] [ PID / USER ]

常用OPTIONS

-p	显示PID
-T	不显示线程Thread
-u	显示用户切换		显示su 
-H PID	高度指定进程及其父进程

2.2 进程信息 ps

Process state, 可以显示当前进程状态的快照

默认显示当前终端中的进程,Linux系统各进程的相关信息均保存于/proc/PID目录下的各文件中

man 1 ps 查看命令帮助手册

格式:

ps [option]

支持的风格:

  • UNIX选项 如-A -e
  • BSD选项 如 a
  • GNU选项 如--help
2.2.1 常用组合
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
2.2.2 BSD风格
##默认显示当前终端中的进程
a 选项包括所有终端中的进程
x 选项包括不链接终端的进程
u 选项显示进程所有者的信息 [进程有效的用户,而不是命令的发起者]
##user1执行命令XXX,XXX存在SUID、SGID,显示的用户信息为root
f 选项显示进程树
k | --sort属性 对属性排序,【属性前加- 表示倒序排列】
o 属性... 选项显示定制的信息 pid cmd %cpu %memd等
L 显示支持的属性列表

## ps axo pid,%cpu,%mem k %cpu
查看进程,显示PID,CPU利用率,内存占用, 并按照cpu利用率正序排序
2.2.3 UNIX风格
-C	cmdlist指定命令,多个命令用,分隔
-L	显示线程
-e	显示所有进程,相当于-A
-f	显示完整格式程序信息
-F	显示更完整格式的进程信息
-H	以进程层级格式显示进程相关信息
-u	userlisr 指定有效的用户id或名称
-U	userlist 指定真正的用户id或名称
-g	gid或groupname 指定有效的gid或组名称
-G	gid或groupname 指定真正的gid或组名称
-p	pid 显现指定pid的进程
--ppid PID	显示属于pid的子进程
-t	ttylist 指定tty相当于t
-M	显示SELINUX信息,相当于Z
2.2.4 ps输出属性
VSZ:虚拟内存集,线性内存
RSS:常驻内存级
STAT:进程状态
	R:running
	S:interruptable sleeping
	D:uninterruptable sleeping
	T:stopped
	Z:zombie
	+:前台进程
	l:多线程进程
	L:内存分页并带锁
	N:低优先级
	<:高优先级
	s:session leader,会话(子进程)发起者
	I:Idle kernel thread: CentOS8新特性

ni: nice值
pri:优先级	<0-139>	
psr: cpu编号
rtprio:实时优先级

2.3 查看进程信息prtstat

可以显示进程信息,来自包psmisc

man 1 prtstat

格式:

prtstat [options] PID ...

OPTIONS:

-r raw格式显示

[root@shellenv ~]# prtstat 1
Process: systemd                State: S (sleeping)
  CPU#:  2              TTY: 0:0        Threads: 1
Process, Group and Session IDs
  Process ID: 1           Parent ID: 0
    Group ID: 1          Session ID: 1
  T Group ID: -1

Page Faults
  This Process    (minor major):     9229        55
  Child Processes (minor major):   203843       169
CPU Times
  This Process    (user system guest blkio):   0.03   0.79   0.00   0.11
  Child processes (user system guest):         0.62   0.99   0.00
Memory
  Vsize:       195 MB
  RSS:         4194 kB                   RSS Limit: 18446744073709 MB
  Code Start:  0x556fa5840000            Code Stop:  0x556fa59a3773
  Stack Start: 0x7ffeac7bc1f0
  Stack Pointer (ESP): 0x7ffeac7bb420    Inst Pointer (EIP): 0x7fc70ef3c0e3
Scheduling
  Policy: normal
  Nice:   0              RT Priority: 0 (non RT)

2.4 设置和调整进程优先级

进程优先级调整

  • 静态优先级: 100 -139

  • 进程默认启动时的nice值为0,优先级为120

  • 只有root才能降低nice值(提高优先级)

nice命令: 以指定的优先级启动进程

nice [option] [command [arg]...]

***************************************************************************************
-n, --adjustment=N   add integer N to the niceness (default 10)

renice命令:可以调整正在执行中的进程优先级

renice [-n] priority pid

nice和renice职能调整非实时优先级

查看

ps axo pid,comm,ni

2.5 搜索进程

按条件搜索进程

  • ps [options] | grep

  • pgrep 按预定义的模式

  • pidof 按照确切的程序名称查找pid

pgrep命令
pgrep [options] pattern

进程与cpu使用的绑定 taskset

OPTIONS

-u uid:	effective user	生效者
-U UID: real user		命令发起者
-t terminal:			指定与终端相关的进程
-l 						显示进程名
-a						显示完整格式的进程名
-P pid					显示指定进程的子进程
pidof
pidof [option] [program...]

option

-x 按照脚本名查找进程pid

2.6 负载查询 uptime

/proc/uptime 包含两个值,单位(s/秒)

  • 系统启动时长

  • 空闲进程的总时长 (按总的CPU核数计算)

[root@shellenv ~]# cat /proc/uptime
66.70 244.37

uptimew显示以下内容

  • 当前时间

  • 系统已启动的时间

  • 当前上线人数

  • 系统平均负载(1/5/15分钟的平均负载,一般不会超过1,超过5时建议告警)

系统平均负载:指在特定时间间隔内运行队列中的平均进程数,通常每颗CPU内核的当前活动进程数不大于3,那么系统的性能良好,如果每颗CPU内核的任务数大于5,那么此主机的性能存在严重问题

[root@shellenv ~]# w
 16:00:36 up 8 min,  1 user,  load average: 0.00, 0.01, 0.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.10.1     15:52    4.00s  0.05s  0.02s w

[root@shellenv ~]# uptime
 16:00:38 up 8 min,  1 user,  load average: 0.00, 0.01, 0.01

#	w命令的第一行与uptime命令显示结果相同

2.7 显示cpu相关统计 mpstat

[root@shellenv ~]# mpstat
Linux 3.10.0-1160.el7.x86_64 (shellenv)         08/14/2024      _x86_64_        (4 CPU)

05:36:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:36:36 PM  all    0.03    0.00    0.04    0.02    0.00    0.00    0.00    0.00    0.00   99.90

%usr:用户空间占用的cpu资源
%nice:调整优先级
%sys:内核空间占用的cpu
%iowait:io等待耗费的cpu
%irq:中断
%soft:软中断
%steal:虚拟机占用的cpu,也被称为被盗取的cpu时间片
%idle:空闲

[root@shellenv ~]# mpstat 1	6				#	指定1秒执行一次 收集6次后退出
Linux 3.10.0-1160.el7.x86_64 (shellenv)         08/14/2024      _x86_64_        (4 CPU)

05:51:52 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:51:53 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:51:54 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:51:55 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:51:56 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:51:57 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
^C
Average:     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

2.8 查看进程实时状态 top

man top 查看命令帮助手册

top - 17:58:29 up  2:06,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 210 total,   1 running, 209 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861296 total,  2419592 free,   791688 used,   650016 buff/cache
KiB Swap:  4063228 total,  4063228 free,        0 used.  2809084 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  2048 gnome-i+  20   0  713964  14340   9200 S   0.7  0.4   0:01.89 gsd-color
    64 root      20   0       0      0      0 S   0.3  0.0   0:07.17 kworker/1:1
   291 root      20   0   66336  16000   4228 S   0.3  0.4   0:23.68 plymouthd
   441 root      20   0       0      0      0 S   0.3  0.0   0:17.03 xfsaild/dm-0
   769 root      20   0  295376   5200   3948 S   0.3  0.1   0:26.31 vmtoolsd
     1 root      20   0  193932   7068   4200 S   0.0  0.2   0:01.78 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.04 ksoftirqd/0
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.08 migration/0

命令栏位的显示信息

us:用户空间

sy:内核空间

ni:调整nice时间

id:空闲时间

wa:等待io时间

hi:硬中断

si:软中断(模式切换)

st:虚拟机偷走的时间

存在许多内置命令:

帮助: h?,通过q或者esc退出帮助

排序:

P:依据占用的CPU百分比

M:依据占据内存的百分比

T:依据累计占据cpu的时长,TIME+

首部显示的信息

uptime信息: l命令

task及cpu信息:t命令

cpu分别显示:1命令

memory信息:m命令

退出命令:q

修改刷新时间间隔:s

终止指定进程:k

保存文件:w

htop命令<增强的top>

来自epel源,比top功能更强

2.9 free内存空间

free [option]

-b 字节单位
-m MB单位
-g GB单位
-h
-o 不显示-/+buffers/cache行		#	centos6
-t 显示RAM+SWAP的总和
-s n 刷新间隔为n秒
-c n 刷新n次后退出

清除缓存区中的内存 不建议操作

[root@shellenv ~]# free 
              total        used        free      shared  buff/cache   available
Mem:        4026120      184016     3427960       11764      414144     3601652
Swap:       8388604           0     8388604
[root@shellenv ~]# echo 3 > /proc/sys/vm/drop_caches
[root@shellenv ~]# free 0h
              total        used        free      shared  buff/cache   available
Mem:        4026120      162768     3804868       11764       58484     3707604
Swap:       8388604           0     8388604

2.10 进程对应的内存映射 pmap

pmap [options] PID […]

-x	显示详细格式的信息

也可以通过查看 /proc/PID/maps

strace命令

查看命令的系统调用的内容,需要自行安装

[root@shellenv ~]# strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffd3dcd8ad0 /* 25 vars */) = 0
brk(NULL)                               = 0x124d000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb67a000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=37250, ...}) = 0
mmap(NULL, 37250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbceb670000
close(3)                                = 0
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220j\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=155744, ...}) = 0
mmap(NULL, 2255216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbceb233000
mprotect(0x7fbceb257000, 2093056, PROT_NONE) = 0
mmap(0x7fbceb456000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7fbceb456000
mmap(0x7fbceb458000, 6512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbceb458000
close(3)                                = 0
open("/lib64/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\26\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=20048, ...}) = 0
mmap(NULL, 2114112, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbceb02e000
mprotect(0x7fbceb032000, 2093056, PROT_NONE) = 0
mmap(0x7fbceb231000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fbceb231000
close(3)                                = 0
open("/lib64/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\37\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=37064, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb66f000
mmap(NULL, 2130560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbceae25000
mprotect(0x7fbceae2c000, 2097152, PROT_NONE) = 0
mmap(0x7fbceb02c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fbceb02c000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbceaa57000
mprotect(0x7fbceac1b000, 2093056, PROT_NONE) = 0
mmap(0x7fbceae1a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7fbceae1a000
mmap(0x7fbceae20000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbceae20000
close(3)                                = 0
open("/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=402384, ...}) = 0
mmap(NULL, 2494984, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbcea7f5000
mprotect(0x7fbcea855000, 2097152, PROT_NONE) = 0
mmap(0x7fbceaa55000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x60000) = 0x7fbceaa55000
close(3)                                = 0
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=19248, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb66e000
mmap(NULL, 2109744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbcea5f1000
mprotect(0x7fbcea5f3000, 2097152, PROT_NONE) = 0
mmap(0x7fbcea7f3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fbcea7f3000
close(3)                                = 0
open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\23\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=19896, ...}) = 0
mmap(NULL, 2113904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbcea3ec000
mprotect(0x7fbcea3f0000, 2093056, PROT_NONE) = 0
mmap(0x7fbcea5ef000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fbcea5ef000
close(3)                                = 0
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200m\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=142144, ...}) = 0
mmap(NULL, 2208904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbcea1d0000
mprotect(0x7fbcea1e7000, 2093056, PROT_NONE) = 0
mmap(0x7fbcea3e6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fbcea3e6000
mmap(0x7fbcea3e8000, 13448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbcea3e8000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb66d000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb66b000
arch_prctl(ARCH_SET_FS, 0x7fbceb66b840) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7fbceae1a000, 16384, PROT_READ) = 0
mprotect(0x7fbcea3e6000, 4096, PROT_READ) = 0
mprotect(0x7fbcea5ef000, 4096, PROT_READ) = 0
mprotect(0x7fbcea7f3000, 4096, PROT_READ) = 0
mprotect(0x7fbceaa55000, 4096, PROT_READ) = 0
mprotect(0x7fbceb02c000, 4096, PROT_READ) = 0
mprotect(0x7fbceb231000, 4096, PROT_READ) = 0
mprotect(0x7fbceb456000, 4096, PROT_READ) = 0
mprotect(0x61a000, 4096, PROT_READ)     = 0
mprotect(0x7fbceb67b000, 4096, PROT_READ) = 0
munmap(0x7fbceb670000, 37250)           = 0
set_tid_address(0x7fbceb66bb10)         = 1212
set_robust_list(0x7fbceb66bb20, 24)     = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7fbcea1d6860, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fbcea1df630}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7fbcea1d68f0, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fbcea1df630}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffeaed154b0) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffeaed154b0)      = -1 ENOENT (No such file or directory)
brk(NULL)                               = 0x124d000
brk(0x126e000)                          = 0x126e000
open("/proc/filesystems", O_RDONLY)     = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb679000
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 328
stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7ffeaed15070) = -1 ENOENT (No such file or directory)
read(3, "", 1024)                       = 0
close(3)                                = 0
munmap(0x7fbceb679000, 4096)            = 0
access("/etc/selinux/config", F_OK)     = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106172832, ...}) = 0
mmap(NULL, 106172832, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbce3c8e000
close(3)                                = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=42, ws_col=173, ws_xpixel=0, ws_ypixel=0}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
getdents(3, /* 15 entries */, 32768)    = 488
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbceb679000
write(1, "anaconda-ks.cfg\n", 16anaconda-ks.cfg
)       = 16
close(1)                                = 0
munmap(0x7fbceb679000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

ltrace

查看命令的库调用信息

[root@shellenv ~]# ltrace ls
__libc_start_main(0x402910, 1, 0x7ffca29cc9e8, 0x4129a0 <unfinished ...>
strrchr("ls", '/')                                                                                         = nil
setlocale(LC_ALL, "")                                                                                      = "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale")                                                           = "/usr/share/locale"
textdomain("coreutils")                                                                                    = "coreutils"
__cxa_atexit(0x40a980, 0, 0, 0x736c6974756572)                                                             = 0
isatty(1)                                                                                                  = 1
getenv("QUOTING_STYLE")                                                                                    = nil
getenv("COLUMNS")                                                                                          = nil
ioctl(1, 21523, 0x7ffca29cc8b0)                                                                            = 0
getenv("TABSIZE")                                                                                          = nil
getopt_long(1, 0x7ffca29cc9e8, "abcdfghiklmnopqrstuvw:xABCDFGHI:"..., 0x61a640, -1)                        = -1
getenv("LS_BLOCK_SIZE")                                                                                    = nil
getenv("BLOCK_SIZE")                                                                                       = nil
getenv("BLOCKSIZE")                                                                                        = nil
getenv("POSIXLY_CORRECT")                                                                                  = nil
getenv("BLOCK_SIZE")                                                                                       = nil
__errno_location()                                                                                         = 0x7f3adf1c06c0
malloc(56)                                                                                                 = 0x779040
memcpy(0x779040, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 56)                = 0x779040
__errno_location()                                                                                         = 0x7f3adf1c06c0
malloc(56)                                                                                                 = 0x779080
memcpy(0x779080, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 56)                = 0x779080
malloc(19200)                                                                                              = 0x7790c0
malloc(32)                                                                                                 = 0x77dbd0
strlen(".")                                                                                                = 1
malloc(2)                                                                                                  = 0x77dc00
memcpy(0x77dc00, ".\0", 2)                                                                                 = 0x77dc00
__errno_location()                                                                                         = 0x7f3adf1c06c0
opendir(".")                                                                                               = { 3 }
readdir({ 3 })                                                                                             = { 50331713, "." }
readdir({ 3 })                                                                                             = { 64, ".." }
readdir({ 3 })                                                                                             = { 50653867, ".bash_logout" }
readdir({ 3 })                                                                                             = { 50653868, ".bash_profile" }
readdir({ 3 })                                                                                             = { 50653869, ".bashrc" }
readdir({ 3 })                                                                                             = { 50653870, ".cshrc" }
readdir({ 3 })                                                                                             = { 50653871, ".tcshrc" }
readdir({ 3 })                                                                                             = { 50331714, "anaconda-ks.cfg" }
strlen("anaconda-ks.cfg")                                                                                  = 15
malloc(16)                                                                                                 = 0x785c60
memcpy(0x785c60, "anaconda-ks.cfg\0", 16)                                                                  = 0x785c60
readdir({ 3 })                                                                                             = { 50331718, ".bash_history" }
readdir({ 3 })                                                                                             = { 50331723, ".lesshst" }
readdir({ 3 })                                                                                             = { 50746925, ".vimrc" }
readdir({ 3 })                                                                                             = { 50774396, ".bmi.sh.swp" }
readdir({ 3 })                                                                                             = { 50774398, ".cache" }
readdir({ 3 })                                                                                             = { 50775389, ".viminfo" }
readdir({ 3 })                                                                                             = { 34488711, ".config" }
readdir({ 3 })                                                                                             = nil
closedir({ 3 })                                                                                            = 0
free(nil)                                                                                                  = <void>
malloc(24)                                                                                                 = 0x77dc20
_setjmp(0x61b640, 0x400000, 0x779180, 0x77dc28)                                                            = 0
realloc(nil, 48)                                                                                           = 0x77dc40
malloc(24)                                                                                                 = 0x77dc80
__errno_location()                                                                                         = 0x7f3adf1c06c0
__ctype_get_mb_cur_max()                                                                                   = 6
__ctype_get_mb_cur_max()                                                                                   = 6
__errno_location()                                                                                         = 0x7f3adf1c06c0
__ctype_get_mb_cur_max()                                                                                   = 6
__ctype_get_mb_cur_max()                                                                                   = 6
__errno_location()                                                                                         = 0x7f3adf1c06c0
__ctype_get_mb_cur_max()                                                                                   = 6
__ctype_get_mb_cur_max()                                                                                   = 6
fwrite_unlocked("anaconda-ks.cfg", 1, 15, 0x7f3ade974400)                                                  = 15
__overflow(0x7f3ade974400, 10, 0x7f3adf1ce00e, 0anaconda-ks.cfg
)                                                          = 10
free(0x77dc00)                                                                                             = <void>
free(nil)                                                                                                  = <void>
free(0x77dbd0)                                                                                             = <void>
exit(0 <unfinished ...>
__fpending(0x7f3ade974400, 0, 64, 0x7f3ade974eb0)                                                          = 0
fileno(0x7f3ade974400)                                                                                     = 1
__freading(0x7f3ade974400, 0, 64, 0x7f3ade974eb0)                                                          = 0
__freading(0x7f3ade974400, 0, 2052, 0x7f3ade974eb0)                                                        = 0
fflush(0x7f3ade974400)                                                                                     = 0
fclose(0x7f3ade974400)                                                                                     = 0
__fpending(0x7f3ade9741c0, 0, 3328, 0xfbad000c)                                                            = 0
fileno(0x7f3ade9741c0)                                                                                     = 2
__freading(0x7f3ade9741c0, 0, 3328, 0xfbad000c)                                                            = 0
__freading(0x7f3ade9741c0, 0, 4, 0xfbad000c)                                                               = 0
fflush(0x7f3ade9741c0)                                                                                     = 0
fclose(0x7f3ade9741c0)                                                                                     = 0
+++ exited (status 0) +++

2.11 虚拟内存信息 vmstat

命令格式

vmstat [options] [delay [count]]

-s 显示内存的统计数据(summary)

范例和注解

[root@shellenv ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3609488   2080 245016    0    0    45     4   31   52  0  0 100  0  0

#	注解
procs:
	r:可运行(正在运行或等待运行)进程的个数,与核心数相关
	b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)

memory:
	swpd: 交换内存的使用总量
	free: 空闲的物理内存总量
	buffer: 用于buffer的内存总量
	cache: 用于cache的内存总量

swap:(kb/s)
	si: 从磁盘交换内存的数据速率
	so: 从内存交换磁盘的数据速率

io:(kb/s)
	bi: 从块设备读入数据到系统的速率(kb/s)
	bo: 保存数据块设备的速率

system:
	in: interrupts 中断速率,包括时钟
	cs: 进程切换速率

cpu:可以参考top命令

***************************************************************************************
[root@shellenv ~]# vmstat -s 
      4026120 K total memory
       169776 K used memory
       158012 K active memory
       106872 K inactive memory
      3609048 K free memory
         2080 K buffer memory
       245216 K swap cache
      8388604 K total swap
            0 K used swap
      8388604 K free swap
          231 non-nice user cpu ticks
            0 nice user cpu ticks
          317 system cpu ticks
       977835 idle cpu ticks
          140 IO-wait cpu ticks
            0 IRQ cpu ticks
           62 softirq cpu ticks
            0 stolen cpu ticks
       238877 pages paged in
        21257 pages paged out
            0 pages swapped in
            0 pages swapped out
       193639 interrupts
       321253 CPU context switches
   1724203870 boot time
         1645 forks

2.12 统计CPU和设备IO信息 iostat

[root@shellenv ~]# iostat 
Linux 3.10.0-1160.71.1.el7.x86_64 (shellenv) 	08/21/2024 	_x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.02    0.00    0.04    0.01    0.00   99.93

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn: 写入的总量
sda               3.32        90.44         8.40     240841      22356


#	Device
tps: 每秒钟处理的事务
kB_read/s:每秒读取的字节数(kB)
kB_wrtn/s:每秒写入的字节数(kB)
kB_read: 读入的总量
kB_wrtn: 写入的总量

2.13 系统资源统计 dstat

dstat用于替代vmstat,dstat的功能

需要手动安装,通过 dstat --help可查看帮助手册

格式:

dstat [-afv] [options] [delay [conut]]

options:

-c 显示cpu信息
-d 显示disk信息
-D total,sda,sdb
-g 显示page相关统计数据
-m 显示memory相关统计数据
-n 显示network相关统计数据
-p 显示process相关统计数据
-r 显示io请求相关的统计数据
--tcp
--udp
--unix
--raw 
--socket
--ipc
--top-cpu: 显示最占cpu的进程
--top-io: 显示最占io的进程
--top-mem: 显示最占内存的进程
--top-latency: 显示延迟最大的进程

范例

[root@shellenv ~]# dstat 
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0   0|  66k   12k|   0     0 |   0     0 |  64   106 
  0   0 100   0   0   0|   0     0 | 180B  818B|   0     0 |  46    69 
  0   0 100   0   0   0|   0     0 | 120B  338B|   0     0 |  30    49 
  0   0 100   0   0   0|   0     0 |  60B  338B|   0     0 |  30    48 
  0   0 100   0   0   0|   0     0 |  60B  338B|   0     0 |  19    33 

2.14 监视磁盘IO iotop

iotop命令可以监视磁盘i/o情况的工具,可以查看pid,用户,io,进程等相关信息

Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
    64 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.15 % [kworker/1:1]
  2048 be/4 gnome-in    0.00 B/s    0.00 B/s  0.00 %  0.00 % gsd-color
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
     2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
  2051 be/4 gnome-in    0.00 B/s    0.00 B/s  0.00 %  0.00 % gsd-datetime
     4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]


#	输出注解
Line1:	Read和Write速率总计
Line2:	实际的Read和Write速率
Line3:
	线程id('p'可以切换查看进程id)
	优先级
	用户
	磁盘读速率
	磁盘写速率
	swap交换占用百分比
	io等待所占百分比
常用参数
  • -o,–only 只显示正在产生i/o的进程或线程,除了传参,可以在运行过程中按o生效

  • -b,–batch 非交互模式,一般用来记录日志

  • -n NUM, 设置监测次数,默认为无限。在非交互模式下很有用

  • -d SEC, --delay=SEC 设置每次监测的间隔,默认1秒,可以接收非整形数据

  • -p PID,–pid=PID,指定监测的进程

  • -u USER,–user=USER 指定监测某个用户产生的io

  • -P,–processes,仅显示进程,默认iotop显示所有线程

  • -a,–accumulated 显示累计的io,而不是带宽

  • -t,–time,加上时间戳,[非交互模式]

  • -q,–quiet 禁止头几行,非交互模式,有三种指定方式

    -q 只在第一次监测时显示列名

    -qq 用不显示列明

    -qqq 用不显示io汇总

交互式操作:

left/right方向键:改变排序索引列

r: 反向排序

o: 切换到only选项

p: 切换到processes选项

a: 切换到accumulated选项

q: 退出

i: 改变线程的优先级

2.15 显示网络带宽使用情况 iftop

包源自于epel

2.16 查看网络实时吞吐量 nload

能够实时监控网络流量和带宽使用情况,通过数值和动态图展示进出的流量情况,包源自于epel

界面操作:

上下方向键,左右方向键,Tab键都可以切换查看多个网卡的流量情况

F2可以显示选项窗口

2.17 综合监控程序 glance

格式:

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [-t refresh] [-f file] [-o output]

内建命令

a / l / c / b /m /w

详细的操作可见man 1 glances

2.18 查看进程打开文件lsof

lsof:查看当前系统文件的工具。linux环境下,一切皆文件。系统在后台为应用程序都分配了文件描述符

命令选项
-a: 列出打开文件存在的进程
-c<进程名>:列出指定进程打开的文件
-g: 列出GID号进程详情
-d<文件号>:列出占用该文件号的进程
+d<目录>:列出目录下被打开的文件
+D<目录>:递归列出目录下被打开的文件
-n<目录>:列出使用的NFS文件
-i<条件>:列出符合条件的进程
-p<pid>列出指定进程号打开的文件
-u:列出UID号进程详情
-h:显示帮助信息
-v:显示版本信息

范例

[root@shellenv bin]# lsof -i :22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1253 root    3u  IPv4  27673      0t0  TCP *:ssh (LISTEN)
sshd    1253 root    4u  IPv6  27675      0t0  TCP *:ssh (LISTEN)
#	查看22端口的占用情况


[root@shellenv bin]# lsof /dev/pts/0
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash     8463 root    0u   CHR  136,0      0t0    3 /dev/pts/0
bash     8463 root    1u   CHR  136,0      0t0    3 /dev/pts/0
bash     8463 root    2u   CHR  136,0      0t0    3 /dev/pts/0
bash     8463 root  255u   CHR  136,0      0t0    3 /dev/pts/0
lsof    10410 root    0u   CHR  136,0      0t0    3 /dev/pts/0
lsof    10410 root    1u   CHR  136,0      0t0    3 /dev/pts/0
lsof    10410 root    2u   CHR  136,0      0t0    3 /dev/pts/0
#	查看由登录用户启动而非系统启动的进程

2.19 CentOS8 新特性 cockpit *

2.20 信号发送 kill

kill:内部命令,可以向进程发送控制信号,每个信号对应一个数字,信号名称以SIG开头,不区分大小写

显示当前系统可用的信号

kill -l
trap -l

[root@shellenv ~]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

查看帮助 man 7 signal

       Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at terminal
       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process
常用信号
1/sighup	无需关闭进程而让其重读cfgFile
2/sigint	中止正在运行的进程,相当于ctrl+c
3/sigquit	
9/sigkill	强制杀死正在运行的进程
15/sigterm	终止正在运行的进程
18/sigcont	继续运行
19/sigstop	后台休眠

指定信号的方式

  • 信号对应的数字标识:1,2,9

  • 信号完整名称

  • 信号的简写HUP /hup

进程信号的发送
依据pid:
kill [-s sigspec | -n signum | -sigspec ] PID | jobspec ... or kill -l [sigspec] 

范例

kill -1 PID
kill -n 9 PID
kill -s SIGINT PID
依据名称:killall
killall [-SIGNAL] COMMAND_NAME
依据模式pkill
pkill [options] pattern

常用选项

-SIGNAL
-u UID:程序生效者
-u UID:真正发起运行命令者
-t ternimal:与指定终端相关的进程
-l: 显示进程名(pgrep)
-a: 显示完整格式的进程名(pgrep可用)
-P PID:显示指定进程的子进程

利用0型号实现进程健康检查<存在一些非完善的情况>

[root@shellenv ~]# ps aux | grep ping
root       1318  0.0  0.0 128552  1276 pts/0    T    14:06   0:00 ping 192.168.10.1
root       1319  0.0  0.0 128552  1280 pts/0    T    14:06   0:00 ping 192.168.10.254
root       1399  0.0  0.0 112808   976 pts/0    S+   14:15   0:00 grep --color=auto ping
[root@shellenv ~]# kill -0 1319
[root@shellenv ~]# echo $?
0

2.21 作业管理

linux的作业控制

前台作业:通过终端启动,启动后占用终端

后台左右:可通过终端启动,启动后释放终端,<转入后台运行>

控制作业为后台运行

  • 运行中的作业ctrl+z

  • 带启动的作业COMMAND &

作业虽然移动至后台运行,但依旧与终端关联;推出终端将导致作业的停止。如果希望送至后台的作业与终端剥离关系

  • nohup COMMANDS &> /dev/null &

需要注意的是,nohup后的命令如果存在输出信息,会将输出信息保存至文件中

[root@shellenv ~]# nohup ls &
[1] 1629
[root@shellenv ~]# nohup: ignoring input and appending output to ‘nohup.out’

[1]+  Done                    nohup ls
[root@shellenv ~]# cat nohup.out
anaconda-ks.cfg
nohup.out
  • screen;COMMANDS
  • tumx;COMMANDS
作业控制
fg %作业号:	将指定的后台作业调回前台
bg %作业号:	将指定的前台作业调回后台
kill %作业号:	终止指定的作业

jobs查看后台作业<必须在当前进程的执行终端下查看>

[root@shellenv ~]# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=128 time=0.177 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=128 time=0.198 ms
^Z
[1]+  Stopped                 ping 192.168.10.1
[root@shellenv ~]# ping 192.168.10.254
PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
64 bytes from 192.168.10.254: icmp_seq=1 ttl=128 time=0.112 ms
64 bytes from 192.168.10.254: icmp_seq=2 ttl=128 time=0.165 ms
^Z
[2]+  Stopped                 ping 192.168.10.254
[root@shellenv ~]# jobs
[1]-  Stopped                 ping 192.168.10.1
[2]+  Stopped                 ping 192.168.10.254
	
#	杀死作业	
[root@shellenv ~]# jobs
[1]-  Stopped                 ping 192.168.10.1
[2]+  Stopped                 ping 192.168.10.254
[root@shellenv ~]# kill -9 %1

[1]-  Stopped                 ping 192.168.10.1
[root@shellenv ~]# jobs
[1]-  Killed                  ping 192.168.10.1
[2]+  Stopped                 ping 192.168.10.254

# []中显示的数字为作业编号,执行信息发送时,需使用%[n]执行
kill -signal %n

2.22 并行运行

利用后台执行,实现并行功能;同时执行多个进程,提高效率

方式1:

cat task.sh
a.sh&
b.sh&

方式2:

(f1.sh&);(f2.sh&);(f3.sh&)

{f1.sh;f2.sh}&{f2.sh;f3.sh}&

该方式可以使得括号内的程序顺序执行,实现多组命令并行执行

方式3:

f1.sh&f2.sh&f3.sh&

注意

文章由博主Benjemin (linux小白)自行整理,书写风格和内容不一定由大家所接受,期待多多交流。

知识源自于bilibili 王晓春老师的公开视频 linux入门

如有内容有误可评论反馈,整理不易,希望多多关注点赞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值