考虑以下场景:
- 我正在运行 lighttpd-1.4.19,我正在通过它处理大量上传(数百 MB 但小于 1GB)。
- 服务器在 Ubuntu 8.04 LTS 上运行。
- 文件临时写入 /var/tmp。
- PHP5 正在通过 fastcgi 处理最终结果。
- 在上传期间,上传块被写入临时目录。
奇怪的是,虽然这些块是写在磁盘上的,但在上传过程中,服务器上的可用内存逐渐减少到完整的文件大小。我会理解 RAM 会随着每个块的大小(比如说 1-2MB)而减少,直到它们被写入磁盘,但我不明白为什么它是整个文件大小(比如说 300MB)。
- 你知道为什么虽然块被写入磁盘,但为什么整个文件都要占用 RAM 吗?是否有可能 /var/tmp 直接安装在内存中?与 /tmp?
- 如果没有,您是否知道如何诊断以及如何确定哪个进程占用了内存?我没有看到 lighttpd 或 php-cgi 进程随着 ps 的增加而增加,但也许我看的不是正确的东西。
- 或者更好的是,您是否有关于一个好的 Web 服务器(Apache、Nginx、lighttpd 等)和配置来处理大型上传而不将所有内容存储在 RAM 中的建议?
谢谢!
如果 lighttpd 或 php-cgi 的大小没有增加,请不要担心 - 您看到的增加不是这些进程的 RAM 消耗,而是内核对磁盘缓存的使用。基本上,由于您只是将这些大文件写了出来,内核将它们保留在内存中,假设您可能想再次读取它们。如果其他进程需要该内存,它当然会删除此缓存。