我正在尝试使用以下简单命令下载 580MB 的文件wget
:
wget http://example.com/file.ext
服务器安装了 16 GB 的 RAM,在整个下载过程中,内存使用率从 10% 增加到 99%。
下载一个 580MB 的文件怎么会需要超过 14GB 的 RAM 呢?
答案1
除非您正在将文件下载到文件/dev/shm
系统tmpfs
,否则 wget 本身不应该使用 GB 的内存。哎呀,它甚至不应该使用兆字节的内存。
不太可能会wget
消耗那么多内存。您如何检查其使用情况?
如果您运行top -o RES
它,它将按内存(非共享)利用率排序。忽略该VIRT
列,查看RES
大小列。如果没有显示单位(KB、MB、GB),则很可能以 KB 为单位进行报告。
您可以使用ps aux
(或大量其他标志配置)获取每个进程的内存利用率。查看RSS
进程的非共享内存大小列。这将以 KB 为单位报告大小。
如果有帮助的话,这里有一个简单的方法来显示使用了多少。打开两个到服务器的 shell 会话。第一次运行这个 while 循环:
while true
do
ps -eo size,command | awk '/wget/&&!/ps.*awk/{print $1, "KB", $2}'
sleep 5
done
在第二个会话中运行wget command
。在第一个终端会话中,您应该看到类似以下的输出:
$ 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
每五秒运行一次并准确告诉您该进程使用了多少内存。
如果它使用了 GB 的内存……那么,它使用的共享库一定出了问题wget
。此时,您需要使用lsof
或strace
或其他类似的实用程序来找出问题所在。
答案2
我怀疑问题在于看待记忆的方式。
假设使用的是 Linux 或类似系统,内存分为两部分 - 应用程序使用的实际内存和缓冲区/缓存。我怀疑您看到的是缓冲区/缓存内存已满,并且显示几乎没有可用内存 - 当然这有点误导,因为只要需要内存,就可以重新分配给需要它的其他程序。
IE 这与 WGET 无关,而与 Linux 管理内存的方式有关 - 它“基本上无害”,因为缓存/缓冲区使用的内存可以根据需要恢复。