Linux资源管理

发布时间 2023-07-13 15:24:21作者: 村尚chun叔

Linux资源管理

Linux进程检测与控制

linux中对需要运维去管理、去查看的资源信息,如下:

内存资源、使用率
free

磁盘资源、使用率
df

CPU资源、使用率
top
htop     # yum install -y htop
glances  # yum install -y glances

进程资源、使用率
ps
pstree
pidof

网络资源、使用率
Iftop

所有资源的整体查看命令
top
glances
htop

孤儿进程,僵尸进程

孤儿进程

父进程由于某原因挂了,代码写的不好,导致生成的一堆儿子进程,没有父亲了,成为了孤儿

- 系统有一个1号进程,等于是一个福利院,去收养这些孤儿进程(1号进程会去接替,管理这些孤儿进程的数据)你就能看到,这些孤儿进程,的ppid,就成了1号进程了
- 孤儿进程释放后,释放执行的相关文件,数据以及释放进程id号(系统id号是有固定的数量)

僵尸进程

子进程先于父进程退出,同时父进程太忙了,无瑕回收子进程的资源,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程

[root@167 ~]# ps -ef|grep 30394
root      30394  30317  0 11:57 pts/1    00:00:00 python jiangshi.py
root      30395  30394  0 11:57 pts/1    00:00:00 [python] <defunct>  #显示这个状态就是僵尸进程

还可以用top命令去看,有几个僵尸进程

PS

ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 4月20 ?       02:07:32 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0 4月20 ?       00:00:32 [kthreadd]

ps看到的进程命令,如果带有中括号[],那就是Linux内核自动生成的进程,不带中括号,就是发行版系统,用户来生成各种进程
UID 该进程执行的用户ID
PID 进程ID
PPID 该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程(Parent Process ID)
C Cpu的占用率,其形式是百分数
STIME 进程的启动时间
TTY 终端设备,发起该进程的设备识别符号,如果显示“?”则表示该进程并不是由终端设备发起
TIME 进程实际使用CPU的时间
CMD 该进程的名称或者对应的路径

ps aux

[root@chaogelinux ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 125452  3460 ?        Ss   10月20  14:31 /usr/lib/systemd/systemd --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    10月20   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    10月20   0:44 [ksoftirqd/0]
解释
USER:该进程属于的用户
PID:该进程号码
%CPU:进程占用CPU的资源比率
%MEM:该进程占用物理内存百分比
VSZ:进程使用的虚拟内存,单位Kbytes
RSS:该进程占用固定的内存量,单位Kbytes
TTY:该进程运行的终端位置
STAT:进程目前状态,可以man ps查看细节
	R:正在运行中
	S:终端睡眠中,可以被唤醒
	D:不可中断睡眠
	T:进程被暂停
	Z:已停止,无法由父进程正常终止,变成了zombie僵尸进程
	进程额外字符
		+:前台进程,比如R+,程序运行在前台,一旦终止,程序结束,数据丢失。
		I:多线程进程,如Sl表示程序是多线程
		N:低优先级进程,如Sn表示优先级很低的进程
		<:高优先级进程
		s:进程领导者(含有子进程),如Ss表示父进程
		L:锁定到内存中
START:进程启动时间
TIME:CPU运行时间
COMMAND:进程命令,名字带有[]表示内核态进程,没有[]表示是用户执行的进程。

TOP

1、top查看 CPU使用情况
命令:top

作用:查看服务器的进程占用的资源(100%使用)

top操作快捷键
z::打开,关闭颜色
M(大写):表示将结果按照内存(MEM)从高到低进行降序排列;
m(小写):切换内存memmory的显示格式。
P(大写):,表示将结果按照CPU 使用率从高到低进行降序排列;
1 :当服务器拥有多个cpu 的时候可以使用“1”快捷键来切换是否展示显示各个cpu 的详细信息;
q:退出

image

第一行

内 容 说 明
17:13:00 系统当前时间
up 7:53 系统的运行时间.本机己经运行 13 小时 05 分钟
2 users 当前登录了三个用户
load average: 0.00, 0.01,0.05 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载

第二行

Tasks: 236 total 系统中的进程总数
1 running 正在运行的进程数
235 sleeping 睡眠的进程数
0 stopped 正在停止的进程数
0 zombie 僵尸进程数。如果不是 0,则需要手工检查僵尸进程

第三行

内 容 说 明
Cpu(s): 0.1 %us 用户模式占用的 CPU 百分比
0.1%sy 系统模式占用的 CPU 百分比
0.0%ni 改变过优先级的用户进程占用的 CPU 百分比
99.9%id idle缩写,空闲 CPU 占用的 CPU 百分比
0.1%wa 等待输入/输出的进程占用的 CPU 百分比
0.0%hi 硬中断请求服务占用的 CPU 百分比
0.1%si 软中断请求服务占用的 CPU 百分比
0.0%st st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

第四行

内 容 说 明
Mem: 8157208 total 物理内存的总量,单位为KB,目前是8157208/1024=7966MB≈8G
1143000 used 己经使用的物理内存数量。
4598168 free 空闲的物理内存数量。
2412392 buff/cache 作为缓冲的内存数量

第五行

内 容 说 明
Swap: 5242876 total 交换分区(虚拟内存)的总大小
0 used 已经使用的交换分区的大小
5242876 free 空闲交换分区的大小
6649640 avail Mem 可用内存

lsof查看进程打开了什么文件

常用参数
-c # 指定进程名,打开了哪些系统文件,如lsof -c nginx
-i # 显示符合条件的进程,如ipv[46][protocol][@host|addr][:service|port]
-p # 显示指定pid打开的文件
-u # 显示指定用户uid打开的文件,以及具体进程信息
+d # 显示文件夹下被打开的文件有哪些,如 lsof +d /var/log/nginx/
+D # 递归列出目录下哪些文件被进程打开
-n # 不显示主机名,直接显示ip
-P # 不显示端口名,直接显示端口号
-s # 列出文件大小
# 直接输入lsof,显示当前用户打开的所有文件,过滤出你需要查找的文件,对应的进程
[root@yuchao-linux01 ~]# lsof |grep access.log

# 查看占用文件的进程
[root@yuchao-linux01 log]# lsof /var/log/nginx/access.log

# 查看指定pid号(父进程)打开了什么文件
[root@yuchao-linux01 log]# lsof -p $(cat /var/run/nginx.pid)

# 查看指定程序名,打开的文件
[root@yuchao-linux01 log]# lsof -c nginx

# 查看指定用户打开的文件
[root@yuchao-linux01 log]# lsof -u jerry01

# 查看指定目录打开的文件,以及递归查看
[root@yuchao-linux01 log]# lsof +d /var/log
[root@yuchao-linux01 log]# lsof +D /var/log

# 查看指定ip的网络连接情况(如有人访问了你的nginx)
[root@yuchao-linux01 log]# lsof -i @192.168.0.240:80

# 查看指定TCP状态的连接情况
[root@yuchao-linux01 log]# lsof -n -P -i TCP  -s TCP:LISTEN

kill关闭进程

常用信号

信号	解释	信号名
1	无须关闭进程,重新加载其配置文件,如reload操作	SIGHUP
2	中断,通常是ctrl+c发出此信号	SIGINT
3	退出,通常是ctrl + \ 发出信号	SIGQUIT
9	立即结束的信号,强制结束进程	SIGKILL
15	终止,通常是系统关机时候发送,正常结束进程,是kill默认信号	SIGTERM
20	暂停进程,通常是ctrl + z 发出信号	SIGTSTP
先确定进程id
再发送信号给进程
kill -1 pid         # 进程重读配置文件
kill -15 pid        # 进程优雅退出
kill -9 pid         # 暴力干掉进程
Kill (结束指定pid的进程)
killall (根据进程名杀死全部匹配的进程,不建议使用)
pkill (根据进程名杀死全部匹配的进程,不建议使用)

进程运行

程序运行有2种

前台运行
程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用;如果终端异常关闭,导致程序会自动退出
后台运行
不会占用你的终端,程序在系统后台跑着,你该干啥干啥,终端关了,程序也继续运行。

后台运行命令

command &   # 未启动的command放入后台去运行
jobs        # 查看后台进程列表
ctrl + z    # 暂停进程
bg 1        # 程序放入后台运行,和 & 一样
fg 1        # 将后台任务放入前台执行

nohup命令

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下

如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out 文件中。

一般和 & 后台符,结合使用。nohup不加&后台符的话还是前台运行

语法nohup command 选项 &

Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

理解linux的数据流

执行linux命令时,linux默认为用户进程提供了3种数据流

stdin
	标准输入:0
	一般是键盘输入数据
	比如cat命令等待用户输入
stdout
	标准输出:1
	程序执行结果,输出到终端
stderr
	标准错误输出:2
	程序执行结果,输出到终端
标准输入
cat 接收键盘的输入数据,然后打印到终端,直到ctrl +d 结束输入
[root@yuchao-tx-server ~]# cat
hello
hello

标准输出
[root@yuchao-linux01 ~]# ls /opt/
HelloWorld.class  HelloWorld.java  jdk  jdk1.8.0_221  jdk-8u221-linux-x64.tar.gz  passwd

标准错误输出
[root@yuchao-linux01 ~]# ls /opppp > stderr.txt
ls: cannot access /opppp: No such file or directory

输出重定向

输出重定向是指把命令(或可执行程序)的标准输出标准错误输出重新定向到指定文件中。

这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。

使用 “ > ”符号,将标准输出重定向到文件中。形式为:命令>文件名
使用“ >> ”符号,将标准输出结果追加到指定文件后面。形式为:命令>>文件名
使用“ 2> ”符号,将标准错误输出重定向到文件中。形式为:命令 2> 文件名
使用“ 2>> ”符号,将标准错误输出追加到指定文件后面。形式为:命令 2>>文件名
使用“ 2>&1 ”符号或“ &> ”符号,将把标准错误输出stderr重定向到标准输出stdout
使用“ >/dev/null ”符号,将命令执行结果重定向到空设备中,也就是不显示任何信息。

2>&1 解释

将stderr重定向到stdout,就可以防止程序运行出错,导致程序异常
写法1
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' &>> test.log
写法2
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' >> test.log 2>&1    (写法2使用的人更多)

黑洞文件,空设备文件,也同样遵循,stdout、stderr的语法
[root@yuchao-tx-server ~]# echo '超哥带你学linux' &>>  /dev/null
[root@yuchao-tx-server ~]# echhhhho '超哥带你学linux' &>>  /dev/null

CPU压力测试

查看cpu信息

查看有几颗cpu:
cat /proc/cpuinfo |grep 'core id'|uniq |wc -l
查看cpu核数:
lscpu |grep -i '^cpu(s)'或者输入top按下数字1,查看几核

如何理解uptime看到的负载

分别是1、5、15分钟内的平均负载情况,表示是1~15分钟内CPU的负载变化情况。
1. 三个值如果差不多,表示系统很稳定的运行中,15分钟以内,CPU都没有很忙
2. 如果1分钟内的值,远大于15分钟的值,表示机器在1分钟内压力在直线上升
3. 如果1分钟内的值,小于15分钟的值,表示系统的负载正在下降中

测试cpu

1.安装stress工具
yum install stress -y
2.测试cpu
stress --cpu 4 --timeout 600
启动4个进程持续占用cpu

free查看内存使用情况

命令:free

作用:查看内存使用情况

选项:

-m 表示以mb为单位查看(1g = 1024mb,1mb = 1024kb)

-h 以可读形式显示容量,需要free -V显示版本大于3.3
free 命令主要是用来查看内存和 swap 分区的使用情况的,其中:

total:是指物理内存总大小,信息来自于/proc/meminfo
used:是指已经使用的内存,userd=total-free-buffers-cache
free:是指空闲的;free = total - used - buff - cache
shared:是指共享的内存;用于tmpfs系统
buff/cache
buffers:缓冲区,给写入数据加速的,用于内存和磁盘之间的数据写入缓冲,存放内存需要写入到磁盘的数据。
cached:缓存区,给读取数据时加速的,加快CPU和内存数据交换,存放内存已经读取完毕的数据。
关于第二行的swap,现状是完全关掉这个功能的。

第2行数据是Swap交换分区,也就是我们通常所说的虚拟内存(硬件交换分区)。

防止内存用完导致系统崩溃,临时拿硬盘的一些空间当做内存使。

磁盘管理

df 查看磁盘信息

作用:查看磁盘的空间(disk free)

选项:-h表示可读性较高的形式展示大小
Filesystem 磁盘名称(文件系统名称)
Size 总大小,总容量
Used 已经使用的容量
Avail 剩余可用容量
Use% 使用百分比
Mounted on 挂载路径(相当于Windows 的磁盘符)(访问挂载点即可访问到该设备的数据)

磁盘io监控(iotop)

1.安装iotop
[root@yuchao-linux01 ~]# yum install iotop -y

2.常用命令参数
-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户。
-k 以kB单位显示读写数据信息

3.常用快捷键
左右箭头:改变排序方式,默认是按IO排序。
r:改变排序顺序。
o:只显示有IO输出的进程。

p:进程/线程的显示方式的切换,切换pid、tid

a:显示累积使用量
q:退出。

实践
1.显示默认信息
[root@yuchao-linux01 ~]# iotop

2.以kb单位显示io进程
[root@yuchao-linux01 ~]#  iotop -k

网络协议

image

TCP

image

UDP

image

netstat查看进程网络访问

命令:netstat

作用:查看网络连接状态

语法:netstat -tnlp

选项:

-t:表示只列出tcp协议的连接;

-n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示;

-l:表示过滤出"state(状态)"列中其值为LISTEN(监听)的连接;

-p:表示显示发起连接的进程pid 和进程名称;

-u:表示查看udp协议连接(ntpd服务)

Protocol:协议(tcp、upd、http、https、icmp、ssh…)
Receive:接收
Send:发送
Local Address:本地地址
Foreign:远程地址
State:状态,LISTEN表示侦听来自远方的TCP端口的连接请求
PID/Program name:进程ID和程序名

ss命令

ss  是类似netstat的工具。能显示查看网络状态信息,包括TCP、UDP连接,端口

并且性能远比netstat强悍,适合用于高并发服务器查看

-a  显示所有网络连接
-l  显示LISTEN状态的连接(连接打开)
-m  显示内存信息(用于tcp_diag)
-n, --numeric       不显示域名,直接显示ip地址
-o  显示Tcp 定时器x
-p  显示进程信息
-s  连接统计

-d  只显示 DCCP信息 (等同于 -A dccp)
-u  只显示udp信息 (等同于 -A udp)
-w 只显示 RAW信息 (等同于 -A raw)
-t 只显示tcp信息 (等同于 -A tcp)
-x 只显示Unix通讯信息 (等同于 -A unix)

-4 只显示 IPV4信息
-6 只显示 IPV6信息
--help 显示帮助信息
--version 显示版本信息

网络流量监控命令iftop

作用和top和iotop一样,动态显示机器上,网卡的流量动态

 yum install iftop -y