【问题标题】:How to make a UNIX socket faster?如何使 UNIX 套接字更快?
【发布时间】:2018-04-12 17:55:47
【问题描述】:

我正在运行一个 Google Cloud Compute VM 作为我的应用程序服务器,该应用程序可在 iOS 和 Android 上使用。服务器在 uWSGI 中运行 Django,前面是 nginx。 uWSGI 和 nginx 之间的通信是通过一个 unix 文件套接字进行的。

最近我开始注意到客户端超时。我做了一些实验,发现 uWSGI 在将数据写入文件套接字时有时会出错。当我在客户端增加'max-time'参数时,它会顺利通过。例如,一个返回大约 200KB json 数据的示例请求,Django 需要大约 1 秒来计算。但是 UNIX 套接字似乎又需要 1-2 秒,这对于 200KB 的响应来说似乎太高了。如果客户端期望在 2 秒内得到响应,这通常会导致 uWSGI 出现写入错误(如下面的屏幕截图所示)。当我在客户端增加超时时,它会顺利通过。

我想知道是否有一些配置更改可以加快 UNIX 套接字上的读写速度。 200KB 对于来自我的服务器的 JSON 响应来说是一个非常小的大小 - 所以我无法将其降低。而且出于业务原因,我的客户端(iOS 或 Android)的超时时间不能超过 2 秒。

【问题讨论】:

  • 第一步是优化配置你的 uWSGI,因为这是写入和从套接字写入。根据负载和系统架构,您可能希望运行多个线程或多个 uWSGI 工作者。接下来,您将告诉 Nginx 使用 epoll 或类似的东西,并配置您的 uwsgi 参数,例如 keep_alive、超时、缓冲区、send_file 块大小等。

标签: nginx uwsgi unix-socket


【解决方案1】:

几个 unix 实体由文件表示,但根本不是文件。管道和套接字是由不是文件的文件表示的实体的示例。

因此,从 unix 套接字写入和读取不会绑定到文件系统 I/O,也不会共享文件系统时间响应。事实上,unix socket 是最快的 IPC 方式之一,比 TCP socket 更高效,因为它根本不使用网络 I/O。

也就是说,这里有一些关于如何解决您的特定问题的提示:

  1. 评估您的应用程序的性能问题。分析它并检查它可能在哪里花费了太多时间。通常,I/O 是性能问题的主要恶棍。此外,糟糕的算法、对长列表的线性搜索也是常见的罪过。
  2. 检查您在 Web 服务器和应用程序网关上的配置。
  3. 检查进程调度。如果每个人都在同一个机器上运行,那么进程并发对于重负载可能是一个问题。确保所有进程都在适当的优先级下运行。

祝你好运!

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2019-02-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多