今日主题
Linux 资源排查:CPU、内存、磁盘、系统负载
今日目标
今天学完你要能做到:
1. 会查看磁盘空间
2. 会查看目录大小
3. 会查看内存使用情况
4. 会查看 CPU 占用
5. 会看系统负载(load average)
6. 能初步判断服务器为什么“卡”
今天最重要的一句话:
服务器卡,不一定是 CPU 问题,也可能是内存、磁盘、IO 或负载问题。
一、磁盘空间:df
先敲:
df -h
df = disk filesystem
作用:
查看磁盘还剩多少空间
-h = human readable(人类可读)
会显示成:
10G
200M
1.5T
而不是一长串字节数字。
你会看到类似:
Filesystem Size Used Avail Use%
/dev/sda1 40G 18G 20G 48%
重点看:
Size 总大小
Used 已使用
Avail 剩余
Use% 使用率
怎么判断危险?
<70% 正常
70~85% 注意
85~95% 危险
>95% 非常危险
100% 爆了
磁盘满了会发生:
日志写不进去
MySQL 写不进去
Docker 拉不了镜像
服务启动失败
系统卡顿
二、目录大小:du
如果磁盘满了,要找谁占空间。
查看当前目录大小:
du -sh .
查看某目录大小:
du -sh /var/log
查看每个子目录大小:
du -sh *
例如:
2G logs/
500M mysql/
50M nginx/
你就知道:
logs 目录太大了。
常见大户
通常这些目录容易变大:
/var/log
/var/lib/docker
/tmp
/home
/data
以后 Docker 用多了:
/var/lib/docker
经常很大。
三、内存:free
查看内存:
free -h
你会看到:
total
used
free
shared
buff/cache
available
重点先看:
total 总内存
used 已使用
free 空闲
available 真正可用
例如:
8G total
6G used
500M free
2G available
这不一定危险,因为 Linux 会拿内存做缓存。
真正重点看:
available
内存不足会怎样?
系统卡
程序被杀
Docker 容器退出
MySQL 崩
服务响应慢
严重时会 OOM:
Out Of Memory(内存不够)
四、CPU:top
昨天学过:
top
重点看顶部:
Cpu(s)
Mem
load average
CPU 常见指标:
us = 用户程序占用
sy = 系统内核占用
id = 空闲
wa = 等待 IO
重点看:
id(idle)空闲率
比如:
id = 80%
说明:
CPU 很闲。
如果:
id = 2%
说明:
CPU 快满了。
查谁最吃 CPU
进入:
top
按:
Shift + P
按 CPU 排序。
就能看到谁最占 CPU。
五、系统负载:uptime
敲:
uptime
会看到:
load average: 0.20, 0.50, 0.80
分别代表:
1分钟平均负载
5分钟平均负载
15分钟平均负载
怎么理解负载?
假设:
服务器 4 核 CPU
那么:
load = 4
表示:
CPU 刚好忙满。
如果:
load = 8
表示:
任务排队了,机器吃紧。
如果:
load = 20
表示:
服务器可能已经非常卡。
简单判断
如果是 2 核机器:
load < 1 正常
1~2 忙
>2 开始排队
>4 很危险
如果是 4 核:
load < 2 正常
2~4 偏忙
>4 注意
>8 危险
六、一条命令看资源总览
这个非常常用:
top
你会同时看到:
CPU
内存
负载
进程
所以服务器卡了:
第一反应:
top
七、今天的小实验
你今天按顺序敲:
df -h
du -sh ~
free -h
uptime
top
退出:
q
然后:
du -sh /var/log
看看日志目录大小。
如果有 Docker:
du -sh /var/lib/docker
看看 Docker 占多少。
八、以后服务器卡怎么排查
记住这个顺序:
1 看 CPU
top
2 看内存
free -h
3 看负载
uptime
4 看磁盘
df -h
5 找大目录
du -sh *
常见情况 1:CPU 高
表现:
CPU 95%
原因可能:
死循环
程序 bug
流量太大
挖矿木马
常见情况 2:内存高
表现:
available 很低
原因:
程序泄漏
MySQL 太吃内存
Redis 太吃内存
Docker 太多
常见情况 3:磁盘满
表现:
Use% = 100%
原因:
日志爆了
Docker 镜像太多
备份文件太多
常见情况 4:负载高
表现:
load average 很高
原因:
CPU 忙
磁盘 IO 慢
任务排队
九、今日面试表达
今天你要会说:
服务器性能排查时,我一般先通过 top 看 CPU、内存和负载,再通过 free -h 查看可用内存,通过 df -h 查看磁盘空间,通过 du -sh 排查大目录。如果 CPU 高,我会找高占用进程;如果内存不足,我会关注 available;如果磁盘满,我会优先清理日志、缓存或无用镜像;如果负载高,我会进一步分析 CPU 或 IO 是否成为瓶颈。
十、今日复盘模板
# Code 4 云计算复盘 Day 5
## 今日主题
Linux 资源排查:CPU、内存、磁盘、系统负载
## 今日完成的命令
df -h
du -sh
free -h
uptime
top
## 今天理解了什么?
今天理解了服务器卡不一定是 CPU 问题,也可能是内存、磁盘或负载问题。
## 今日面试表达
排查服务器性能问题时,可以从 CPU、内存、磁盘和负载四个方向入手。
反向代理 + 负载均衡,几乎就是:
Nginx
云计算
后端部署
高并发架构
Kubernetes Service / Ingress
微服务网关
这些东西的底层思想。
如果这一块你真的吃透,你以后学:
Docker
K8s
Gateway
Istio
云原生
CDN
都会顺很多。
我给你按照 「大学生能真正理解」+「能拿去面试回答」 的方式细细讲。
第一部分:什么是代理(先建立世界观)
先理解 代理。
现实里:
比如你想租房,你不直接找房东,而是找中介。
流程:
你
↓
中介
↓
房东
↓
拿到房子
这里:
中介 = 代理。
计算机里也一样:
比如浏览器访问网站:
正常:
浏览器 → 网站服务器
如果中间多一个代理:
浏览器 → 代理服务器 → 网站服务器
这就叫:
代理
为什么要代理?
因为代理可以帮你做很多事:
转发请求
缓存内容
隐藏真实服务器
安全控制
统一入口
负载分发
HTTPS 终止
限流
日志记录
所以大厂都大量使用代理层。
第二部分:正向代理
先说正向代理。
场景
你要访问外网:
正常:
你 → Google
如果通过代理:
你 → Proxy → Google
Google 看到的是 Proxy,不是你。
所以:
代理的是客户端
叫:
正向代理(Forward Proxy)
作用:
隐藏客户端
突破网络限制
缓存资源
统一上网出口
审计
面试一句话:
正向代理代理客户端,服务端不知道真实客户端是谁。
第三部分:反向代理(重点)
这个你以后天天见。
普通访问
浏览器:
用户 → Web服务器
例如:
用户 → Nginx
如果后面有多个服务器:
用户
↓
Nginx
↓
真实服务器
用户只知道 Nginx。
不知道后面是谁。
所以:
代理的是服务端
叫:
反向代理(Reverse Proxy)
一句话:
用户访问代理服务器,代理服务器去访问真实服务。
例子(你的博客)
假设你的 Halo:
监听:
127.0.0.1:8090
外界不能直接访问。
前面放 Nginx:
监听:
80
443
流程:
用户访问域名
↓
DNS解析到服务器IP
↓
进入80/443端口
↓
Nginx接收请求
↓
转发到127.0.0.1:8090
↓
Halo处理
↓
返回页面
↓
Nginx返回给用户
用户看到:
www.xxx.com
不知道后面是:
127.0.0.1:8090
这就是反向代理。
为什么需要反向代理
1)隐藏后端服务器
用户不知道真实机器。
安全。
2)统一入口
统一走:
80
443
后面可以有:
8080
9000
3000
5000
3)HTTPS
SSL 证书放 Nginx。
后端不用配置 HTTPS。
4)缓存静态资源
提高性能。
5)限流
比如:
每秒 1000 请求。
超出限制直接拦。
6)日志
统一记录。
7)负载均衡
这是重点中的重点。
第四部分:负载均衡
先理解:
负载 = 工作压力。
均衡 = 平均分。
所以:
把请求平均分给多台服务器。
没有负载均衡
只有一台:
用户 → Server1
100 万用户全打这一台。
会炸。
有负载均衡
→ Server1
用户 → Nginx → Server2
→ Server3
请求被分散。
每台只承担一部分。
这就是:
Load Balance
为什么需要
扛高并发
10000 QPS:
3 台机器:
每台 3000+。
高可用
Server2 挂了:
自动摘除
请求去:
Server1
Server3
业务继续。
横向扩容
机器不够:
加机器。
3台 → 10台
第五部分:Nginx 怎么做负载均衡
配置:
upstream backend {
server 10.0.0.11:8080;
server 10.0.0.12:8080;
server 10.0.0.13:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
流程:
用户 → Nginx → 三台机器之一
第六部分:负载均衡算法
这是高频面试题。
1)轮询 round robin(默认)
顺序分配:
请求1 → A
请求2 → B
请求3 → C
请求4 → A
循环。
优点:
简单。
缺点:
没考虑机器性能差异。
2)weight 权重
强机器多分。
例如:
server A weight=5;
server B weight=2;
server C weight=1;
比例:
5:2:1
A 分更多。
3)ip_hash
按客户端 IP 固定。
比如你总访问:
都去:
Server2
适合:
Session 粘性。
4)least_conn
给连接数最少的机器。
更智能。
第七部分:什么是 Session 粘性
登录网站:
登录状态存在 Server1。
下一次请求去了 Server2。
Server2 没登录信息。
用户掉线。
解决:
固定用户去同一台。
叫:
Session Sticky
方案:
ip_hash
Redis共享Session
JWT
现在更多用:
JWT。
第八部分:四层和七层负载均衡(大厂高频)
四层 LB
TCP/UDP 层。
只看:
IP
Port
转发。
不看内容。
快。
例如:
F5 Networks F5、HAProxy HAProxy、云厂商 SLB。
七层 LB
HTTP 层。
能看:
URL
Header
Cookie
Host
可以智能转发:
/api → Java
/static → CDN
/admin → 管理后台
Nginx Nginx 就是七层负载均衡典型。
第九部分:大厂面试题(高频)
题 1:什么是反向代理?
标准回答:
反向代理是代理服务端的一种代理模式,客户端访问代理服务器,由代理服务器转发请求到后端真实服务器,再将响应返回给客户端。客户端不知道真实服务节点,只知道代理入口。
题 2:反向代理有什么作用?
答:
隐藏后端
统一入口
SSL终止
缓存
限流
日志
负载均衡
安全防护
题 3:什么是负载均衡?
答:
将请求分发到多台服务器,均衡各节点压力,提高系统吞吐、高可用和扩展性。
题 4:常见算法?
答:
轮询
加权轮询
ip_hash
least_conn
题 5:四层和七层区别?
答:
四层:
TCP/UDP
速度快
功能简单
七层:
HTTP/HTTPS
能做智能路由
功能强
题 6:Nginx 挂了怎么办?
答:
高可用:
Keepalived + 双Nginx
VIP漂移
比如用 Keepalived Keepalived。
题 7:为什么大厂不用单机 Nginx?
因为:
单点故障。
必须:
双机热备
集群
云LB
题 8:K8s Service 为什么也是负载均衡?
因为它会:
把流量分给多个 Pod
本质一样。
你把这一章吃透,你对 Nginx / K8s / Gateway 的理解会直接上一个台阶。