这个问题困扰了我很长时间,我真的希望有人能帮助我。
我会长话短说:我有一个文件服务器(2x 双核 Xeon 2.0、8GB RAM、132 SCSI HDD),它托管几千个小图像文件,4-10kb,每秒可获得 1000 多个请求。
我已经尝试过 Apache、Nginx 和 Lighttpd,发现 Lighttpd 最适合这项工作。
当 Web 服务器关闭时,简单的 HD 基准测试显示其读取速度约为 170 兆字节/秒。但是,当 Web 服务器开启并以约 30 兆字节/秒的速度提供服务时,同样的 HD 基准测试显示 HD 的读取速度仅为 5 兆字节/秒,而不是像我这样的新手所期望的 140(170 减 30)兆字节/秒。
现在,即使以每秒 1000 个请求的速度运行,CPU 仍然运行良好(负载低于 1),并且有足够的可用内存,这让我相信瓶颈实际上是 HD。
所以,我的问题是,为什么?为什么一台理论上可以以 170 兆字节/秒读取的硬盘在通过 Web 服务器提供服务时,瓶颈速度只有 30 兆字节/秒?
我的第一个猜测是,同时查找和提供数千个文件会完全损害 HD 的性能,而不是像那些基准测试那样一次只读取/写入一个文件。
是这样吗?如果是这样,我该如何解决这个问题?RAID?更多硬盘?SSD?
提前致谢!
答案1
这听起来确实像是您已经耗尽了磁盘的 I/O 能力。15K RPM 磁盘每秒可以执行大约 170 次完全随机 I/O 操作。当用于 RAID0、RAID1 或 RAID10 阵列时,此 I/O 操作数会根据阵列中的驱动器数量而增加(R5 和 R6 引入了另一个瓶颈,因此实际吞吐量可能会低于理论值)。如果您有 96 个驱动器,则理论上的最大 I/O 操作数约为每秒 16K 次。
另外:将其与如今的中档 SSD 进行比较,它们可以在单个设备上处理 30K I/O Ops/秒。
尽管文件系统的块大小可能是 4kb,但该硬盘可能已经足够老了,扇区大小为 512b。因此,对于所有这些 4-10kb 的文件,您的 I/O 都会有一定的顺序性。即便如此,每秒 1000 个并发请求听起来确实会占用单个磁盘。您在繁忙时段的基准测试显示速度只有 5MB/s,这说明您的磁盘已经饱和。
如果您的数据集足够小,那么单个 SSD(或 R1 镜像中的一对)的速度就足够快,无需增加 RAM 来缓存。如果“132 SCSI HD”实际上是“132GB SCSI HD”,那么您就完全处于“相对实惠”的 SSD 价格范围内。
答案2
您的问题确实很可能是寻求开销。 有两种主要解决方案:
- 添加足够的 RAM 以容纳您的工作集是理想的方法,而且现在相当便宜。即使看起来您有足够的 RAM,问题也是没有足够的缓存 RAM,这通常不会显示为“已使用”。
- 除此之外,SSD 的寻道速度比普通 HDD 要快得多,并且如果您的工作集太大而无法放入 RAM(即,对于主板的 RAM 限制来说太大或比相同数量的普通 RAM 便宜)时,SSD 可能会有所帮助。
RAID10、RAID1 或 RAID0(危险:丢失一个驱动器将导致阵列损坏)可以帮助将读取访问分散到多个硬盘驱动器上,从而改善平均访问时间,但这仅仅是 Nx 改进(其中 N 是正在使用的驱动器数量),因此应该认为添加 RAM 是更好的选择。