诊断缓慢/超时的 Web 应用程序

诊断缓慢/超时的 Web 应用程序

我查看了load average: 12.41, 11.94, 11.59运行 Web 应用程序的 Linux 机器上的平均加载时间。该机器有 16 个核心,因此平均负载不会高到难以控制。

但是,当我尝试连接此 Web 应用程序时,它经常超时。这可能是什么原因造成的?这有点令人费解。

所有 CPU 的 CPU 使用率都在 ~50% 左右徘徊(根据top)。 的值wa介于0.0和之间3.0。 根本没有使用交换内存,并且有大量可用内存。

iostat显示%iowait值为0.51。其他统计数据包括:

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               4.88         1.02      2136.25   12365497 25895371840
sdb               0.00         0.00         0.00       9456          0
sdc               0.95         0.00       452.44       4781 5484405440

每秒写入次数很高 - 这是一个写入繁重的应用程序。iotop显示来自pgbouncer进程(postgresql 连接池)、异步任务队列和 nginx 工作进程(可能写入访问日志)的写入。我没有在列中看到任何超过 6% 的内容IO>- 并且大多数行都有 0.00%。SWAPIN贯穿0.00%始终。


简而言之,CPU 利用率没有超标,内存利用率不是问题,也没有出现过多 I/O 相关等待的迹象。为什么当我尝试访问 Web 应用程序时,它会无限加载/超时?这可能是sysctl.conf我的 Web 服务器存在问题吗?这里需要专家意见。


所讨论的服务器是 Ubuntu 14.04 LTS。Nginx 是 Web 服务器,用作 Gunicorn(基于 Django 的 Web 应用程序)的反向代理。后端是 Postgresql 9.3,Redis 也在使用中。数据库位于单独的 VM 中。

答案1

如果你正在处理大量 TCP 连接,并且正在使用像 nginx 这样的反向代理,你可能会遇到TCP 端口耗尽。简而言之,理论上有 65535 个 TCP 端口。如果您有一个来自 IP 192.168.1.1 的反向代理连接到 192.168.1.2:80 上的端口 80 上的 Web 服务器,那么理论上,您可以通过反向代理同时与 Web 服务器的端口 80 建立的最大连接数为 65535。之后,您将用尽可用的源端口(称为临时端口)。

但实际情况比这稍微复杂一些:Linux 默认只使用大约 30000 个端口(旧内核/发行版更低 - 低至 1024 个),即使这样,它也会使用一种算法随机尝试寻找可用的源端口。越接近 30000 个标记,内核随机选择空闲端口的尝试次数就越多,找到端口所需的时间就越长。尝试使用netstat、grep 和 wc计算您拥有的连接数,如果连接数接近 30,000,则可能是超时的原因。您可以如果是这种情况,请查看 NGINX 解决该问题的建议。

相关内容