优化措施
- 代码层面优化:
- 减少内存分配:避免在循环等高频执行的代码块中频繁创建对象,尽可能复用已有的对象。例如,在处理字符串拼接时,使用
StringBuilder
类(Ruby 中类似 StringIO
)而不是简单的 +
操作符,因为 +
操作符每次都会创建新的字符串对象。
- 优化数据库查询:
- 使用连接池:在高并发场景下,频繁创建和销毁数据库连接开销很大。使用数据库连接池(如
ActiveRecord::Base.connection_pool
)可以复用连接,减少连接建立的时间和资源消耗。
- 优化查询语句:分析查询语句,添加合适的索引。例如,对于
WHERE
子句中经常使用的字段创建索引,以加快查询速度。
- 异步处理:将一些非关键的任务(如发送邮件、生成报表等)放到后台异步处理。可以使用如
Sidekiq
这样的工具,将任务推送到队列中,由后台工作线程进行处理,避免阻塞主线程,提高应用的响应速度。
- 容器层面优化:
- 选择合适的基础镜像:选择轻量级的基础镜像,如
alpine
镜像。alpine
镜像体积小,启动速度快,减少了容器启动和传输的时间。
- 分层构建:在 Dockerfile 中,按照文件变更频率分层构建镜像。例如,将
Gemfile
和 Gemfile.lock
放在前面安装依赖,因为这些文件变更相对较少,后续代码更新时可以复用之前构建的层,减少镜像构建时间。
- 使用多阶段构建:将构建过程分为多个阶段,例如先在一个阶段安装编译工具和依赖进行项目编译,然后在另一个阶段只保留运行时所需的文件和依赖,减小最终镜像体积。
容器资源配置
- CPU 资源配置:
- 设置 CPU 配额:通过
--cpus
选项来设置容器可用的 CPU 核心数。例如,如果应用需要 2 个 CPU 核心,可以在启动容器时使用 docker run --cpus="2" your_image
。在 Kubernetes 中,可以在 Pod 的 resources
字段中设置 limits.cpu
和 requests.cpu
,如:
apiVersion: v1
kind: Pod
metadata:
name: your - pod - name
spec:
containers:
- name: your - container - name
image: your_image
resources:
requests:
cpu: "2"
limits:
cpu: "2"
- CPU 亲和性:在 Kubernetes 环境中,可以使用 CPU 亲和性来指定容器运行在特定的节点上,这些节点具有满足应用需求的 CPU 资源特性。例如,对于对 CPU 性能要求较高的应用,可以将其调度到 CPU 性能更好的节点上。
- 内存资源配置:
- 设置内存限制:使用
--memory
选项设置容器的内存限制。例如,docker run --memory="4g" your_image
表示容器最多使用 4GB 内存。在 Kubernetes 中,同样在 resources
字段设置 limits.memory
和 requests.memory
,如:
apiVersion: v1
kind: Pod
metadata:
name: your - pod - name
spec:
containers:
- name: your - container - name
image: your_image
resources:
requests:
memory: "4Gi"
limits:
memory: "4Gi"
- 内存交换配置:根据应用需求,合理配置内存交换(swap)。虽然过度依赖交换可能会降低性能,但在某些情况下,适当的交换空间可以在内存紧张时避免容器被 OOM(Out - Of - Memory)杀死。可以通过调整宿主机的
swappiness
参数(范围 0 - 100)来控制内存数据交换到磁盘的倾向,例如 echo 10 | sudo tee /proc/sys/vm/swappiness
可以将 swappiness
设置为 10。
监控和调整配置
- 监控工具:
- Prometheus + Grafana:
- Prometheus:用于收集容器的各种指标,如 CPU 使用率、内存使用率、网络流量等。可以通过在容器中运行 Prometheus 客户端(如
node - exporter
收集宿主机指标,cadvisor
收集容器指标),将指标数据发送到 Prometheus 服务器。
- Grafana:与 Prometheus 集成,用于可视化监控数据。可以创建各种仪表盘,直观展示应用的性能指标,如 CPU 和内存使用情况随时间的变化曲线等。
- Kubernetes 自带监控:Kubernetes 提供了
kubectl top
命令,可以实时查看 Pod 和节点的 CPU 和内存使用情况。例如,kubectl top pods
可以查看所有 Pod 的资源使用情况。
- 调整配置:
- 基于指标调整资源:如果监控发现 CPU 使用率长期接近或超过设置的限制,说明可能需要增加 CPU 配额。例如,通过修改 Kubernetes Pod 的
limits.cpu
和 requests.cpu
字段,然后重新部署 Pod。同样,如果内存使用率持续过高,接近或达到内存限制,可能需要增加内存配置。
- 动态调整:在 Kubernetes 中,可以使用 Horizontal Pod Autoscaler(HPA)根据 CPU 或内存等指标动态调整 Pod 的副本数量。例如,设置当 CPU 使用率超过 80% 时,自动增加 Pod 副本;当 CPU 使用率低于 50% 时,自动减少 Pod 副本,以适应不同的负载情况,提高资源利用率。可以通过
kubectl autoscale
命令来创建 HPA,如 kubectl autoscale deployment your - deployment - name --cpu - percent=80 --min=1 --max=10
表示根据 CPU 使用率自动调整 your - deployment - name
的副本数量,最小 1 个,最大 10 个。