ECS夯住等日常问题排查指南
1、ECS夯住了 排查方法和解决方案
当ECS实例出现“夯住”(hang)的情况,即系统无响应或响应极慢时,需要从操作系统内核、资源使用、存储I/O、网络等多个层面进行排查。
排查方法:
- 系统层面:
- 检查系统负载:使用
top、uptime命令查看load average。如果1分钟、5分钟、15分钟的平均负载远高于CPU核心数,说明系统过载 。 - 检查CPU使用率:在
top命令中,观察%us(用户空间)、%sy(内核空间)、%wa(等待I/O)的占比。如果%wa过高,说明存在I/O瓶颈;如果%sy过高,可能是内核态进程占用过多资源。 - 检查内存使用:使用
free -h命令。关注available列,如果可用内存极少,系统可能在进行频繁的内存交换(swap),这会导致性能急剧下降。 - 检查磁盘I/O:使用
iostat -x 1命令。关注%util(设备利用率)和await(平均I/O等待时间)。如果%util持续接近100%且await很高,说明磁盘是瓶颈。 - 检查网络连接:使用
netstat -antp | grep ESTABLISHED | wc -l查看连接数,或使用ss -s查看统计。连接数过多或存在大量TIME_WAIT连接可能导致端口耗尽或资源占用过高。
- 检查系统负载:使用
- 进程层面:
- 定位问题进程:使用
top或ps aux --sort=-%cpu/ps aux --sort=-%mem找出消耗CPU或内存最高的进程。 - 分析进程状态:使用
ps aux | grep <PID>查看进程状态(STAT列)。D状态(不可中断睡眠)通常意味着进程在等待I/O,可能是磁盘或网络问题。
- 定位问题进程:使用
- 日志层面:
- 检查系统日志:
dmesg -T | tail -50查看最新的内核日志,寻找OOM(内存溢出)、硬件错误、文件系统错误等信息。 - 检查应用日志:定位到具体应用后,检查其日志文件,如
/var/log/messages、/var/log/syslog或应用自身的日志目录。
- 检查系统日志:
解决方案:
- 临时恢复:
- 终止问题进程:如果找到导致夯住的进程,尝试使用
kill -9 <PID>强制终止。 - 重启服务:重启占用资源过高的服务。
- 重启实例:如果无法定位或终止进程,可通过阿里云控制台或API重启ECS实例,这是最直接但非根治的方法。
- 终止问题进程:如果找到导致夯住的进程,尝试使用
- 根本解决:
- 资源扩容:如果长期负载过高,应考虑升级ECS实例规格(增加vCPU和内存)。
- 优化应用:分析并优化高资源消耗的应用代码或配置。
- 存储优化:如果I/O是瓶颈,考虑升级云盘类型(如从高效云盘升级为SSD云盘)或使用性能更好的存储方案。
- 内核参数调优:根据业务类型,调整如
net.ipv4.tcp_max_tw_buckets(TIME_WAIT连接数)、vm.swappiness(交换倾向)等内核参数。
2、pod的亲和性和反亲和性在k8s中的实际应用
Pod的亲和性(Affinity)与反亲和性(Anti-affinity)是Kubernetes调度的高级规则,用于控制Pod被调度到哪些节点上,或与其他Pod的部署关系。
核心概念:
- 节点亲和性(Node Affinity):基于节点标签(如
zone,instance-type,gpu)来吸引Pod调度到特定节点。 - Pod亲和性(Pod Affinity):基于已运行Pod的标签,吸引Pod调度到与这些Pod“在一起”的节点上。
- Pod反亲和性(Pod Anti-affinity):基于已运行Pod的标签,排斥Pod调度到与这些Pod“在一起”的节点上。
实际应用场景:
| 场景类型 | 目的 | 配置示例(YAML片段) |
|---|---|---|
| 高可用部署 | 将同一服务的多个Pod实例分散到不同的故障域(如节点、可用区),避免单点故障。 | 使用 Pod反亲和性,要求同一服务的Pod不要调度到同一节点。 |
| 亲密性部署 | 使需要频繁通信或共享本地存储的Pod(如Web服务器与缓存)部署在同一节点,降低网络延迟。 | 使用 Pod亲和性,基于对方Pod的标签进行调度。 |
| 硬件专享 | 将需要GPU或特定CPU型号的应用调度到拥有相应硬件的节点。 | 使用 节点亲和性,匹配节点的 node-type: gpu 等标签。 |
| 租户/环境隔离 | 将生产环境和测试环境的Pod强制调度到不同的节点集。 | 使用 节点亲和性 和 节点选择器(nodeSelector) 结合。 |
| 避免资源竞争 | 避免多个高计算或高I/O的Pod挤在同一节点,导致相互干扰。 | 使用 Pod反亲和性,基于资源类型标签进行排斥。 |
示例YAML(Pod反亲和性实现高可用):
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web-app
spec:
replicas: 3
selector:
matchLabels:
app: my-web
template:
metadata:
labels:
app: my-web
spec:
affinity:
podAntiAffinity: # 使用Pod反亲和性确保Pod分散
requiredDuringSchedulingIgnoredDuringExecution: # 硬性要求
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-web
topologyKey: kubernetes.io/hostname # 拓扑域为节点主机名,即不能在同一节点
containers:
- name: web
image: nginx:latest
注释:此配置确保标签为 app: my-web 的Pod不会被调度到同一个节点(topologyKey: kubernetes.io/hostname)上,从而实现实例级别的高可用 。
3、用户从互联网访问k8s应用后端流量走向
用户从互联网访问一个典型的、通过Ingress暴露的Kubernetes应用,其流量走向是一个清晰的链式过程。下图清晰地展示了这一完整路径:
各环节详解:
-
负载均衡器 (SLB/ALB/NLB):
- 用户通过域名发起请求,DNS解析到云服务商提供的负载均衡器(在阿里云可能是SLB)的公网IP。
- 负载均衡器是流量的入口,负责接收所有外部HTTP/HTTPS流量。
-
Ingress Controller:
- 负载均衡器根据预先配置的监听规则(通常指向Kubernetes集群中所有或部分Node节点的某个NodePort),将流量转发到运行在集群内的 Ingress Controller Pod(如Nginx Ingress Controller、ALB Ingress Controller)。
- Ingress Controller 是一个常驻的Pod,它监听Kubernetes API,动态感知Ingress资源的变化。
-
Ingress 资源:
- Ingress Controller 读取用户定义的 Ingress 资源(一个K8s API对象)。该资源定义了具体的路由规则,例如将
www.example.com的流量路由到后端名为my-service的Service 。 - Ingress Controller 根据这些规则,动态更新自己的负载均衡配置(如Nginx的
nginx.conf)。
- Ingress Controller 读取用户定义的 Ingress 资源(一个K8s API对象)。该资源定义了具体的路由规则,例如将
-
Service:
- Ingress Controller 根据路由规则,将流量转发到对应的 Service(通常是ClusterIP类型)。Service是Kubernetes内部的服务发现和负载均衡抽象,它通过
selector选择一组具有特定标签的Pod 。 - Service 有一个虚拟IP(ClusterIP),在集群内可达。但Ingress Controller通常直接通过Service的名称进行解析和转发。
- Ingress Controller 根据路由规则,将流量转发到对应的 Service(通常是ClusterIP类型)。Service是Kubernetes内部的服务发现和负载均衡抽象,它通过
-
Pod:
- Service 通过
kube-proxy组件维护的iptables或IPVS规则,将到达ClusterIP的流量负载均衡到后端一个健康的Pod(Endpoint)上 。 - 最终,请求到达目标业务Pod,由Pod内的容器处理请求并返回响应,响应沿原路返回给用户。
- Service 通过
关键点:
- 会话保持:若需要会话保持(Session Affinity),可以在Ingress注解(如
nginx.ingress.kubernetes.io/affinity: "cookie")或Service的spec.sessionAffinity: ClientIP字段进行配置,确保同一用户请求落到同一后端Pod 。 - 网络模型:整个过程中,流量穿越了集群网络(如Flannel、Calico等CNI插件提供的Overlay或Underlay网络),确保了Pod间跨节点通信的透明性 。
4、物理机装系统的方法 黑屏操作步骤
这里以使用U盘安装CentOS 7为例,描述在物理服务器“黑屏”(命令行界面)下的主要操作步骤。
前期准备:
- 下载CentOS 7 ISO镜像文件。
- 使用工具(如
dd命令或Rufus)将ISO镜像写入U盘,制作可启动安装介质。 - 将U盘插入服务器,接通服务器电源和显示器。
黑屏安装步骤:
- 进入BIOS/UEFI设置:开机后,根据提示按特定键(如F2、F10、DEL、ESC)进入BIOS/UEFI设置界面。
- 修改启动顺序:
- 在“Boot”或“启动”菜单中,将 “USB HDD” 或你的U盘设备调整到启动顺序的第一位。
- 保存设置并退出(通常按F10),服务器将重启并从U盘启动。
- 启动安装程序:
- 重启后,会进入CentOS安装引导界面。通常直接按
Enter键开始图形化或文本安装。如果屏幕无显示,可以尝试在引导界面输入linux text后回车,进入文本安装模式。
- 重启后,会进入CentOS安装引导界面。通常直接按
- 选择安装语言和键盘:使用键盘方向键选择语言(如中文)和键盘布局(如美国英语式),然后按
Tab键切换到“继续”,回车。 - 配置安装源:在“安装位置”界面,选择要安装操作系统的磁盘。这是关键步骤,需谨慎选择以免误删数据。
- 选择“我要配置分区”,点击“完成”进入手动分区。
- 常见分区方案(以200G磁盘为例):
/boot:1G (标准分区, ext4)swap:物理内存的1-2倍,例如16G (标准分区, swap)/:剩余所有空间 (LVM, xfs)
- 创建分区后,点击“完成”并接受更改。
- 开始安装:分区完成后,返回主界面,点击“开始安装”。
- 设置root密码和创建用户:
- 在安装过程中,设置 root用户的密码。
- 可以同时创建一个普通用户,并可选地将其设为管理员。
- 等待安装完成:安装进程会自动进行。完成后,提示“重启”。
- 首次启动配置:重启后,拔出U盘。系统首次启动会进行一些初始化设置,同意许可协议,完成即可进入登录界面。使用第7步设置的用户名密码登录。
5、raid 阵列的几种方法 以及对应的原理效果
RAID(独立磁盘冗余阵列)通过将多个物理磁盘组合起来,实现性能提升、容量增大或数据冗余。
常见RAID级别对比:
| RAID级别 | 最少磁盘数 | 原理简述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| RAID 0 | 2 | 条带化。数据被分割成块,交替写入多个磁盘。 | 读写性能最高,容量利用率100%(总容量为各磁盘之和)。 | 无冗余,任何一块磁盘损坏将导致所有数据丢失。 | 对性能要求极高、数据可临时或可再生的场景,如视频编辑缓存、科学计算临时存储。 |
| RAID 1 | 2 | 镜像。相同的数据同时写入两块磁盘。 | 数据安全性高,读性能有提升。允许损坏任意一块磁盘。 | 容量利用率低(仅50%),写性能无提升。成本高。 | 对数据安全性要求极高、容量需求不大的场景,如操作系统盘、数据库日志文件。 |
| RAID 5 | 3 | 条带化+分布式奇偶校验。数据与校验信息(Parity)交替存储在所有磁盘上。 | 兼顾性能、容量和安全性。读性能好,允许损坏任意一块磁盘。容量利用率为 (N-1)/N。 | 写性能较差(需计算校验位)。重建阵列时对剩余磁盘压力大。 | 适用于读多写少、对成本和性能有平衡要求的场景,如文件服务器、中小型数据库。 |
| RAID 6 | 4 | 条带化+双分布式奇偶校验。类似RAID 5,但有两份独立的校验信息。 | 允许同时损坏两块磁盘,数据安全性更高。 | 写性能比RAID 5更差,容量利用率更低 (N-2)/N。成本更高。 | 对数据安全性要求极高、允许较大容量损失的场景,如关键业务归档、大型存储阵列。 |
| RAID 10 (1+0) | 4 | 先镜像,后条带。先将磁盘两两组成RAID 1镜像对,再将多个镜像对组成RAID 0条带。 | 兼具高读写性能和高可靠性。读性能优秀,写性能良好。允许每个镜像对中坏一块磁盘。 | 成本最高,容量利用率仅为50%。 | 对性能和可靠性要求都极高的核心业务,如数据库、虚拟化平台、高交易网站。 |
原理与效果补充:
- 校验位(Parity):RAID 5/6 中用于数据恢复的冗余信息。当一块磁盘失效时,可以通过剩余磁盘上的数据和校验位计算出丢失的数据。
- 重建(Rebuild):冗余阵列中某块磁盘故障更换后,系统利用冗余数据在新盘上恢复数据的过程。期间阵列性能下降,且存在另一块磁盘也故障的风险(尤其是RAID 5)。
- 热备盘(Hot Spare):预先安装在阵列中但不使用的磁盘。当阵列中某块磁盘故障时,控制器会自动使用热备盘进行重建,缩短系统脆弱期。
参考来源
- 项目组k8s使用问题处理记录
- 什么是Kubernetes(K8s)?
- 【k8s】kubernetes网络
- K8S的loadbalancer类型service的AI问答(豆包)
- 一篇文章教会你使用kubernetes的基本使用
- 超详细,阿里内部都在用的K8S实战手册,看这一篇就够了
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)