大小问题记录

记录遇到的相关问题。

阿里云slb 5xx和4xx波动

现象:

  1. 告警平台发生 slb 5xx 和 4xx 波动告警

排查过程:

  1. 通过 slb 日志过滤,5xx 中主要是 502 占比很高,4xx 中主要是 499 的占比很高,只有一个域名出现此状况
  2. 通过 502 状态码初步判断是后端服务不可用,然后客户端在不断重试,导致 499 状态码的请求增多
  3. 根据域名和 slb 的监听定位后端服务,检查最底层后端服务,发现 nginx error log 中提示 upstream 无法连接
  4. upstream 的后端是 php 的服务,查看运行状态正常,服务没有挂掉
  5. 判断是服务处理不过来,可能是配置的线程数可能太少,影响了服务的处理能力
  6. 检查配置文件,发现 pm.max_children 配置仅有 5
  7. 提升 pm.max_children 值到 10 倍到 50,重启 php-fpm
  8. 观察 nginx error log,发现错误已恢复

后续:

  1. 仅配置 pm.max_children 并不是一个合理的做法,同时还需要调整 pm.start_servers, pm.min_spare_servers, pm.max_spare_server
    pm.start_servers(初始进程值) 一般是 max_children 值的 20%
    pm.min_spare_servers(至少保持空闲的进程值) 一般是 pm.start_servers 的 50%
    pm.max_spare_servers(最大保持空闲值) 一般是 pm.start_servers 的 2 倍
  2. 需要注意的是,pm.max_children 需要根据服务器的资源情况来决定

总结:

  1. 需要根据请求量来评估中间件中关键的参数配置,避免配置过低导致问题
  2. 架构太过繁琐,接了快 3 层 Nginx,太过重复

Java服务被k8s不断重启问题记录

现象:

  1. 告警发现服务的 Deployment available 值和配置的不匹配
  2. 查看服务,发现服务被重启了多次,并且遗留了很多 Error 状态的 Pod

排查过程:

  1. 查看 Error 状态 Pod 的详细信息 kubectl describe pod xxx
    发现 Pod 是因为节点磁盘不够导致被驱逐了
  2. 进入正在运行的 Pod 中,发现应用目录下很多内存 Dump 文件,观察一段时间,发现数量还在持续增加,进而使磁盘使用率不断升高,导致被驱逐
  3. 查看服务的 JVM 参数,发现配置了 -XX:+HeapDumpBeforeFullGC
    正是此参数导致 Dump 文件不断产生
  4. 查看监控,发现 FullGC 经常发生
  5. 评估此参数的合理性,去掉重启服务,恢复正常

总结:

  1. 配置自动 Dump 时需要慎重考虑,因为 GC 过程会导致服务中断
  2. 对于需要使用内存 Dump 来排查问题,建议在低峰期手动导出,或者使用
    -XX:HeapDumpOnOutOfMemoryError 参数,仅在发生 OOM 时进行导出,避免频繁自动 Dump ,影响服务正常运行

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注