《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1 某客户nginx ingress偶发性出现4xx or 5xx(下)

简介: 《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1. 某客户nginx ingress偶发性出现4xx or 5xx(下)

更多精彩内容,欢迎观看:

《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1 某客户nginx ingress偶发性出现4xx or 5xx(上):https://developer.aliyun.com/article/1221275?spm=a2c6h.13148508.setting.25.15f94f0eKXgo7c


解决办法

int __sys_listen(int fd, int backlog)
{
  struct socket *sock;
  int err, fput_needed;
  int somaxconn;
  sock = sockfd_lookup_light(fd, &err, &fput_needed);
  if (sock) {
    somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
    if ((unsigned int)backlog > somaxconn)
      backlog = somaxconn;
    err = security_socket_listen(sock, backlog);
    if (!err)
      err = sock->ops->listen(sock, backlog);
  }
  return err;
}
int inet_listen(struct socket *sock, int backlog)
{
  struct sock *sk = sock->sk;
  /* Really, if the socket is already in listen state
   * we can only allow the backlog to be adjusted.
   */
  if (old_state != TCP_LISTEN) {
    err = inet_csk_listen_start(sk, backlog);
    if (err)
      goto out;
    tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_LISTEN_CB, 0, NULL);
  }
  sk->sk_max_ack_backlog = backlog;
  err = 0;
out:
  release_sock(sk);
  return err;
}

 

从listen()系统调用可以发现,sk_max_ack_backlog的取值有两个影响因素:

 

listen()调用下发backlog参数

net namespace中somaxconn配置

 

listen()调用是可以反复调用的,而内核则是在传入的backlog参数与somaxconn中取一个更小值生效,所以显而易见,解决问题的方法是将net.core.somaxconn和backlog参数都调整到合适的数值。

 

对于net.core.somaxconn,需要注意的是,由于这个配置已经netns化,通常netns中的配置要比宿主机上的配置要小,默认为4096,一般情况下是足够的,如果需要调整的话,可以通过initContainer方式进行,也可以通过修改SecurityContext方式进行,点击此处参考。



对于backlog参数的调整,则依赖于用户态的配置,常见客户出现问题都是Java和PHP业务,他们常见的解决办法如下:

 

Java业务的Tomcat配置修改

需要修改的参数为org.apache.catalina.connector.Connector的acceptCount参数,按照文档说明,acceptCount的默认数值为100,所以默认Tomcat仅能够在单个LISTEN地址上同时并发100条连接,在云原生场景下很容易出问题。

image.png


参考文档:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html



PHP业务的php-fpm配置修改

在php-fpm的配置中修改listen.backlog的值即可,在Linux中,默认会将这个值设置为128。考虑到php业务最为典型的使用场景中,会和nginx进行搭配,所以PHP业务出现的问题,还需要考虑到nginx可能带来的影响。



参考文档:https://www.php.net/manual/en/install.fpm.configuration.php



Nginx中的backlog修改

对于nginx来说,修改在进行listen()调用时的backlog参数的方式比较简单,直接在配置文件的server块中修改listen的参数即可,类似于:

server{
        listen      8080 backlog=1024;
}

 

参考文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen



Go中对backlog的透明化处理



与上述几种常见业务类型相比,Go默认行为有很大不同,在Linux设计中,我们可以看到,尽管提供了backlog给用户自行设置,但是还是有somaxconn进行保险,防止设置过大引发超出sever能力限制并发,导致无法保证正常能力范围内算力

 

也就是说,somaxconn和backlog本身作用其实类似,有一个能做到保险就可以了,在这个基础上,backlog直接设置为somaxconn也就更加简洁,上述PHPlisten.backlog也支持设置为-1从而将backlog直接设置为somaxconn,Go则把这种行为变成了默认行为:



Go并没有在net.Listen中提供可以配置backlog参数,而是通过直接获取somaxconn来实现自动设置backlog为somaxconn效果:

// listenerBacklog is a caching wrapper around maxListenerBacklog.
func listenerBacklog() int {
  listenerBacklogCache.Do(func() { listenerBacklogCache.val = maxListenerBacklog() })
  return listenerBacklogCache.val
}
func maxListenerBacklog() int {
  fd, err := open("/proc/sys/net/core/somaxconn")
  if err != nil {
    return syscall.SOMAXCONN
  }
  defer fd.close()
  l, ok := fd.readLine()
  if !ok {
    return syscall.SOMAXCONN
  }
  f := getFields(l)
  n, _, ok := dtoi(f[0])
  if n == 0 || !ok {
    return syscall.SOMAXCONN
  }
  if n > 1<<16-1 {
    return maxAckBacklog(n)
  }
  return n
}
相关文章
|
7天前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
30 5
|
20天前
|
监控 Cloud Native 持续交付
云原生架构下微服务的最佳实践与挑战####
【10月更文挑战第20天】 本文深入探讨了云原生架构在现代软件开发中的应用,特别是针对微服务设计模式的最优实践与面临的主要挑战。通过分析容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,阐述了如何高效构建、部署及运维微服务系统。同时,文章也指出了在云原生转型过程中常见的难题,如服务间的复杂通信、安全性问题以及监控与可观测性的实现,为开发者和企业提供了宝贵的策略指导和解决方案建议。 ####
42 5
|
20天前
|
Kubernetes Cloud Native 持续交付
云原生架构下的微服务设计原则与最佳实践##
在数字化转型的浪潮中,云原生技术以其高效、灵活和可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,聚焦于微服务设计的关键原则与实施策略,旨在为开发者提供一套系统性的方法论,以应对复杂多变的业务需求和技术挑战。通过分析真实案例,揭示了如何有效利用容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,构建高性能、易维护的云原生应用。文章还强调了文化与组织变革在云原生转型过程中的重要性,为企业顺利过渡到云原生时代提供了宝贵的见解。 ##
|
1月前
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,网关的发展趋势和最佳实践
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
150 10
|
1月前
|
存储 运维 监控
云原生应用的可观察性:理解、实现与最佳实践
【10月更文挑战第10天】随着云原生技术的发展,可观察性成为确保应用性能和稳定性的重要因素。本文探讨了云原生应用可观察性的概念、实现方法及最佳实践,包括监控、日志记录和分布式追踪的核心组件,以及如何通过选择合适的工具和策略来提升应用的可观察性。
|
1月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
163 0
|
2月前
|
Cloud Native 关系型数据库 Serverless
基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
本文带大家了解一下如何使用阿里云Serverless计算产品函数计算构建生产级别的LLM Chat应用。该最佳实践会指导大家基于开源WebChat组件LobeChat和阿里云函数计算(FC)构建企业生产级别LLM Chat应用。实现同一个WebChat中既可以支持自定义的Agent,也支持基于Ollama部署的开源模型场景。
392 17
|
5月前
|
Kubernetes 测试技术 应用服务中间件
基于 Nginx Ingress + 云效 AppStack 实现灰度发布
本文将演示结合云效 AppStack,来看下如何在阿里云 ACK 集群上进行应用的 Ingress 灰度发布。
65092 19
|
6月前
|
Kubernetes Cloud Native Devops
【阿里云云原生专栏】DevOps与云原生的融合:阿里云CI/CD流水线最佳实践
【5月更文挑战第23天】阿里云融合DevOps与云原生技术,提供高效CI/CD解决方案,助力企业提升研发效能。通过云效平台,集成代码管理、构建服务、容器服务、持续部署及监控日志组件,实现自动化研发流程。案例中,应用从GitHub构建到Kubernetes部署,全程无缝衔接。借助阿里云,企业能快速构建适应云原生的DevOps体系,以应对复杂需求和提升市场竞争力。
180 1
|
3天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####