请考虑以下情形:
- 我正在运行 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 中?
谢谢!
答案1
如果 lighttpd 或 php-cgi 的大小没有增加,那么不用担心 - 您看到的增加不是这些进程的 RAM 消耗,而是内核对磁盘缓存的使用。基本上,由于您刚刚写出这些大文件,内核会将它们保留在内存中,假设您可能想要再次读取它们。如果其他进程需要该内存,它当然会删除此缓存。