Назад | Перейти на главную страницу

Почему загрузка большого файла с помощью wget, похоже, занимает почти всю доступную оперативную память?

Я пытаюсь загрузить файл размером 580 МБ с помощью следующего простого wget команда:

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

На сервере установлено 16 ГБ оперативной памяти, и в течение всей загрузки использование памяти увеличивается с 10% до 99%.

Как это возможно, что для загрузки файла размером 580 МБ требуется более 14 ГБ ОЗУ?

Если вы не загружаете файл на /dev/shm или tmpfs Файловая система wget сама по себе не должна использовать гигабайты памяти. Черт возьми, оно не должно стоить даже мегабайт.

Маловероятно, что wget потребляет столько памяти. Как вы проверяете его использование?

Если ты бежишь top -o RES он будет отсортирован по использованию памяти (не разделяемой). Игнорировать VIRT столбец, посмотрите на RES столбец для размера. Если единица измерения (КБ, МБ, ГБ) не отображается, скорее всего, она отображается в КБ.

Ты можешь использовать ps aux (или множество других конфигураций флагов), чтобы получить информацию об использовании памяти для каждого процесса. Посмотрите на RSS столбец для размера не разделяемой памяти для процесса. Это сообщит размер в КБ.

Если это поможет, вот простой способ показать, сколько используется. Откройте два сеанса оболочки для вашего сервера. При первом запуске этот цикл 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 каждые пять секунд и сообщать вам, сколько именно памяти используется этим процессом.

Если он использует гигабайты памяти ... ну, что-то действительно, действительно не так с wget или используемые им разделяемые библиотеки. В этот момент вам нужно обратиться к lsof или strace или другие подобные утилиты, чтобы выяснить, что не так.

Я подозреваю, что проблема в том, как просматривается память.

Предполагая, что используется Linux или аналогичная система, память состоит из двух частей - фактической памяти, используемой приложениями, и буфера / кеша. Я подозреваю, что вы видите заполнение буфера / кеш-памяти и показ мало свободной памяти - конечно, это несколько вводит в заблуждение, потому что как только это потребуется, память может быть перераспределена для других программ, которые в ней нуждаются.

IE Это не имеет ничего общего с WGET и полностью связано с тем, как Linux управляет памятью - это «в основном безвредно», поскольку память, используемая кешами / буферами, может быть восстановлена ​​по запросу.