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:退出
第一行
内 容 |
说 明 |
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 (根据进程名杀死全部匹配的进程,不建议使用)
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
网络协议
TCP
UDP
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