Skip to main content

润典上线发布检查单 v1.0

一. 测试相关​

  • 检查SonarQube是否有新的代码质量问题。
  • 检查SonarQube中单元测试覆盖率是否达到80%。
  • 检查SonarQube中CVE漏洞扫描结果,是否有高危漏洞。
  • [压测报告中需体现] 检查压测过程产生的链路监控日志中代码执行、数据库操作、缓存操作、网络请求等耗时是否正常(不含外部API调用的接口,在Undertow请求不排队的前提下toC服务接口内网总耗时不得超过:120ms,toB服务接口内网总耗时不得超过:300ms)。
  • [压测报告中需体现] 检查压测过程产生的Redis缓存数据中,是否存在BigKey,BigKey定义:单个key的value大于15K。
  • [压测报告中需体现] 检查压测过程产生的MQ消息是否存在积压情况。
  • [压测报告中需体现] 检查压测过程产生的数据库查询记录中是否存在慢查询。
  • [压测报告中需体现] 被压测服务的JVM内存使用率是否正常,JDK21请通过加载JVM启动参数启用分代ZGC,命令:-XX:+UseZGC -XX:+ZGenerational,压测过程中,请使用JProfiler、ZMC等工具监控实时的JVM内存使用情况和GC情况,需将实时数据截图并体现到压测报告中。

二. 配置数据​

  • 检查Nacos配置中心里面,MySQL相关连接池配置超时时间、最大连接数、最小连接数等是否合理。
  • 检查Nacos配置中心里面,Redis相关连接池配置超时时间、最大连接数、最小连接数等是否合理,在不存在BigKey的情况下,Redis单次查询的耗时不会超过10ms,所以请求超时时长通常不会超过1000ms,请以此为性能指标对项目进行调优。
  • 检查Nacos配置中心里面,MQ相关配置中消费队列的并发连接数是否合理。
  • 检查Nacos配置中心里面,MongoDB相关连接池配置是否合理,不同的服务对连接池配置的需求是不完全一致的,需要根据实际情况进行调整。
  • 检查Nacos配置中心里面,Sentinel的熔断、限流、降级等配置是否合理。

三. 环境检查​

  • 检查K8s环境中,服务的资源限制是否合理,包括CPU、内存等。
  • 检查K8s环境中,服务的Pod数量是否合理,不同的服务对Pod数量的需求是不完全一致的,需要根据实际情况进行调整。
  • 检查自建集群的主机ntp时间是否同步,不同主机之间的时间差不得超过1s,否则会导致集群数据不一致,导致集群主从切换失败。
  • 检查Linux系统是否关闭了SWAP分区,关闭SWAP分区可以避免OOM Killer杀掉进程,导致服务不可用。
  • 检查Linux系统是否关闭了THP,透明巨大页(Transparent Huge Pages, THP)是Linux内核的一项内存管理特性,旨在通过使用更大的页面大小来提高内存访问效率。对于某些工作负载,如数据库和缓存服务(例如Redis),THP可能会导致性能问题,尤其是在高并发场景下,因为它们可能导致内存分配延迟增加,并且在某些情况下会引发不必要的内存碎片。
    • 永久禁用THP
      1. 编辑GRUB配置:
        • 编辑 /etc/default/grub 文件,找到 GRUB_CMDLINE_LINUX 行,在其值中添加 transparent_hugepage=never 参数。
        • 例如:GRUB_CMDLINE_LINUX="... transparent_hugepage=never"
      2. 更新GRUB:
        • 更新GRUB配置以应用更改。对于大多数系统来说,这可以通过运行 sudo update-grub 命令来完成。
      3. 重启系统:
        • 为了使新的内核参数生效,你需要重新启动服务器。
    • 临时禁用THP(无需重启) 如果你不想重启服务器,或者想测试关闭THP的效果,可以使用以下命令临时禁用它:
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
      echo never > /sys/kernel/mm/transparent_hugepage/defrag
      要检查THP的状态,你可以查看 /sys/kernel/mm/transparent_hugepage/enabled 文件的内容。如果看到 [never],则表示THP已经被禁用。
  • 检查Linux系统是否调整文件描述符限制,文件描述符限制过小会导致服务无法正常工作
    • fs.file-max:设置系统范围内所有进程可打开的最大文件句柄数。
    • /etc/security/limits.conf 中的 nofile:设置单个用户或服务进程可以打开的最大文件句柄数。
  • 检查Linux系统是否关闭了SELinux,关闭SELinux可以避免服务因为权限问题导致服务不可用
  • 检查Linux系统是否调整了内核参数-内存交换策略,推荐vm.overcommit_memory设置为1,以确保足够的虚拟内存可以被分配给新进程,这会允许过度提交,但会阻止显式内存不足错误。
  • 检查Linux系统是否调整了内核参数-脏数据刷新策略vm.dirty_ratio和vm.dirty_background_ratio,对于Redis、MongoDB等内存数据库或者任何依赖大量写操作的应用程序,正确设置 vm.dirty_ratio 和 vm.dirty_background_ratio 可以显著影响其性能和可靠性。例如,在高负载环境下,适当提高这两个比率可以让应用程序更好地利用缓存,减少不必要的磁盘 I/O,每当触发写操作时,都会有性能损失,在高峰期时,这种性能损失会更加明显。然而,这样做也增加了数据丢失的风险,因此需要根据实际业务需求权衡利弊。这2个参数在不同发行版Linux版本上,其默认值可能有所不同,因此在调整之前请务必确认当前系统的默认值。
    • vm.dirty_ratio:默认值通常是 20%。这意味着当系统内存中未同步的数据(脏数据)达到总内存的 20% 时,任何进程的写操作都会被阻塞,直到足够的脏数据被写回到磁盘。
    • vm.dirty_background_ratio:默认值通常是 10%。这表示当脏数据的比例超过总内存的 10% 时,内核会启动后台进程(如 pdflush/flush/kdmflush)来开始将脏数据写回磁盘。
  • 检查Linux系统是否调整了内核参数-TCP TIME_WAIT 连接状态管理net.ipv4.tcp_tw_recycle和net.ipv4.tcp_tw_reuse,在高并发场景下,大量的TIME_WAIT连接会导致端口耗尽,服务不可用。net.ipv4.tcp_tw_recycle和net.ipv4.tcp_tw_reuse是两个解决TIME_WAIT连接过多的参数,但是这两个参数在不同的内核版本上可能会有不同的表现,中间件服务器通常都需要应对大并发短链接的场景,所以我们推荐关闭net.ipv4.tcp_tw_recycle,开启net.ipv4.tcp_tw_reuse,这样可以避免TIME_WAIT连接过多导致端口耗尽的问题。
    # 是否启用 TIME_WAIT 回收
    net.ipv4.tcp_tw_recycle = 0 # 如果设置为0,则禁用 TIME_WAIT 回收
    # 是否启用 TIME_WAIT 重用
    net.ipv4.tcp_tw_reuse = 1 # 如果设置为1,则启用 TIME_WAIT 重用
    • net.ipv4.tcp_tw_recycle:这个参数已经被移除在较新的内核版本中(大约从 3.7 版本开始)。当它存在时,它的功能是在特定情况下快速回收 TIME_WAIT 套接字。这可能会导致 NAT(网络地址转换)环境下的问题,因为内核可能会错误地关闭仍然活跃的连接。因此,它被移除以避免潜在的问题。
    • net.ipv4.tcp_tw_reuse:允许将处于 TIME_WAIT 状态的套接字重新用于新的连接,前提是这些套接字已经不包含未确认的数据。这有助于减少服务器资源的消耗,特别是在处理大量短时间内的短连接时(例如 Web 服务器)。启用此选项可以更有效地利用系统资源,但必须谨慎使用,因为它可能会在某些情况下引发问题,比如与某些防火墙或负载均衡器的不兼容。
  • 检查Linux系统是否调整了内核参数-进程限制kernel.pid_max,增大PID的最大值,防止频繁重启导致的PID耗尽。调整方法:
    echo 4194303 > /proc/sys/kernel/pid_max
    echo "kernel.pid_max = 4194303" >> /etc/sysctl.conf
    sysctl -p
  • 检查Linux系统是否调整了网络相关参数 : (以下调整的参数请根据实际情况调整,这里给的默认值可能不适合所有场景)
    • net.core.somaxconn:增大监听队列长度,允许更多的连接等待被应用程序接受。调整方法:

      echo 1024 > /proc/sys/net/core/somaxconn
      echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
      sysctl -p
    • net.ipv4.tcp_max_syn_backlog:增加SYN队列长度,提高处理TCP连接请求的能力。调整方法:

      echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog
      echo "net.ipv4.tcp_max_syn_backlog = 1024" >> /etc/sysctl.conf
      sysctl -p
    • net.ipv4.tcp_tw_reuse:允许将TIME_WAIT套接字重新用于新的TCP连接,有助于减少短连接场景下的资源占用。调整方法:

      echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
      echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
      sysctl -p
    • net.ipv4.tcp_fin_timeout:缩短FIN-WAIT-2状态的超时时间,加快资源回收。调整方法:

      echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
      echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
      sysctl -p
    • net.ipv4.ip_local_port_range:扩大本地端口范围,以便更多并发连接使用。调整方法:

      echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
      echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf
      sysctl -p
    • net.ipv4.tcp_keepalive_time:减少保持活动连接的时间间隔,更快检测到死连接。调整方法:

      echo 1200 > /proc/sys/net/ipv4/tcp_keepalive_time
      echo "net.ipv4.tcp_keepalive_time = 1200" >> /etc/sysctl.conf
      sysctl -p
    • net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem:调整TCP读写缓冲区大小,以适应大流量数据传输。调整方法:

      echo "4096 16384 4194304" > /proc/sys/net/ipv4/tcp_rmem
      echo "4096 16384 4194304" > /proc/sys/net/ipv4/tcp_wmem
      echo "net.ipv4.tcp_rmem = 4096 16384 4194304" >> /etc/sysctl.conf
      echo "net.ipv4.tcp_wmem = 4096 16384 4194304" >> /etc/sysctl.conf
      sysctl -p