Управление памятью в Linux и большие файлы - PullRequest
0 голосов
/ 25 января 2011

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

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

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

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

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

PHP memory_limit установлен на 128 МБ, и при выполнении команды «tops» я вижу, что пользовательские «www-данные» занимают 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 Ответ

0 голосов
/ 25 января 2011

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

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

...