我需要从 VPS 提供大量非常小的静态文件(例如 100 万,~1KB)。我目前喜欢的方法是 Nginx,但我主要担心的是 VPS 磁盘速度太慢。
有没有一种方法可以从本地内存而不是磁盘提供这些文件?我知道操作系统(在本例中为 Debian)会将“热”文件保存在内存中,但我担心这会很难监控或影响。也许有一种方法可以让 Nginx 从内存中提供服务?或者完全采用其他方法?
答案1
您可以将它们所在的文件夹挂载为 tmpfs 分区,放入内存中。
例如:mount -t tmpfs -o size=128m tmpfs /mnt/tmp
答案2
我讨厌反驳,但不要这样做。假设您使用的是 Linux,操作系统无论如何都会将频繁访问的文件缓存在内存中,而这些文件并不是操作系统急需的。如果您试图猜测这个过程,例如像 Jeroen 建议的那样使用 ramdisk,那么您对文件需要保留在内存中的时间比内核可能保留在内存中的时间更长的判断可能是对的,也可能是错的。
如果您是对的,那么您所做的一切都是 VM 系统将为您做的事情。
如果您错了,那么原本会取代您的文件的其他一些内存将会被刷新到交换区,并且从交换区检索这些页面将给您的服务器带来比从 FS 检索您的文件更大的性能负载。
Linux 中的 VM 代码经过了严格而深入的调优。它并不总是正确的,但它往往在大部分时间里都是正确的,因此您需要一个非常好的理由来覆盖它。
答案3
我知道操作系统(在本例中为 Debian)会将“热”文件保存在内存中,但我担心这会很难监控或影响。
确实如此。你可以通过调整虚拟内存选项来影响这一点;
了解 swappiness这里. 根据您的情况将其设置为 1 或 0:
echo 0 > /proc/sys/vm/swappiness
# This will set it permanently, to continue after reboot
sysctl -w vm.swappiness=1
你可以确保你的缓存压力是100,或者更大;
echo 100 > /proc/sys/vm/vfs_cache_pressure
# Set permanently for after restart
sysctl -w vm.vfs_cache_pressure=100
了解所有这些选项及更多信息这里。
另一个选择是将所有文件放在 ramdisk 上;这是 VPS 内存中的分区。查看说明这里和这里。当然,对于此选项,请注意 ramdisk 在重启时会被破坏。它将被重新创建为空,因此在启动时,创建并安装 ramdisk,然后将文件复制到它上面。不要让它成为它们的唯一副本 :)