用于css / js / images的专用Nginx服务器非常酷,但图像加载速度慢。 为什么?

我们公司有三台专用服务器,一台运行Nginx,作为web服务器(php),另一台处理MySQL和Memcached,另一台用于服务静态文件:css,js和images。

所有的服务器都在New Relic上performance出色,尤其是静态文件服务器:

  • CPU持续低于10%
  • networkingIO接收率非常低,传输速度大约在10 Mb / s以上,但是MySQL服务器的规格相同,并且在20 mb / s的速率下通常达到峰值,所以不要怀疑这是一个问题。
  • 平均负载在0.5以下

问题是,在高峰时期,显然这些图片(大小可以是100kb-200kb)需要很长时间才能加载一些用户(有时候很多秒,有时甚至是一分钟),通常只需要几个几秒钟)。

任何想法我们可以做什么? 理想情况下,如果CPU,RAM或带宽都没有达到任何限制,则不会发生这种情况。

任何关键的Nginx的configuration参数,我们应该看(可能会改变)?

我可以想到两种可能性。

  1. 您的磁盘已经打到它的I / O上限。
  2. 你已经达到了nginx的工作线程限制。 查看来自Core模块的worker_ *configuration参数和来自Events模块的worker_connections ,找出如何加强这一点。 默认是一个单一的工作进程,这是单线程,所以如果你在一个多CPU平台上运行,那么你一定要提高这一点。 即使你在一个单一的cpu盒,你将受益于提供静态资源的机器上的这个数字,因为你会在其他任何东西之前进行磁盘I / O绑定,而其他线程可以接收和处理更多的请求首先是坐在等待从磁盘提供数据。

我们可以坐在这里,猜测你的瓶颈在哪里,但是一些更一般的build议可以帮助你更快地find自己的瓶颈。

jeffatrackaid 昨天写了这个答案 ,这是我刚刚写的一个更简洁的版本。 我build议先阅读这些内容,以帮助了解性能debugging是如何完成的。

在你的情况下,我会首先使用Firebug来确定在高峰时间哪个位的请求进行缓慢。 如果带宽不是真正的问题,这应该排除带宽。 查看Firebug的“Net”部分,看看哪个部分请求在快速时间和慢速时间之间变化。

接下来,在这些缓慢的时刻之一,我会在nginx的一个工作人员身上运行-t-T选项。 分析的输出应该告诉你究竟在哪里nginx进展缓慢。 将strace输出写入文件非常有用,然后使用lessgrep来识别花费很长时间的系统调用。

您可以使用-c选项进行strace。

一旦确定了缓慢的系统调用,确定哪个nginx参数需要更改仍然是一些工作,但是您应该顺利完成。 如果你需要这方面的帮助,请回来问一些更具体的问题。

如果事实certificate是一个基于文件的系统调用,一定要往回查找跟踪,直到find正在等待的文件。 这将是一个很大的暗示。