为什么用wget下载一个大文件似乎占用了几乎所有可用的内存?

我正在尝试使用以下简单的wget命令来下载580MB的文件:

 wget http://example.com/file.ext 

服务器安装了16 GB的RAM,在整个下载过程中,内存使用率从10%增加到99%。

如何下载一个580MB的文件需要超过14GB的内存?

我怀疑问题是与内存的方式看着。

假设正在使用Linux或类似的系统,内存有两部分 – 应用程序和缓冲区/caching使用的实际内存。 我怀疑你所看到的是缓冲区/高速缓冲存储器的填满,并显示less量的空闲内存 – 当然这是有点误导,因为只要它需要的内存可以重新分配给其他需要它的程序。

IE这与WGET无关,一切与Linuxpipe理内存的方式有关 – 它是“最无害的”,因为caching/缓冲区使用的内存可以按需恢复。

除非您将文件下载到/dev/shmtmpfs文件系统,否则wget本身不应使用千兆字节的内存。 哎呀,它甚至不应该使用兆字节值。

wget不太可能消耗那么多的记忆。 你如何检查它的使用情况?

如果运行top -o RES ,则会按内存(非共享)利用率进行sorting。 忽略VIRT列,查看RES列的大小。 如果没有显示单位(KB,MB,GB),则最有可能以KB为单位进行报告。

您可以使用ps aux (或其他多种标志configuration)来获取每个进程的内存利用率。 查看进程的非共享内存大小的RSS列。 这将以KB为单位报告大小。

如果有帮助,这是一个简单的方法来显示使用多less。 打开两个shell会话到您的服务器。 在第一次运行while循环时:

 while true do ps -eo size,command | awk '/wget/&&!/ps.*awk/{print $1, "KB", $2}' sleep 5 done 

在第二次会议上运行你的wget command 。 在第一个terminal会话,你应该看到类似这样的输出:

 $ bash loop.sh 516 KB wget 516 KB wget 516 KB wget 516 KB wget ... (so on and so forth until you CTRL-C out of the while loop) 

它会每五秒运行一次ps并告诉你该进程正在使用多less内存。

如果使用的是千兆字节的内存……那么, wget或者它所使用的共享库真的存在一些问题。 到那时,你需要转向lsofstrace或其他类似的工具来弄清楚什么是错的。