`
wangleide414
  • 浏览: 608433 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

listen queue of socket full !!! 深入排查和分析

 
阅读更多


 最近抽时间总结下对于该问题近期的排查过程和分析;

 

问题背景:

        web服务器使用的是nginx + uwsgi 的架构;

近期发现服务器上偶然会出现 *** uWSGI listen queue of socket 4 full !!! (100/100) *** 这样的日志;并且很难重现,有时候出现一段时间会自己回归正常,如下图:

图1 uwsgi listen queue full  

 

 

问题分析:

      由于是线上不定时重现,并且自动会好,并且表面上看应该是listen 队列满的原因。排除是代码逻辑等问题,怀疑是 资源和访问方式问题导致的;

      首先要在环境中复现这种情况,以便发现更深入的原因;

       

      看到listen 队列自然会找到对应的系统调用 int listen(int fd, int backlog);

      socket listen 的时候可以指定 backlog 详细请看下边的定义:

 

An incomplete connection queue, which contains an entry for each SYN that has arrived from a client for which the server is awaiting completion of the TCP three-way handshake. These sockets are in the SYN_RCVD state .
A completed connection queue, which contains an entry for each client with whom the TCP three-way handshake has completed. These sockets are in the ESTABLISHED state.
The backlog argument to the listen function has historically specified the maximum value for the sum of both queues.
      简单的说backlog 就是 已完成队列和等待完成队列和,所以如果程序压力大,不能及时的accept socket ,那么队列就可能会满,满了以后新来的connection 就建立不起来,这里用c 简单做了个验证,服务器端listen 后不进行accept ,backlog 设置为1 ,让客户端请求时,代码如下:

 2 服务器监听8000 但是不进行accept动作 

 

图3 并发访问8000端口 TCP状态的变化统计

 

    我们观察到新来的connection 建立不起来,丢弃了很多SYN包;

 

复现过程:

    (1)首先要想办法来复现这种问题才能去排查,根据现象,预感应该是请求压力大造成的,所以使用了ab工具来并发构造请求;

              先随便构造服务器上的一个请求接口来测试;

 

     ab -n 1000 -c 300 http://xxxxxx/xxxxxx/xxxxx/api_test1/

 

             表示请求1000次,并发量是300,查看服务器uwsgi 的log 并无发现异常,加大并发量到500后还是正常;

 

    (2)看来正常情况下虽然是并发很大,也不会出现这种情况,那么就在某一个api里边人工让它处理慢一点,也就是让accept 的速度降下来:

 

import time
print "-------------", time.time()
time.sleep(10)

 

   (3)再次使用ab 来测试。果然出现了 listen queue of socket 4 full ;此时在看TCP的状态的统计情况,发现果然有大量的SYN被丢弃掉 ,问题基本上就定位了;

仔细来看,该问题主要原因是由于部分api 处理慢,影响了整体组件其他api的可用性。在并发较高的情况下就会出现该问题;直接后果就是其他api不能正常提供服务;

 

 解决办法:

 

          这里根本原因还需要分析那个慢的api 是否正常,是否可以优化,如果确实是逻辑复杂,很难优化,加上业务上确实处理不过来,那么可以使用下边的方案来解决该问题;

 

(1)增加uwsgi listen 队列长度 :通过参数 --listen 1024 来提高监听长度;

(2)使用UNIX Domain Socket 来替代网络Socket ,它不需要经过网络协议栈,不需要打包拆包等操作,它只是将应用程序数据从一个进程cp到另一个进程,这正好适合nginx 和 uwsgi 在同一台机器的情况;通过 --socket /tmp/uwsgi.sock 来使用 Domain Socket;

          当然两个方法只能暂缓,不能根除;

(3)增加负载均衡,把压力均分到其他机器上;

 

 

 

 

 

  • 大小: 31.4 KB
  • 大小: 43.8 KB
  • 大小: 25.5 KB
分享到:
评论

相关推荐

    Queue Full(解决方案).md

    Queue Full(解决方案).md

    C语言头文件 QUEUE.H

    C语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言...

    thinkphp5.0.24+queue 队列信息完整源码

    本文将详细探讨在ThinkPHP5.0.24版本中如何使用Queue队列,以及相关源码分析。 一、队列概念与作用 队列是一种先进先出(FIFO)的数据结构,常用于处理批量数据或者需要后台执行的任务,如邮件发送、日志记录、数据...

    C# MessageQueue示例

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、Web应用以及游戏等领域...通过学习和实践这些示例,开发者可以更深入地理解C#中消息队列的工作原理,并能有效地利用它们来构建高效、稳定的系统。

    C# Socket 客户端服务端封装带使用实例

    1. 绑定监听:使用Socket的Bind方法绑定到特定的IP地址和端口,然后调用Listen方法开始监听。 2. 接受连接:调用Accept方法等待并接受客户端的连接请求,返回一个新的Socket实例用于与客户端通信。 3. 数据收发:与...

    Queue与Topic的比较

    Queue 和 Topic 是 JMS(Java Message Service)中两种基本的消息模式,分别对应 Point-to-Point 和 Publish/Subscribe 模式。 Queue 模式 在 Queue 模式中,一条消息仅能被一个消费者(Consumer)接收。如果在...

    Waitqueue、Event及Semaphore的实现机制分析

    总的来说,Waitqueue、Event和Semaphore都是Linux内核提供的重要同步和互斥机制,它们在多线程环境下保证了系统资源的安全访问。理解这些机制的内部工作原理对于编写高效、可靠的内核级代码至关重要。通过深入学习和...

    analysis of ACE_Task-putq with timeout=0 when queue is full on Linux platform.pdf

    我们将分析涉及的多个层面,包括ACE库本身、glibc库以及Linux内核源码,具体涉及的函数有`ACE_Task::putq`、`ACE_Message_Queue::enqueue_tail`、`pthread_cond_wait`、`sys_futex`和`sched_yield`等。 #### 1. ACE...

    ip_queue的实现分析

    Queue机制

    tp5.1消息队列 think-queue

    总结,"tp5.1消息队列 think-queue" 是一种在ThinkPHP5.1环境中实现消息队列的方式,通过使用think-queue组件,开发者可以轻松地创建和管理异步任务,提高应用的并发处理能力和系统稳定性。理解其安装、配置、使用...

    Queue Full(亲测可用).md

    Queue Full(亲测可用).md

    C语言实现的队列Queue

    在计算机科学中,数据结构是组织、存储和处理数据的方式,它们是算法设计的基础。队列(Queue)是一种线性数据结构,遵循“先进先出”(First In First Out, FIFO)的原则,就像现实生活中的排队一样,最早进入队列...

    使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序

    if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE)) { printf("Server Listen Failed!"); exit(1); } while (1) { // 服务器端要一直运行 struct sockaddr_in client_addr; socklen_t length = sizeof...

    iOS SocketDemo

    try socket.listen(onPort: port) print("Server started on port \(port)") } catch { print("Error starting server: \(error)") } } // 实现GCDAsyncSocketDelegate的方法... } ``` ### 8. 总结 通过...

    Windows Messae Queue性能分析

    CSV(Comma-Separated Values)是一种通用的数据格式,可以轻松地导入到各种数据分析工具中,如Excel或Python的Pandas库,以便进行更深入的统计分析和可视化。 在实际操作中,你可以通过以下步骤进行性能分析: 1. ...

    Linux内核IP Queue机制的分析

    Linux内核IP Queue机制的分析Linux内核IP Queue机制的分析Linux内核IP Queue机制的分析Linux内核IP Queue机制的分析Linux内核IP Queue机制的分析

    Queue of the Study

    A very good book! You can loaddown then take it back home and Study!

    An example of C_queue

    THis is an example source code for the queue implemented by systemc.

    C++关于socket的client&server库创建

    本篇文章将深入探讨如何使用C++创建基于Socket的客户端(Client)与服务器端(Server)库。Socket编程通常涉及TCP(传输控制协议)或UDP(用户数据报协议),这里我们将主要关注更可靠的TCP连接。 首先,我们需要...

Global site tag (gtag.js) - Google Analytics