基础环境

版本信息

  • Centos 7.1
  • nginx version: openresty/1.13.6.2

nginx配置信息

stream {    server {        listen 53 udp;        proxy_pass close_stream_backend;    }    upstream close_stream_backend {        server 10.0.1.2:53;        server 10.0.1.3:53;    }}

异常问题

20个线程连续压测一分钟后开始交替出现两台目标机器已经宕机(单线程访问没什么问题),出现日志如下所示:

[error] 7184#0: *142585778 no live upstreams while connecting to upstream, udp client: 10.0.1.2, server: 0.0.0.0:53, upstream: "dns", bytes from/to client:40/0, bytes from/to upstream:0/0

主要有两个疑惑点:首先直接访问目标机器,目标机器处于正常访问状态,而且没什么压力;另外一点如果负载均衡目标服务机器两台改为一台反而不会出现这个异常,但是服务所在机器压力非常大;所以怀疑是nginx这台机器除了问题。

分析解决

  1. nginx官网查询了下负载均衡策略含义,大概意思是这样的,首先nginx默认的配置为轮询,负载均衡的各个模块组成了一个链表,每次从链表到头开始往后处理,如果连接失败了,就去尝试连下一个,如果所有的都失败了,就会进行quick recovery 把每个peer的失败次数都重置为0,然后再返回一个NGX_BUSY,然后nginx就会打印一条no live upstreams ,最后又回到原始状态,接着进行下次转发。查看配置文件,如果其中一台有一次失败,nginx就会认为它已经死掉,然后就会把以后的流量全都打到另一台上面,当另外一台也有一次失败的时候,就认为两个都死掉了,就开始打印错误日志。

  2. 第一个想到的办法就是增大重试次数和时间,server 10.0.1.2:53 max_fails=5 fail_timeout=60s;把max_fails从1改成5,有一定效果,no live upstreams出现的概率变少了很多,但却没有完全消失。另外压测QPS上不去,还不如单台机器。

  3. 于是使用tcpdump -i eth2 udp port 53 -s0 -XXnn,通过wireshark分析后,压力测试工具产生数据已经全部发送到nginx所在机器,但是这台机器没有正确处理。

  4. 后来想了下Nginx底层采用的IO多路复用模型epoll,其epoll又是基于linux内核实现,于是看了下/var/log/messages内核日志,于是发现大量如下丢包日志:

kernel: nf_conntrack: table full, dropping packet.

为了证实问题,再次进行压力数据发送,发现只有再进行压力测试时才会出现这种内核丢包日志。怀疑是服务器访问量大,内核netfilter模块conntrack相关参数配置不合理,最终导致新连接被drop掉。

  1. 查看netfilter参数配置 sudo sysctl -a | grep conntrack 发现65536,于是我直接提升了4倍
sudo sysctl -w net.netfilter.nf_conntrack_max=262144suod sysctl -w net.nf_conntrack_max=262144

执行sudo sysctl -p使其立即生效,再次执行压力测试,发现内核不在出现丢包,nginx也不会出现如上错误日志,问题解决。

总结分析

本文主要通过分析nginx网络请求异常,然后定位为内核参数设置太小导致丢包,最后通过修改内核配置解决,但是conntrack又是什么?搜索之后发现conntrack是针对状态防火墙的。如果有兴趣,请阅读Netfilter的连接跟踪系统。它还包括Netfilter基本的框架。因此conntrack是用来创建记录连接状态以检查流量并避免DDoS安全问题。


另外如上分析问题的过程中,我直接把conntrack值设置为原来的四倍,这样是否合理?碰到这类问题,又该如何设置呢?下面给出一个公式:推荐大小:CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)。例如,在x86_64 OS中,我有8GB内存,因此我将它设置为8*1024^3/16384/2=262144。以上就是我分析解决问题的整个过程,如果问题,请关注公众号、加我微信,一起讨论!

推荐


并非每个容器内部都能包含一个操作系统

解决k8s集群环境内存不足导致容器被kill问题

原创不易,随手关注或者”在看“,诚挚感谢!

日志分析里面的max是什么_压测nginx出现no live upstreams while connecting to upstream的问题分析...相关推荐

  1. 日志分析里面的max是什么_mysql慢日志文件分析处理

    mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数. 如果在my.cnf里面修改,需增加 ...

  2. 一次百万长连接压测 Nginx OOM 的问题排查分析

    转载来源 : 一次百万长连接压测 Nginx OOM 的问题排查分析 : https://mp.weixin.qq.com/s/thSoTHeS26Y4Nf7ryUtygg 在最近的一次百万长连接压测 ...

  3. 量词逻辑量词里面的v表示?_代理知识表示中的量词简介(基于人工智能)

    量词逻辑量词里面的v表示? As we know that in an AI-based agent, the knowledge is represented through two types o ...

  4. 量词逻辑量词里面的v表示?_知识表示能力问答中的人工智能量词(MCQ)

    量词逻辑量词里面的v表示? 1) How many types of quantifiers are there that are used to represent knowledge? 3 typ ...

  5. 复工后一次百万长连接压测Nginx与OOM的问题排查分析,我裂开了!

    在最近的一次百万长连接压测中,32C 128G 的四台 Nginx 频繁出现 OOM,出现问题时的内存监控如下所示. 排查的过程记录如下. 现象描述 这是一个 websocket 百万长连接收发消息的 ...

  6. jdk自带压测工具_压测工具JMeter的使用

    最近接了压测的需求,顺带熟悉下压测工具的使用.这里推荐JMeter,安装快捷.请求方便,省了一大堆麻烦的事情.Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做 ...

  7. rust里面的awm叫什么_铅笔里面有铅吗?为什么叫铅笔呢?

    点击上方头条号"机械设计一点通"关注我们,每天学习一个机械设计相关知识点 铅笔里面含铅吗? 现在的铅笔并不含铅,而是用石墨和黏土制造的. 铅笔里不含铅,为何称之为"铅笔& ...

  8. python包里面的dll是什么_如何使用Python中的DLL文件?

    小编典典 为了易于使用,ctypes是必经之路. 以下ctypes示例来自我编写的实际代码(在Python 2.5中).到目前为止,这是我找到的最简单的方法来完成你的要求. import ctypes ...

  9. python包里面的dll是什么_使用R的程序包提示我们无法使用怎么回事?因为计算机丢失jvm.dll...

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具.目前数据挖掘领域里面R是比较流行的统计软件,因为其免费的特性赢得 ...

最新文章

  1. 机器学习:使用分形维数快速选择特征
  2. CBV 验证装饰器的使用
  3. JQuery环境配置
  4. 云机搭jdk1.8和apache-tomcat
  5. 剑指offer和LeetCode题目笔记
  6. convirt2.5在虚拟机上安装笔记
  7. [转] 移动前端不得不了解的HTML5 head 头标签
  8. [转]小白都能看懂的softmax详解
  9. springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验
  10. Linux内核态下的文件操作
  11. 手机壁纸 NBA群星高清壁纸
  12. 通向财务自由之路01_导读
  13. 麦克纳姆轮全向移动机器人斜向直线运动分析
  14. 请教高手,如何取得Target属性
  15. Java 18 新特性
  16. 加拿大MSB牌照简介
  17. 方程检验格式图片_解方程并检验(图片) x+3.5=3.5解方程
  18. 考研视频有点难,以后继续早上锻炼
  19. Revit二次开发入门--创建一个简单的程序
  20. 技术宅学会几招FFmpeg

热门文章

  1. IDEA中Maven项目中界面右边的Maven Projects窗口找不到不出来
  2. dtc mysql_DTCC归来-高可用可扩展数据库架构探讨
  3. servlet ---- 响应对象
  4. vue ---- webpack - devServer节点
  5. JavaSE----多态
  6. linux svn删除目录命令,删除目录下的所有.svn版本库目录_CentOS
  7. JSch连接不上Linux服务器,windows 下 java程序jsch连接远程linux服务器执行shell命令
  8. 可能存在无限递归_Python之递归函数
  9. windows中启动 java -jar 后台运行程序
  10. Android开发笔记(一百五十四)OpenGL的画笔工具GL10