1、Linux程序与进程
程序:
程序是一组指令及参数的集合,通过逻辑控制运行起来,完成某项特定任务。
静态的,封闭的。
进程:
进程是程序运行起来的结果,是操作系统运行的基本单位。
有生命周期(产生---->死亡)
进程有运行状态(running,sleepping,等待,僵死)
并发性,交互性(管道)----共享内存,队列(kafka)。
程序与进程的区别:
程序是静态,进程是动态的有生命周期,有状态
程序与进程的关系不是一一对应,/usr/bin/vim(程序) -----vim test1 ,vim test2
程序是封闭的,进程有并发性和交往性。进程之间可以通信,
(|);方式:(1)共享内存,(2)消息队列
2、子进程和父进程
子进程继承父进程的特性:安全性的身份认证;过去和当前的文件描述符,端口等资源特权;环境变量;程序代码。
父进程------->fork()----->子进程
子进 ------>exec()------>运行程序
子进程-------->exit()------->退出
每个进程都可以产生子进程,
父进程 ----sleep---------------------running-------->
| |
fork()-----exec()----------exit() ---->zombie码片
————————————————
版权声明:本文为CSDN博主「不淘气」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45961525/java/article/details/105538136
3、进程和线程
对于linux而言,不严格区分,对于进程和线程都将拥有独立的一套完整资源集(内存---->虚拟内存,CPU------>时间片)。
4、进程管理工具
(1)pstree:用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以清楚的看出是谁创建了谁。(Centos5/6: init ____ Centos7:systemd)
安装方法及选项:
[root@centos-node1 ~]# yum provides pstree //查找 pstree包
[root@centos-node1 ~]# yum install psmisc //找准位置安装
-A: 用途,当终端不支持UTF-8(中文),显示乱码,此时用该参数。
-U:各进程树之间的连接以utf8字符来链接,某些终端可能会有错
-p:列出pid
-u:列出每个进程所属账号名称
例:
[root@centos-node1 ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───pstree //本终端下的进程
│ └─sshd───sftp-server
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
[root@centos-node1 ~]# pstree -p //列出PID
systemd(1)─┬─NetworkManager(7333)─┬─dhclient(8303)
│ ├─{NetworkManager}(7342)
│ └─{NetworkManager}(7344)
├─VGAuthService(6688)
├─auditd(6160)───{auditd}(6166)
├─crond(6943)
├─dbus-daemon(6728)───{dbus-daemon}(6871)
├─firewalld(6970)───{firewalld}(7608)
├─login(8081)───bash(8088)
├─lvmetad(3534)
├─master(7933)─┬─pickup(7934)
│ └─qmgr(7935)
├─polkitd(6673)─┬─{polkitd}(6830)
│ ├─{polkitd}(6884)
│ ├─{polkitd}(6893)
│ ├─{polkitd}(6896)
│ ├─{polkitd}(6909)
│ └─{polkitd}(6962)
├─rsyslogd(7804)─┬─{rsyslogd}(8062)
│ └─{rsyslogd}(8064)
├─sshd(7800)─┬─sshd(8104)───bash(8110)───pstree(8496)
│ └─sshd(8108)───sftp-server(8127)
├─systemd-journal(3510)
├─systemd-logind(6722)
├─systemd-udevd(3545)
├─tuned(7802)─┬─{tuned}(8043)
│ ├─{tuned}(8044)
│ ├─{tuned}(8045)
│ └─{tuned}(8060)
└─vmtoolsd(6696)───{vmtoolsd}(6964)
[root@centos-node1 ~]# pstree -u //列出每个进程所属账号名称
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─crond
├─dbus-daemon(dbus)───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup(postfix)
│ └─qmgr(postfix)
├─polkitd(polkitd)───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───sftp-server
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
(2)ps命令
ps --help <simple|list|output|threads|misc|all>
ps --help <s|l|o|t|m|a>
选项 | 功能 |
---|---|
-A | 所有进程都显示出来,与-e具有同样的效用 |
-a | 显示终端机下的进程,包括其他用户 |
-u | 以用户为 主的进程状态 |
x | 除了TTY控制的其他进程 |
输出格式规划:
l:较长、较详细地将该PID的信息列出
j:工作格式
-f:打印完整输出
例:
[root@centos-node1 ~]# ps -a
PID TTY TIME CMD
9139 pts/0 00:00:00 ps
[root@centos-node1 ~]# ps -A
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:01 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:01 rcu_sched
10 ? 00:00:00 lru-add-drain
11 ? 00:00:00 watchdog/0
13 ? 00:00:00 kdevtmpfs
14 ? 00:00:00 netns
15 ? 00:00:00 khungtaskd
16 ? 00:00:00 writeback
......
[root@centos-node1 tmp]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 8110 8104 0 80 0 - 28860 do_wai pts/0 00:00:00 bash
0 R 0 8521 8110 0 80 0 - 38309 - pts/0 00:00:00 ps
F 代表这个进程的旗帜(flag)
S 代表这个进程的状态(STAT)
UID 代表执行者身份
PID 进程的ID号
C CPU使用的资源百分比
PRI 指进程的执行优先权
NI 进程的nice值,指执行的优先级的修正数值
ADDR 内核函数
SZ 使用掉的内存大小
WCHAN 进程是否在运行,-表示正在运行
TTY 登入者的终端机位置
TIME 使用掉的CPU时间
CMD 所下达的指令名称
[root@centos-node1 ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 128024 6544 ? Ss 11:07 0:01 /usr/lib/syste
root 2 0.0 0.0 0 0 ? S 11:07 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 11:07 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 11:07 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 11:07 0:00 [migration/0]
USER: 进程的发起者
PID:进程的ID号
%CPU:CPU使用百分比
%MEM:内存使用百分比
VSZ :虚拟内存
RSS :固定内存
TTY :终端
STAT: 状态 (S,T,R,Z)
START: 启动时间
TIME: 该进程实际使用CPU运作的时间
COMMAND: 指令
(3)pgrep:查看pid与进程名的对应
选项 | 功能 |
---|---|
-l | 同时显示进程名和PID |
-o | 当匹配多个进程时,显示进程号最小的那个 |
-n | 当匹配多个进程时,显示进程号最大的那个 |
注意:进程号越大,并不一定意味着进程的启动时间越晚
[root@centos-node1 ~]# pgrep ssh //默认只显示PID
7800
8104
8108
[root@centos-node1 ~]# pgrep -l ssh //同时显示PID和进程名称
7800 sshd
8104 sshd
8108 sshd
[root@centos-node1 ~]# pgrep -l -n ssh //当匹配多个进程时,显示进程号最大的那个
8108 ssh
[root@centos-node1 ~]# pgrep -l -o ssh //当匹配多个进程时,显示进程号最小的那个
7800 sshd
(4)killall ,kill ,pkill -----------通过发送信号的方式,对进程行为做控制
killall命令用于杀死指定名字的进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一。
选项 | 功能 |
---|---|
-z | 只杀死拥有scontext的进程 |
-e | 要求匹配进程名称 |
-I | 忽略小写 |
-g | 杀死进程组而不是进程 |
-i | 交互模式,杀死进程前先询问用户 |
-l | 列出所有的已知信号名称 |
-q | 不输出警告消息 |
-s | 发出指定的信号 |
-v | 报告信号是否发送成功 |
-w | 等待进程死亡 |
–help | 显示帮助信息 |
–version | 显示版本信息 |
语法格式:
kill [选项] [进程id]
-l 列出全部信号名称
-a 处理当前进程时不限制名里面和进程号的对应关系
-p 指定kill命令只打印相关进程的进程号,而不发送任何信息
-s 指定发送信号
-u 指定用户
实例:
[root@centos-node1 ~]# 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
0 ---->嗅探进程是否存在,不对其做任何操作
1 ---->断开终端
2 ---->中断,ctrl + c
3 ---->退出,ctrl + \
15 --->默认,终止
9 --->强制终止,
18 --->继续
19 --->暂停
实例:
[root@centos-node1 ~]# pgrep httpd
9182
9184
9185
9186
9187
9191
[root@centos-node1 ~]# kill 9191
[root@centos-node1 ~]# pgrep httpd
9182
9184
9185
9186
9187
9194
[root@centos-node1 ~]# kill 9186
[root@centos-node1 ~]# pgrep httpd
9182
9184
9185
9187
9194
9197
[root@centos-node1 ~]# kill 9182
[root@centos-node1 ~]# pgrep httpd
[root@centos-node1 ~]# systemctl start httpd
[root@centos-node1 ~]# pgrep httpd
9210
9230
9231
9232
9233
9234
[root@centos-node1 ~]# kill `pgrep -o httpd`
[root@centos-node1 ~]# pgrep httpd
[root@centos-node1 ~]# systemctl start httpd
[root@centos-node1 ~]# killall -0 httpd
[root@centos-node1 ~]# echo $?
0
[root@centos-node1 ~]# killall -15 httpd
[root@centos-node1 ~]# pgrep httpd
[root@centos-node1 ~]# systemctl start httpd
[root@centos-node1 ~]# pgrep httpd
9267
9268
9269
9270
9271
9272
实例2:通过开启两个端口,并执行ping命令来了解kill的用法与功能。
首先在1号端口上执行ping命令
[root@centos-node1 ~]# ping 192.168.229.134
PING 192.168.229.134 (192.168.229.134) 56(84) bytes of data.
64 bytes from 192.168.229.134: icmp_seq=1 ttl=64 time=0.295 ms
64 bytes from 192.168.229.134: icmp_seq=2 ttl=64 time=0.388 ms
64 bytes from 192.168.229.134: icmp_seq=3 ttl=64 time=0.286 ms
64 bytes from 192.168.229.134: icmp_seq=4 ttl=64 time=0.220 ms
64 bytes from 192.168.229.134: icmp_seq=5 ttl=64 time=0.492 ms
64 bytes from 192.168.229.134: icmp_seq=6 ttl=64 time=0.757 ms
我们再到2号端口上进行查看和kill命令操作
[root@centos-node1 ~]# ps -ef |grep ping
root 9306 9284 0 16:22 pts/1 00:00:00 ping 192.168.229.134
root 9308 8110 0 16:22 pts/0 00:00:00 grep --color=auto ping
[root@centos-node1 ~]# kill -2 9306 //中断指令,相当于ctrl + c
1号端口收到指令中断ping命令
64 bytes from 192.168.229.134: icmp_seq=31 ttl=64 time=0.282 ms
--- 192.168.229.134 ping statistics ---
31 packets transmitted, 31 received, 0% packet loss, time 30014ms
rtt min/avg/max/mdev = 0.220/0.350/0.757/0.114 ms
我们再次在1号端口运行运行ping命令
[root@centos-node1 ~]# ping 192.168.229.134
PING 192.168.229.134 (192.168.229.134) 56(84) bytes of data.
64 bytes from 192.168.229.134: icmp_seq=1 ttl=64 time=0.250 ms
64 bytes from 192.168.229.134: icmp_seq=2 ttl=64 time=0.307 ms
64 bytes from 192.168.229.134: icmp_seq=3 ttl=64 time=0.316 ms
64 bytes from 192.168.229.134: icmp_seq=4 ttl=64 time=0.265 ms
在2号端口进行查看和kill命令
[root@centos-node1 ~]# ps -ef |grep ping
root 9310 9284 0 16:24 pts/1 00:00:00 ping 192.168.229.134
root 9312 8110 0 16:24 pts/0 00:00:00 grep --color=auto ping
[root@centos-node1 ~]# kill -3 9310 //退出指令,相当于ctrl + \
回到1号端口
64 bytes from 192.168.229.134: icmp_seq=22 ttl=64 time=0.789 ms
64 bytes from 192.168.229.134: icmp_seq=23 ttl=64 time=0.306 ms
23/23 packets, 0% loss, min/avg/ewma/max = 0.193/0.348/0.367/0.866 ms //相当于退出一次,然后继续执行
64 bytes from 192.168.229.134: icmp_seq=24 ttl=64 time=0.393 ms
64 bytes from 192.168.229.134: icmp_seq=25 ttl=64 time=0.263 ms
2号端口:
[root@centos-node1 ~]# kill -19 9310 //暂停指令
1号端口:
64 bytes from 192.168.229.134: icmp_seq=41 ttl=64 time=0.292 ms
64 bytes from 192.168.229.134: icmp_seq=42 ttl=64 time=0.287 ms
[1]+ Stopped ping 192.168.229.134
2号端口:
[root@centos-node1 ~]# kill -18 9310 //继续指令
1号端口:
[root@centos-node1 ~]# 64 bytes from 192.168.229.134: icmp_seq=43 ttl=64 time=0.367 ms
64 bytes from 192.168.229.134: icmp_seq=44 ttl=64 time=0.311 ms
64 bytes from 192.168.229.134: icmp_seq=45 ttl=64 time=0.271 ms
64 bytes from 192.168.229.134: icmp_seq=46 ttl=64 time=0.230 ms
64 bytes from 192.168.229.134: icmp_seq=47 ttl=64 time=0.290 ms
(5)top:动态的打印系统信息
top前5行统计信息
第一行:top - 18:09:44 up 7:03, 3 users, load average: 0.00, 0.01, 0.05
内容 | 含义 |
---|---|
18:09:44 | 表示当前时间 |
up 7:03 | 系统运行时间 格式为时:分 |
3 users | 当前登录用户数 |
load average: 0.00, 0.01, 0.05 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
注:load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:Tasks: 174 total, 2 running, 172 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
内容 | 含义 |
---|---|
174 total | 进程总数 |
2 running | 正在运行的进程数 |
172 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
0.0 us | 用户空间占用CPU百分比 |
0.0 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
100.0 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.0 si | 软中断(Software Interrupts)占用CPU的百分比 |
第四行:KiB Mem : 929944 total, 135644 free, 161648 used, 632652 buff/cache
第五行:KiB Swap: 2002940 total, 2002676 free, 264 used. 566868 avail Mem
内容 | 含义 |
---|---|
KiB Mem : 929944 total | 物理内存总量 |
135644 free | 空闲内存总量 |
161648 used | 使用的物理内存总量 |
632652 buff/cache | 用作内核缓存的内存量 |
KiB Swap: 2002940 total | 交换区总量 |
2002676 free | 空闲交换区总量 |
264 used | 使用的交换区总量 |
566868 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
cached Mem | 缓冲的交换区总量 |
缓冲的交换区总量:即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
进程信息
列名 | 含义 |
---|---|
PID | 进程id |
PPID | 父进程id |
RUSER | -Real user name- |
UID | 进程所有者的用户id |
USER | 进程所有者的用户名 |
GROUP | 进程所有者的组名 |
TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
P | 最后使用的CPU,仅在多CPU环境下有意义 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
TIME | 进程使用的CPU时间总计,单位秒 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
%MEM | 进程使用的物理内存百分比 |
VIRT | 程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
SWAP | 程使用的虚拟内存中,被换出的大小,单位kb |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
CODE | 可执行代码占用的物理内存大小,单位kb |
DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
SHR | 共享内存大小,单位kb |
nFLT | 页面错误次数 |
nDRT | 最后一次写入到现在,被修改过的页面数 |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
COMMAND | 命令名/命令行 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
Flags | 任务标志 |
- 在top基本视图中,按键盘数字“1”可以监控每个逻辑CPU的状况:
- 敲击键盘‘b’(打开关闭加亮效果)
- 敲击键盘‘x’(打开/关闭排序列的加亮效果)
- 改变进程显示字段
在top基本视图中,敲击”f”进入另一个视图,在这里可以编辑基本视图中的显示字段
h|?帮助
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 对排序进行反转
f 自定义显示字段
1 显示所有CPU的负载
< 向前
> 向后
z 彩色
W 保存top环境设置
(6)htop:top的增强版
epel 源
yum install epel*
yum install htop
下载扩展源,安装htop。
(7)vmstat
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用
率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参
数是采样的次数,如:
[root@centos-node1 ~]# 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 0 386892 2108 380452 0 0 13 3 51 97 0 0 100 0 0
[root@centos-node1 ~]# vmstat 2 1
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 0 386900 2108 380488 0 0 13 2 51 97 0 0 100 0 0
[root@centos-node1 ~]# vmstat 2 5
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 0 386900 2108 380492 0 0 13 2 51 97 0 0 100 0 0
0 0 0 386900 2108 380492 0 0 0 0 55 94 0 0 100 0 0
1 0 0 386900 2108 380492 0 0 0 0 54 89 0 1 100 0 0
0 0 0 386900 2108 380492 0 0 0 0 52 86 0 1 100 0 0
0 0 0 386900 2108 380492 0 0 0 0 60 95 0 0 100 0 0
用法:vmstat [-V] [-n] [-S unit] [delay [count]]
选项 | 功能 |
---|---|
-V | 显示vmstat版本信息 |
-n | 只在开始时显示一次各字段名称 |
-a | 显示活跃和非活跃内存 |
-d | 显示各个磁盘相关统计信息 |
-D | 显示磁盘总体信息 |
-p | 显示指定磁盘分区统计信息 |
-s | 显示内存相关统计信息及多种系统活动数量 |
-m | 显示slabinfo |
-t | 在输出信息的时候也将时间一并输出出来 |
-S | 使用指定单位显示。参数有k、K、m、M,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024bytes) |
delay | 刷新时间间隔。如果不指定,只显示一条结果 |
count | 刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷 |
类别 | 选项 | 含义 | 说明 |
---|---|---|---|
Process | r | 等待执行的任务数 | 展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈 |
B | 等待IO的进程数量 | ||
Memory | swpd | 正在使用虚拟的内 | |
存大小,单位k | 值大于0表示物理内存已经不足,需要考虑升级内存 | ||
free | 空闲内存大小 | 指物理内存 | |
buff | 已用的buff大小,对块设备的读写进行缓冲 | ||
cache | 已用的cache大小,文件系统的cache | 指的是page cached内存大小 | |
nact | 非活跃内存大小,即被标明可回收的内存,区别于free和active | 具体含义见:概念补充(当使用-a选项时显示) | |
active | 活跃的内存大小 | 具体含义见:概念补充(当使用-a选项时显示) | |
Swap | si | 每秒从交换区写入内存的大小(单位:kb/s) | 表示有磁盘调入内存,也就是内存进入内存交换区的内存大小;通俗的讲就是 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗存进程解决掉 |
so | 每秒从内存写到交换区的大小 | 表示由内存进入磁盘,也就是由内存交换区进入内存的内存大小。 | |
IO | bi | 每秒读取的块数(读磁盘) | 现在的Linux版本块的大小为1024bytes |
bo | 每秒写入的块数(写磁盘) | 如果bi+bo的值过大,且wa值较大,则表示系统磁盘IO瓶颈 | |
System | in | 每秒中断数,包括时钟中断 | 值越大,会看到由内核消耗的cpu时间会越多 |
cs | 每秒上下文切换数 | 值越大,会看到由内核消耗的cpu时间会越多 | |
CPU | Us | 用户进程执行消耗cpu时间(usertime) | us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了 |
Sy | 系统进程消耗cpu时间(systemtime) | sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。一般来说us+sy应该小于80%,如果大于80%,说明可能存在CPU瓶 | |
Id | 空闲时间(包括IO等待时间) | ||
wa | 等待IO时间 | Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。 |
(8)sar :CPU资源监控
[root@centos-node1 ~]# sar -u 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:40:58 PM CPU %user %nice %system %iowait %steal %idle
02:41:03 PM all 0.61 0.00 1.62 0.00 0.00 97.78
02:41:08 PM all 0.00 0.00 0.20 0.00 0.00 99.80
02:41:13 PM all 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.20 0.00 0.60 0.00 0.00 99.19
输出项说明:
CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于 nice 操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待 I/O 操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
-
- 若 %iowait 的值过高,表示硬盘存在 I/O 瓶颈
-
- 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
-
- 若 %idle 的值持续低于 1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
inode、文件和其他内核表监控
例如,每 5秒采样一次,连续采样 3 次,观察核心表的状态。
[root@centos-node1 ~]# sar -v 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:44:40 PM dentunusd file-nr inode-nr pty-nr
02:44:45 PM 119674 1344 110905 3
02:44:50 PM 119674 1344 110905 3
02:44:55 PM 119674 1344 110905 3
Average: 119674 1344 110905 3
输出项说明:
dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的 pty 数量
内存和交换空间监控
例如,每 5秒采样一次,连续采样 3 次,监控内存分页:
[root@centos-node1 ~]# sar -r 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:39:57 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
02:40:02 PM 386272 543672 58.46 2108 226796 299616 10.22 116920 188520 28
02:40:07 PM 386272 543672 58.46 2108 226796 299616 10.22 116924 188520 28
02:40:12 PM 386272 543672 58.46 2108 226796 299616 10.22 116924 188520 28
Average: 386272 543672 58.46 2108 226796 299616 10.22 116923 188520 28
输出项说明:
kbmemfree:这个值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空间.
kbmemused:这个值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空间.
%memused:这个值是 kbmemused 和内存总量(不包括 swap)的一个百分比.
kbbuffers 和 kbcached:这两个值就是 free 命令中的 buffer 和 cache.
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit:这个值是 kbcommit 与内存总量(包括 swap)的一个百分比.
内存分页监控
例如,每 5 秒采样一次,连续采样 3 次,监控内存分页:
[root@centos-node1 ~]# sar -B 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:48:47 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
02:48:52 PM 0.00 7.83 13.86 0.00 13.65 0.00 0.00 0.00 0.00
02:48:57 PM 0.00 0.00 5.22 0.00 10.44 0.00 0.00 0.00 0.00
02:49:02 PM 0.00 0.00 1792.99 0.00 854.51 0.00 0.00 0.00 0.00
Average: 0.00 2.61 604.82 0.00 293.24 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)的百分比
I/O 和传送速率监控
例如,每 5 秒采样一次,连续采样 3 次,报告缓冲区的使用情况,需键入如下命令:
[root@centos-node1 ~]# sar -b 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:50:24 PM tps rtps wtps bread/s bwrtn/s
02:50:29 PM 0.00 0.00 0.00 0.00 0.00
02:50:34 PM 1.00 0.00 1.00 0.00 8.03
02:50:39 PM 0.20 0.00 0.20 0.00 3.22
Average: 0.40 0.00 0.40 0.00 3.75
输出项说明:
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s
进程队列长度和平均负载状态监控
例如,每 5 秒采样一次,连续采样 3 次,监控进程队列长度和平均负载状态:
[root@centos-node1 ~]# sar -q 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:50:45 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
02:50:50 PM 1 185 0.00 0.01 0.05 0
02:50:55 PM 1 185 0.00 0.01 0.05 0
02:51:00 PM 1 185 0.00 0.01 0.05 0
Average: 1 185 0.00 0.01 0.05 0
输出项说明:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后 1 分钟的系统平均负载(System load average)
ldavg-5:过去 5 分钟的系统平均负载
ldavg-15:过去 15 分钟的系统平均负载
系统交换活动信息监控
例如,每 5 秒采样一次,连续采样 3 次,监控系统交换活动信息:
[root@centos-node1 ~]# sar -w 5 3
Linux 3.10.0-957.el7.x86_64 (centos-node1) 04/24/2020 _x86_64_ (1 CPU)
02:53:21 PM proc/s cswch/s
02:53:26 PM 0.80 92.57
02:53:31 PM 0.80 97.99
02:53:36 PM 0.80 96.59
Average: 0.80 95.72
输出项说明:
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量
(9)tsar:
淘宝开源,以周期计划任务的方式执行
安装:
[root@bogon ~]# wget -O tsar.zip https://github.com/alibaba/tsar/archive/master.zip
–no-check-certificate
[root@bogon ~]# yum install unzip
[root@bogon ~]# unzip tsar.zip
[root@bogon tsar-master]# cd tsar-master/
[root@bogon tsar-master]# make
[root@bogon tsar-master]# make install
常用命令
以 1 秒钟为间隔,实时打印 tsar 的概述数据
[root@centos-node1 ~]# tsar -i 1 -l
Time ---cpu-- ---mem-- ---tcp-- -----traffic---- --sda--- --sr0--- --dm-0-- --dm-1-- ---load-
Time util util retran bytin bytout util util util util load1
24/04/20-14:59:23 1.01 35.35 0.00 256.00 382.00 2.80 0.00 2.80 0.00 0.00
24/04/20-14:59:24 0.00 35.35 0.00 316.00 334.00 0.00 0.00 0.00 0.00 0.00
24/04/20-14:59:25 1.00 35.35 0.00 316.00 302.00 0.00 0.00 0.00 0.00
......
tsar 显示 1 天内的历史汇总(summury)信息,以默认 5 分钟为间隔
[root@centos-node1 tsar-master]# tsar
Time ---cpu-- ---mem-- ---tcp-- -----traffic---- --sda--- --sr0--- --dm-0-- --dm-1-- ---load-
Time util util retran bytin bytout util util util util load1
24/04/20-08:50 1.20 23.58 0.00 41.00 42.00 0.16 0.00 0.16 0.00 0.03
24/04/20-08:55 0.13 23.59 0.00 11.00 0.00 0.10 0.00 0.10 0.00 0.00
24/04/20-09:00 0.13 23.60 0.00 13.00 0.00 0.12 0.00 0.12 0.00 0.00
......
tsar --cpu -i 1 显示一天内 cpu 的历史信息,以 1 分钟为间隔
[root@centos-node1 tsar-master]# tsar --cpu -i 1
Time -----------------------cpu----------------------
Time user sys wait hirq sirq util
24/04/20-08:45 0.06 0.11 0.00 0.00 0.01 0.18
24/04/20-08:46 0.27 2.88 0.02 0.00 0.00 3.14
24/04/20-08:47 0.22 2.76 0.02 0.00 0.00 2.98
24/04/20-08:48 0.05 0.08 0.00 0.00 0.00 0.13
......
tsar --live --mem -i 2 以 2 秒钟为间隔,实时打印 mem 的数据。
[root@centos-node1 tsar-master]# tsar --live --mem -i 2
Time -----------------------mem----------------------
Time free used buff cach total util
24/04/20-15:09:00 363.3M 321.2M 2.1M 221.6M 908.1M 35.37
24/04/20-15:09:02 362.9M 321.6M 2.1M 221.6M 908.1M 35.41
24/04/20-15:09:04 362.9M 321.6M 2.1M 221.6M 908.1M 35.41
......
tsar --cpu --mem -i 1 显示一天内的 cpu 和内存历史数据,以 1 分钟为间隔。
[root@centos-node1 tsar-master]# tsar --cpu --mem -i 1
Time -----------------------cpu---------------------- -----------------------mem----------------------
Time user sys wait hirq sirq util free used buff cach total util
24/04/20-08:45 0.06 0.11 0.00 0.00 0.01 0.18 608.0M 209.0M 2.1M 89.0M 908.1M 23.02
24/04/20-08:46 0.27 2.88 0.02 0.00 0.00 3.14 606.8M 210.2M 2.1M 89.1M 908.1M 23.15
......
(11)lsof
lsof输出信息含义 在终端下输入lsof即可显示系统打开的文件。
[root@centos-node1 ~]# lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1616360 16968336 /usr/lib/systemd/systemd
......
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述,应用程序通过文件描述符识别该文件
TYPE:文件类型
DEVICE:指定磁盘的名称
NODE:索引节点
NAME:打开文件的确切名称