我正在尝试使用以下简单的wget
命令来下载580MB的文件:
wget http://example.com/file.ext
服务器安装了16 GB的RAM,在整个下载过程中,内存使用率从10%增加到99%。
如何下载一个580MB的文件需要超过14GB的内存?
我怀疑问题是与内存的方式看着。
假设正在使用Linux或类似的系统,内存有两部分 – 应用程序和缓冲区/caching使用的实际内存。 我怀疑你所看到的是缓冲区/高速缓冲存储器的填满,并显示less量的空闲内存 – 当然这是有点误导,因为只要它需要的内存可以重新分配给其他需要它的程序。
IE这与WGET无关,一切与Linuxpipe理内存的方式有关 – 它是“最无害的”,因为caching/缓冲区使用的内存可以按需恢复。
除非您将文件下载到/dev/shm
或tmpfs
文件系统,否则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
或者它所使用的共享库真的存在一些问题。 到那时,你需要转向lsof
或strace
或其他类似的工具来弄清楚什么是错的。