Управление памятью в 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), и это может привести к утечке.