《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——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
}
相关文章
|
3月前
|
人工智能 云栖大会 调度
「2025云栖大会」“简单易用的智能云网络,加速客户AI创新”专场分论坛诚邀莅临
”简单易用的智能云网络,加速客户AI创新“专场分论坛将于9月24日13:30-17:00在云栖小镇D1-5号馆举办,本场技术分论坛将发布多项云网络创新成果,深度揭秘支撑AI时代的超低时延、自适应调度与跨域协同核心技术。同时来自领先企业的技术先锋将首次公开其在模型训练、企业出海等高复杂场景中的突破性实践,展现如何通过下一代云网络实现算力效率跃升与成本重构,定义AI时代网络新范式。
190 4
|
人工智能 安全 Cloud Native
阿里云云原生安全能力全线升级,护航百万客户云上安全
【重磅发布】9月20日,在杭州云栖大会上,阿里云宣布云原生安全能力全线升级,首次发布云原生网络检测与响应产品NDR(Network Detection Response,简称NDR)。同时,阿里云还宣布将持续增加免费的安全防护能力,帮助中小企业客户以极低投入完成基础的云上安全风险治理。
420 15
|
8月前
|
Kubernetes 安全 应用服务中间件
IngressNightmare:Ingress Nginx 再曝5个安全漏洞,可接管你的 K8s 集群
是否还记得 2022 年 K8s Ingress Nginx 披露了的 3 个高危安全漏洞(CVE-2021-25745, CVE-2021-25746, CVE-2021-25748),并在那一年宣布停止接收新功能 PR,专注修复并提升稳定性。
|
9月前
|
运维 容灾 API
云栖大会 | 阿里云网络持续演进之路:简单易用的智能云网络,让客户专注业务创新
云栖大会 | 阿里云网络持续演进之路:简单易用的智能云网络,让客户专注业务创新
558 2
|
9月前
|
人工智能 运维 API
第七届 SD-WAN&SASE大会暨云网络大会 | 简单易用的智能云网络,让客户专注业务创新
第七届 SD-WAN&SASE大会暨云网络大会 | 简单易用的智能云网络,让客户专注业务创新
235 2
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
2235 0
|
Kubernetes 测试技术 应用服务中间件
基于 Nginx Ingress + 云效 AppStack 实现灰度发布
本文将演示结合云效 AppStack,来看下如何在阿里云 ACK 集群上进行应用的 Ingress 灰度发布。
65412 25
|
存储 监控 Cloud Native
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
125 7
|
弹性计算 运维 安全
面对蓝屏,阿里云云原生能力可以帮客户做点啥?
Windows大面积蓝屏,问题源于“CSAgent.sys”加载错误设定的“C-00000291*.sys”文件。阿里云充分利用云原生能力,通过ECS实例自助排查和OOS批量操作快速修复受损机器。
|
12月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
272 17

热门文章

最新文章