Управление памятью в Linux и большие файлы

Я получаю объекты изображений с удаленного сервера, а затем пытаюсь загрузить их в облачные файлы Rackspace с помощью их API. Интересно, а) как я могу сделать этот процесс более эффективным, и б) если предположить, что мне нужно будет купить больше памяти, какой разумный объем ОЗУ может быть для выполнения этой задачи (текущий сервер разработки занимает всего 512 МБ).

При выполнении сценария я:

  • Опрос моей локальной базы данных для набора идентификаторов (около 1 тысячи)
  • Для каждого идентификатора при запросе к удаленному серверу, который возвращает от 10 до 20 объектов изображения, каждое изображение составляет 25-30 тыс.
  • Создайте контейнер Cloud Files на основе идентификатора из моей базы данных
  • Для каждого объекта изображения, возвращенного с удаленного сервера, создайте объект изображения в моем контейнере и запишите данные изображения в этот объект
  • Обновить строку в локальной базе данных с датой и временем добавления изображений

Это выполняется относительно быстро на небольшом наборе идентификаторов, однако 100 (таким образом, 700-1k изображений) могут занять 5-10 минут, и все, что больше, чем это кажется, работает бесконечно. Пробовал следующее с небольшим успехом:

  • используя php set_timeout, чтобы убить скрипт через пару минут, полагая, что это очистит память, выделенную для выполнения, что позволит мне выбрать, где я остановился, и поработать над набором - это мелкие кусочки. Однако эта ошибка никогда не выдается
  • после загрузки загрузите ключ массива, содержащий объект изображения (а не только ссылку внутри цикла).

PHP memory_limit установлен на 128 МБ, и при выполнении команды 'tops' я вижу, что пользователь 'www-data' потребляет 16% ресурсов памяти. Однако это больше не появляется в списке пользователей, но я продолжаю видеть это:

PID  USER      PR   NI VIRT RES  SHR  S %CPU %MEM  TIME+    COMMAND
2400 mysql     20   0  161m 8220 2808 S    0  1.6  11:12.69 mysqld

... но ВРЕМЯ + никогда не меняется. Я вижу, что все еще выполняется 1 задача, но эти значения никогда не меняются:

Mem:    508272k total,   250616k used,   257656k free,     4340k buffers

Извиняюсь за длинный пост - не совсем уверен, что (если таковое имеется) полезно. Это не моя область знаний, поэтому немного цепляюсь за соломинку. Заранее спасибо за помощь.

1 ответ

Решение

MySQL - это демон - он будет работать и сидеть в памяти до тех пор, пока не умрет или не убьет его. TIME+ - это количество процессорного времени, использованное с момента последнего перезапуска. Если он простаивает (%CPU = 0), то TIME+ не будет увеличиваться, поскольку время процессора не было использовано.

Вы проверили, не пропускает ли API-интерфейс cloudfiles какие-либо дескрипторы? Возможно, вы отключаете объект изображения, который вы получили от вашего сервиса (service->you), но API Cloudfiles все равно должен отправить это изображение обратно за дверь (you->Rackspace), и это может привести к утечке.

Другие вопросы по тегам