我正在尝试增加我网站的容量,因为它的增长超出了我当前 Web 服务器的处理能力。该网站托管在专用 Web 服务器 (Litespeed) 和专用数据库服务器上。该网站每天接待超过 180,000 名访客,每天从该网站下载 100,000 次。
该网站基于 PHP/MySQL,托管超过 200GB 的用户上传/公开共享文件。对于每次上传,我们都会存储主文件/下载文件以及预览文件。这些文件可以是短 MP3 文件、短 MP4 视频(转换为 FLV 以供预览)和图像(jpg)以及其他一些格式,通常带有缩略图和较大的图像预览。我们还有一个包含 20GB 附件的论坛。
所有动态、下载/静态内容均托管在网络服务器上,全天负载约为 20,瓶颈是磁盘等待和 CPU(双 5410)。
我的主机建议镜像 Web 服务器并在其前面安装硬件负载平衡器,这意味着使用更大、更慢的磁盘 - 或者,为动态页面运行一个 Web 服务器,使用更快的磁盘,并将所有静态内容、缩略图/预览和下载移动到运行 nginx 的专用静态服务器。这对于提供图像预览很有效,但是所有下载都是通过 Web 服务器上的 PHP 脚本动态提供的,Mp3 和 flv 预览流也是如此。我看不出这样做对下载/流媒体内容有什么好处,因为我认为 Web 服务器仍然会承受重负载,并且只有 JS、CSS 和预览图像会直接从静态服务器提供。他们还建议设置私有云;每台服务器上都有一个虚拟 Web 服务器和负载平衡器。
有人可以解释一下如何在这种情况下进行最佳优化,并使其在未来需要时能够灵活地扩大规模吗?
其他信息:我们的 MP3 文件不是大文件(350-400KB),FLV 文件最大为 10MB,但其他一些内容如 rar/zip 文件最大可达 30MB,平均约为 10MB。
谢谢
答案1
很抱歉,但如果有 PHP/MySql 的分析器,我会抓取它并进行优化。无论我如何削减数字,这个网站都应该能够在具有核心的 Atom 处理器上顺利运行。对于一个编程良好的网站来说,每天 180,000 名访问者并不是那么多。对于磁盘等待 - 获得合适的 RAID 控制器或 ZFS,并放入 1-2 个 SSD 作为缓存。另外获得硬盘 - 速度很快。数据库不是您在普通低端服务器上放置的性能。只是给你一个想法 - 我有一个 800gb 数据库服务器,我正在使用 10 个磁盘 - 8x Velociraptor ion a Raid 10,2 个 SSD 镜像用于日志。任何数据库的子系统设计不良都会发生磁盘等待。
所以,如果我是你的话,我会:
开始优化我的 PHP 代码,添加一些加速器。我记得一年前在一台双奔腾处理器上处理了一个约会网站上的 400,000 名访客。在电视节目的一个小时内。使用 ASP - 未编译。
开始布局更好的 IO 子系统。
注意:后者可能需要新硬件。无论如何。SuperMicro 在这方面占主导地位 - 他们的服务器机箱最多可容纳 72 个驱动器托架,高度为 4 个机架单元。24 个磁盘位于 2 个机架单元中,全部位于 SAS 背板上。我用的是其中的一个(现在总共有 20 个磁盘),它真的很棒。
答案2
您可以使用 X-SENDFILE 标头优化通过脚本提供静态内容。
您可能应该将静态内容和数据库拆分到不同的磁盘/阵列,并对静态内容阵列设置进行一些实验。在某些情况下,raid1/raid10 可能会更好,在其他情况下,raid5 可能会更好地工作(特别是如果您没有写入太多),而在某些情况下,只有几个单独的驱动器(或 raid1 阵列,如果您需要冗余)并将文件均匀分布在所有驱动器上可能会解决问题。
取决于您有多少内存可供使用,将所有小文件或一些最常请求的文件(您可以从 Web 服务器日志中获取统计信息)放在 ramdisk 中,从而减轻磁盘负担。(尽管这实际上取决于您看到的确切流量,因为操作系统正在尝试使用缓存为您执行此操作,但这可能会或可能不会很好地工作)
当然,将服务器分成两部分,每台服务器提供一半的文件,即使没有负载均衡器也能帮到你。(这又取决于流量)
答案3
在投资硬件或改变架构之前,我建议尝试找到性能问题的根本原因。
您提到了磁盘 IO。是什么导致了此 IO?您确定是文件下载、日志记录或其他活动吗?
我通常首先对磁盘的写入/读取进行分类。是否有任何特定程序/功能比其他程序/功能更容易导致问题。尝试禁用某些任务,例如将 apache 日志发送到 /dev/null。如果服务器上也在运行邮件,则停止邮件。
这只是我开始的一个例子。
许多主机商会迅速推出更多硬件 - 当然,这其中有商业动机,但通常这是他们处理性能问题的唯一办法。他们通常不提供进行 Web 性能优化的服务,因此默认答案是增加硬件。
更多的硬件价格昂贵,并且收益递减。