我查看了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 解决该问题的建议。