我目前使用 Amazon S3 来满足大部分静态文件服务需求,但我的月度账单变得非常昂贵。我使用日志做了一些粗略的计算,在高峰时段,我最昂贵的 Amazon 存储桶处理大约100180 Mbps 的流量。大部分是 50K 以下的图像。
S3 在存储和冗余方面非常有用,但如果可以的话,我实际上不需要为带宽和 GET 请求付费。我自己的数据中心有足够的廉价带宽,因此我将 nginx 服务器配置为缓存代理,然后用我的大部分文件(约 240 GB)填充缓存,这样我的磁盘就不会在空缓存上疯狂写入。
我尝试切换,我的我的服务器瘫痪了。
看起来问题出在我的磁盘上 - 这台机器有 4 个 1 TB SATA 磁盘(Barracuda XT),设置成 RAID 10。这是我手头上唯一有足够存储空间的东西。我很确定 nginx 设置正确,因为我已经将它用作另一个较小的 Amazon bucket 的缓存代理。假设对于单台机器来说,这是一个合理的流量量,也许 SSD 值得一试。
如果您处理大量静态文件服务,您会使用什么硬件?
附加信息
文件系统:ext4,已安装 noatime、barrier=0、data=writeback、nobh(我在控制器上有电池备份)Nginx:worker_connections = 4096、worker_rlimit_nofile 16384、worker_processes 8、open_file_cache max=100000 inactive=60m
答案1
我认为问题不在于你的磁盘。首先,nginx 的 ncache 使用磁盘存储进行缓存。因此,磁盘速度可能是导致问题的一个潜在原因,具体取决于你的数据集有多热/多冷,但是,我认为没有理由你不能用你提到的硬件提供 100mb/秒的服务 - 特别是如果你使用 nginx。
我首先想到的可能是您的工作进程数太少,您的 worker_connections 可能太低,并且您的 open_file_cache 可能设置得不够高。但是,这些设置都不会导致高 IO 等待或类似的峰值。您说您正在提供 <50k 个图像,并且看起来您的设置中的 1/4 很容易被操作系统缓冲。Nginx 肯定没有最佳配置。
Varnish 以稍微不同的方式处理该问题,它使用 RAM 而不是磁盘作为缓存。
这很大程度上取决于您的数据集,但根据您提供的数据,我看不出磁盘 IO 出现如此峰值的任何原因。您是否检查过 dmesg 和日志以查看您的某个驱动器当时是否遇到了一些 IO 错误?我能想到的可能导致该峰值的唯一其他原因是超出了 nginx 的文件缓存,这将导致它必须进入 FIFO 模式来打开新文件。
确保您的文件系统已使用 noatime 安装,这应该可以减少您工作量的大量写入操作。
以定期处理 800mb/秒的机器为例:
# uptime
11:32:27 up 11 days, 16:31, 1 user, load average: 0.43, 0.85, 0.82
# free
total used free shared buffers cached
Mem: 8180796 7127000 1053796 0 1152 2397336
-/+ buffers/cache: 4728512 3452284
Swap: 8297568 237940 8059628
Quadcore Xeon:
Intel(R) Xeon(R) CPU X3430 @ 2.40GHz
$ ./bw.pl xxx.xxx 2010-09-01 2010-09-30
bw: 174042.60gb
average 543mb/sec, peaks at 810mb/sec
=== START OF INFORMATION SECTION === Model Family: Seagate Barracuda
7200.12 family Device Model: ST3500418AS Serial Number: 6VM89L1N
Firmware Version: CC38 User Capacity:
500,107,862,016 bytes
Linux 2.6.36-rc5 (xxxxxx) 10/04/2010 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.33 0.00 2.40 5.94 0.00 87.33
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 109.61 19020.67 337.28 19047438731 337754190
avg-cpu: %user %nice %system %iowait %steal %idle
8.09 0.00 3.40 10.26 0.00 78.25
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 138.52 21199.60 490.02 106210 2455
avg-cpu: %user %nice %system %iowait %steal %idle
3.74 0.00 3.25 9.01 0.00 84.00
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 125.00 21691.20 139.20 108456 696
avg-cpu: %user %nice %system %iowait %steal %idle
4.75 0.00 3.12 14.02 0.00 78.11
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 154.69 19532.14 261.28 97856 1309
avg-cpu: %user %nice %system %iowait %steal %idle
6.81 0.00 3.36 9.48 0.00 80.36
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 112.80 17635.20 309.00 88176 1545
磁共振成像仪:
https://i.stack.imgur.com/CRqPi.png
数据集:
# du -sh ads
211.0G ads
# ls|wc -l
679075
答案2
你的光盘很差劲。
尝试获取更多、更快的光盘。SAS 在这里表现很好,就像迅猛龙一样。
话虽如此,最好的办法是获得...一块 SSD。
每个磁盘的 IOPS 可能约为 200。使用 SAS 时,IOPS 可以达到约 450,使用 Velocidaptors 时,IOPS 可以达到约 300。高端 SSD 可以达到... 50,000(不是开玩笑 - 我的意思是 5 0 0 0 0 0 0)IOPS。
算一下 ;) 单个 SSD(无 RAID)的速度大约是 Raid 10 的 62 倍 ;)
答案3
我们在后端使用 SSD 的服务器上提供大约 600 Mbps 的服务,前端使用 nginx+varnish。实际的处理器是一个小型 Intel Atom;我们在 LB 后面安装了四个这样的处理器,每个处理器的速率为 600 Mbits/秒(使用 DSR)。也许并不适合每种情况,但它非常适合我们的用例。
答案4
添加更多磁盘。您可以用磁盘数量(达到一定程度)来换取单个磁盘速度:也许您可以使用 X 个昂贵的 SAS 15kRPM 磁盘或使用(猜测,无意义的值)X*2 个便宜的 SATA 7k2RPM 磁盘获得相同的性能。您必须进行计算,看看哪种方式更适合您 - 这也取决于您在数据中心支付多少机架空间和电力。
SSD 将为您提供所需的所有 IOPS,但对于大容量存储来说它们并不便宜(这就是为什么它们的主要用例是数据库等工作负载)。