点击题目展开标准答案 · Linux / Docker / K8s / MySQL / Redis
# 第一步:看整体负载和 CPU 使用率 top -bn1 | head -20 # 第二步:看是 CPU 密集还是 IO 密集 # us 高 → CPU 密集;wa 高 → IO 等待 iostat -x 1 3 # 第三步:找出占用最高的进程 ps aux --sort=-%cpu | head -10 ps aux --sort=-%mem | head -10 # 第四步:定位具体线程(拿到 pid 后) top -Hp <pid> # 看线程级别 strace -p <pid> # 看系统调用 # 第五步:查磁盘 IO iotop -o # 找 IO 高的进程 df -h && du -sh /* # 看磁盘空间
三次握手:Client SYN → Server SYN+ACK → Client ACK(建立连接)
四次挥手:Client FIN → Server ACK → Server FIN → Client ACK(断开连接)
# 查看大量 TIME_WAIT(高并发短连接场景常见)
ss -ant | awk '{print $1}' | sort | uniq -c
# 调整内核参数加速复用(生产谨慎)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # 不推荐,NAT 环境有坑
# OverlayFS 分层:镜像层只读,容器层可写 # 查看挂载 mount | grep overlay # 容器里的改动只在 upperdir,不影响镜像 ls /var/lib/docker/overlay2/
# 看 Nginx 错误日志(最直接) tail -f /var/log/nginx/error.log # 502 排查:后端服务是否存活 systemctl status php-fpm # PHP 场景 curl -I http://127.0.0.1:9000 # 直接测后端端口 # 504 排查:调大超时参数(临时验证) # nginx.conf 里加: proxy_read_timeout 120s; # 等待后端响应的超时 proxy_connect_timeout 10s; # 连接后端的超时
-- 在从库执行,看关键字段 SHOW SLAVE STATUS\G -- 重点看: -- Seconds_Behind_Master: 42 ← 延迟秒数,0 为正常 -- Slave_IO_Running: Yes -- Slave_SQL_Running: Yes -- Last_Error: 有报错说明 SQL 线程卡了
# my.cnf 开启并行复制 slave_parallel_workers = 4 # 4个并行线程 slave_parallel_type = LOGICAL_CLOCK
# 第一步:看 Events(最重要) kubectl describe pod <pod-name> -n <ns> # 重点看最下面的 Events 段 # 第二步:常见 Pending 原因分类 # 1. 资源不足 # Events: 0/3 nodes are available: 3 Insufficient cpu kubectl top nodes # 2. 节点有污点,Pod 没有容忍 # Events: node(s) had untolerated taint kubectl describe nodes | grep Taints # 3. PVC 未绑定,等待存储 kubectl get pvc -n <ns> # 4. 镜像拉取问题(会从 Pending 变 ImagePullBackOff) kubectl get events --sort-by='.lastTimestamp'
describe pod 的 Events → 找 FailedSchedulingReason 字段:资源不足 / 亲和性冲突 / 污点不容忍 / PVC 未绑定代码提交 → 触发构建 → 代码检查 → 单元测试 → 构建镜像 → 推送镜像仓库 → 部署到 K8s → 通知结果
pipeline {
agent any
stages {
stage('拉代码') {
steps { git url: 'git@github.com:...', branch: 'main' }
}
stage('构建镜像') {
steps {
sh 'docker build -t harbor.xx.com/app:${BUILD_NUMBER} .'
sh 'docker push harbor.xx.com/app:${BUILD_NUMBER}'
}
}
stage('部署 K8s') {
steps {
// 替换 yaml 里的镜像 tag 再 apply
sh 'sed -i "s/IMAGE_TAG/${BUILD_NUMBER}/" deploy.yaml'
sh 'kubectl apply -f deploy.yaml'
}
}
}
post {
failure { sh '发送钉钉告警' }
}
}
采集层:node_exporter(主机)/ cAdvisor(容器)/ mysqld_exporter / 自定义 exporter
存储层:Prometheus Server(本地TSDB)
告警层:Alertmanager(分组、抑制、路由到钉钉/邮件)
展示层:Grafana(导入社区 Dashboard)
# rules/node_alert.yml
groups:
- name: node_alerts
rules:
- alert: HighCpuUsage
# CPU 使用率超过 80% 持续 2 分钟触发
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} CPU 使用率过高"
description: "当前值: {{ $value }}%"
# 按 severity 路由到不同接收器
route:
receiver: 'default'
routes:
- match:
severity: critical
receiver: 'oncall-dingtalk' # 紧急告警打钉钉
# 观察内存随时间持续增长(不回落) watch -n 5 'free -h && ps aux --sort=-%mem | head -5' # 查看具体进程内存变化 pidstat -r -p <pid> 5 # 每5秒输出一次
top 按 M 排序)jmap -heap <pid> 看堆内存;jstat -gcutil <pid> 看 GCkubectl describe pod# 线上紧急:重启服务(先保留现场) # 先 dump 内存快照(Java) jmap -dump:format=b,file=/tmp/heap.hprof <pid> # 然后重启,恢复服务 systemctl restart <service> # 或 K8s 场景 kubectl rollout restart deployment/<name> # 长期方案:设置容器内存 limit + request,OOM 自动重启 # resources.limits.memory: 512Mi