2013-02-14 2 views
0

Я думаю, этот вопрос похож по теме на PHP cli Memory usage optimization, но этот вопрос был решен, когда плакат обнаружил простую ошибку кодирования.Оптимизация использования памяти многопоточного приложения PHP. Соответствует ли технология APC или другой технологии кэширования памяти?

У меня есть многопоточное приложение PHP (CLI), которое работает непрерывно. Я пытаюсь оптимизировать использование памяти, потому что объем памяти, используемой каждым потоком, ограничивает количество потоков, которые я могу запускать в любой момент времени (так как у меня есть ограниченный объем доступной памяти). После некоторого расследования кажется, что МИНИМАЛЬНЫЙ объем памяти, который использует каждый процесс с резьбой, составляет около 1,3 МБ. Кажется немного высоким, но после некоторого копания вокруг кажется, что PHP выделяет память в кусках примерно 0,5 МБ. Я сомневаюсь, что я могу получить приложение достаточно, чтобы использовать менее 0,5 МБ, но я бы хотел попробовать. Даже если вы порезали участок на 10-20%, это было бы здорово.

Один из вариантов, который я рассматриваю, - это использование APC для кэширования некоторых данных в памяти. Это кажется интуитивно понятным как способ уменьшения памяти, но в настоящее время я делаю довольно частые обращения к MySQL db для хранения и извлечения данных. Вот небольшой пример:

<?php 
function get_stored_token(){ 
    connect_db(); 

    $query_result = mysql_query("select token from tokens"); 
    if ($query_result == true){ 
      $query_result_array = mysql_fetch_row($query_result); 
      $token = $query_result_array[0]; 
      unset($query_result, $query_result_array); 
      return $token; 
    } 
    else { 
      echo "Problem with query to get stored token!\n"; 
    } 
} 

Похоже, что накладные расходы на память с использованием MySQL таким образом. Это подтверждается вызовом pmap -d PID | grep mysql, где особенно libmysqlclient_r.so.16.0.0 использует много памяти. Таким образом, возможно, простой метод кэширования пар ключ/значение в памяти на самом деле был бы легче с точки зрения памяти? Однако у меня нет опыта в этом, поэтому я хотел бы услышать отзывы об этой идее, прежде чем экспериментировать с APC (или другой технологией кэширования).

Любые другие идеи о том, как оптимизировать использование памяти в PHP, будут наиболее приветствуемыми!

ответ

0

Лично я бы использовал memcached для взаимодействия db, что бы ускорить обработку обработки потоков довольно много. Это может не уменьшить общее использование памяти, но это увеличит скорость выполнения, чтобы вы могли быстрее и быстрее открывать и закрывать потоки потоков, но не все, что происходит сразу.
Если 2 процесса, которые заняли 1 минуту, теперь занимают 30 секунд каждый, то оба процесса могут удвоиться по использованию памяти и использовать только 30 секунд, каждый из которых по-прежнему в целом в минуту, но быстрее.

0

Почему вы не используете термин WHERE? в SQL эта часть определяет, сколько строк будет загружено на php, если вы ищете первый/последний идентификатор в БД, для этого используйте функцию SQL. в общем, передача данных SQL в php будет потреблять память.

Я думаю, если это таблица, которая закодирована только для выбора для всех пользователей и не будет изменена пользователями Memcahe, будет полезна для этого. Memcashe PHP

+0

В этой конкретной таблице есть только одна строка. Поэтому я не уверен, что предложение, которое поможет вам. Но я могу попробовать ... – robguinness

Смежные вопросы