我们有供应的大的MP3文件的固定库存的小,任意的段的Web服务。该MP3文件在即时由Python应用程序产生的。该模型是,做一个GET请求,你想要的段一个URL指定,响应得到audio/mpeg流。这是一个昂贵的过程。

我们正在使用的Nginx作为前端请求处理程序。 Nginx的照顾的共同请求缓存的响应。

我们最初试图使用在后端龙卷风处理来自Nginx的请求。正如你所期望的,阻塞MP3操作保持龙卷风从做它的事(异步I / O)。所以,我们去了多线程的,它解决了阻塞问题,并且表现相当不错。然而,它推出了一种微妙的竞争条件(现实世界的负载下),我们一直无法诊断或重现呢。争用条件破坏我们的MP3输出。

因此,我们决定(前静止W / Nginx的了),设置我们的应用程序了背后的Apache / mod_wsgi的一个简单的WSGI处理程序。这消除了阻塞问题和竞争状态,但现实条件下,在服务器上创建一个级联负载(即Apache的产生太多processses)。我们正在努力,现在调整的Apache / mod_wsgi的,但仍处于试错阶段。 (更新:。我们已经切换回龙卷风见下文)

最后,问题在于:我们缺少什么?有没有更好的办法了HTTP?

服务于CPU,昂贵的资源

更新:由于格雷厄姆的通知文章,我敢肯定这是一个Apache调整问题。在平均时间,我们已经回到使用旋风,并试图解决数据损坏问题。

有关那些谁这么快的问题投入更多的铁,龙卷风和位多线程的(尽管通过螺纹引入的数据完整性问题)处理负载可接受上的小的(单核)Amazon EC2实例。

有帮助吗?

解决方案

您制作使用Apache / mod_wsgi的嵌入式模式的错误呢?读:

HTTP://博客.dscpl.com.au / 2009/03 /负载尖峰和 - 过量存储器usage.html中

确保使用守护程序模式下,如果使用Apache / mod_wsgi的。

其他提示

您是否尝试过产卵?它是与线程模式的灵活品种一个WSGI服务器。

您可以考虑使用AJAX通知方法的排队系统。

只要有您的昂贵资源的请求,而资源需要生成,添加请求队列(如果它尚不存在)。这排队操作应该返回一个对象,你可以查询来获取其状态的ID。

接下来,您必须编写旋转起来工作线程后台服务。这些工人只需出列请求,生成数据,然后在请求对象保存数据的位置。

在网页可以使AJAX调用到你的服务器,找出生成的进度,并给予一个链接到该文件一旦它的使用。

这是大的媒体网站是如何工作的 - 那些对处理特别视频。这可能是矫枉过正但是你的MP3的工作。

<强>替代地下,考虑运行的几台机器来分配负载。你在Apache线程将仍然阻塞,但ATLEAST你不会在Web服务器上消耗资源。

请定义“级联负载”,因为它没有常见的含义。

您最有可能的问题将是,如果你运行太多的Apache进程。

有关这样的负荷,确保您使用的prefork的MPM,并确保你限制自己的处理(不低于每一个CPU,不超过两个)适当数量的

它看起来像你正在做正确的事情 - 只是缺少CPU电源:你可以决定什么是产生这些MP3的过程中,CPU负载

我认为你必须做的下一件事有添加更多的硬件来呈现在其他机器上的MP3。或者说,或找到一种方法来实现预渲染的MP3(也许你可以cahce一些媒体的?)

BTW,缩放的网络是在巴西PYCON今年主题演讲,由Jacob卡普兰 - 莫斯的主题,它远远不是一个封闭的问题。一个需要处理的技术堆栈是相当善感 - (我无法找到一个在线副本O至演示文稿,虽然 - - 抱歉为)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top