Intereting Posts
Использование регулярного выражения для удаления пустых тегов абзаца <p> </ p> (стандартное str_replace в «пробеле» не работает) Почему это создает черное изображение? Передача значения GET из формы HTML в Twitter API 1.1 PHP Невозможно изменить значение xml с помощью PHP Отправка данных с PHP-скрипта на C # applicationicaon Вопросы API EmberJS с использованием PHP Сложность с объединением 3 таблиц в запросе в php Как я могу отправить данные с веб-страницы на последовательный порт компьютера посетителя? Многолинейный режим Regex не работает как ожидалось для дополнительной группы file_put_contents, file_append и разрывы строк невозможно подключиться к Google Cloud Connection Server Функция незаписанного сдвига вправо не работает для отрицательного входа Как управлять разрешениями файлов, когда плагин php netbeans загружает файл с FTP Как получить «данные» из запросов JQuery Ajax Регулярное выражение PHP с круглыми скобками

Понимание памяти_get_usage () и pmap

Я пытаюсь понять использование памяти некоторыми php-процессами. Я пробовал использовать оба get_memory_usage() и pmap , но результаты кажутся отключенными примерно на один порядок. Я пробовал с memory_get_usage() и memory_get_usage(true) , а также memory_get_peak_usage(true) , но даже с memory_get_peak_usage(true) (самый большой из всех трех разновидностей) все еще существует огромное количество информации о том, что сообщается через pmap.

Более конкретно, вызов memory_get_peak_usage(true) каждую минуту в моем PHP-скрипте возвращает значения в диапазоне от 1,75 МБ до 3,5 МБ, тогда как типичный результат pmap -d PID дает что-то вроде:

 ... b7839000 4 r---- 0000000000008000 0ca:00060 libcrypt-2.11.1.so b783a000 4 rw--- 0000000000009000 0ca:00060 libcrypt-2.11.1.so b783b000 156 rw--- 0000000000000000 000:00000 [ anon ] b7864000 8 rw--- 0000000000000000 000:00000 [ anon ] b7867000 12 rx-- 0000000000000000 0ca:00060 libgpg-error.so.0.4.0 b786a000 4 r---- 0000000000002000 0ca:00060 libgpg-error.so.0.4.0 b786b000 4 rw--- 0000000000003000 0ca:00060 libgpg-error.so.0.4.0 b786c000 4 r---- 0000000000000000 000:00000 [ anon ] b786d000 16 rw--- 0000000000000000 000:00000 [ anon ] b7871000 108 rx-- 0000000000000000 0ca:00060 ld-2.11.1.so b788c000 4 r---- 000000000001a000 0ca:00060 ld-2.11.1.so b788d000 4 rw--- 000000000001b000 0ca:00060 ld-2.11.1.so bffc7000 136 rw--- 0000000000000000 000:00000 [ stack ] f57fe000 4 rx-- 0000000000000000 000:00000 [ anon ] mapped: 32740K writeable/private: 13116K shared: 28K 

Если я правильно понимаю, записываемая / частная цифра является наиболее важной фигурой, потому что это память, используемая исключительно процессом. Почти 13 МБ далека от количества, memory_get_peak_usage(true) . Может кто-нибудь объяснить объяснение несоответствия?

Я понимаю, что memory_get_peak_usage() вернет объем памяти, используемый вашим скриптом. Таким образом, это не включает накладные расходы на PHP.

Возвращает пик памяти в байтах, который был выделен для вашего PHP-скрипта.

Вы можете уменьшить память, используемую PHP, скомпилировав меньшее количество расширений.

Сам PHP – большое приложение, особенно с расширениями по умолчанию. Мы (как разработчики php) получаем для написания простой код, например simplexml_load_string() и наблюдаем, как происходит волшебство, но код, который simplexml_load_string() магию, где-то в памяти. Глядя на вывод phpinfo() узнаете, сколько расширений установлено. Внутри PHP сидит код, который займет ваш PHP и преобразует его в OPCODE, а затем код, который выполняет эти коды операций. Каждый экземпляр PHP, как его выполнение, будет нести эти накладные расходы.

Это использование памяти явно нетривиально, но можно ожидать. Если вам нужно было написать весь код для обработки входящих GET / POST / FILES управления XML, файлами и потоковой магией и т. Д. Использование памяти будет складываться быстро.

В результате общей техникой работы является удаление всех ненужных расширений для сокращения размера исполняемого файла. Для серверов с ограниченным объемом памяти (которые являются наиболее загруженными) удаление нескольких расширений и уменьшение использования памяти с 9 до 7 мегабайт приводит к запуску большего числа работающих apache.

Эти накладные расходы не разделяются, поскольку каждое выполнение действительно является отдельной копией выполнения PHP. Там альтернативы доступны с использованием поточных безопасных построений, но не все расширения PHP являются потокобезопасными.

Удаление расширений Ознакомьтесь с функциями, которые вы используете. mysqli_* ? xml_* ? и т. д. Также взгляните на то, как PHP строится, вот моя строка конфигурации:

Configure Command => './configure' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-mysql=mysqlnd' '--with-gd' '--enable-soap' '--with-libxml-dir=/usr/lib/' '--with-mysql-sock=/tmp' '--with-tidy' '--with-jpeg-dir=/usr/lib/' '--with-xsl' '--with-curl' '--with-zlib' '--enable-gd-native-ttf' '--with-openssl' '--with-mcrypt' '--with-pdo-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-bz2' '--enable-bcmath'

Если бы я брелся в памяти, я бы начал с создания PHP с помощью ./configure --disable-all (для удаления расширений по умолчанию), а затем явным образом добавляя только расширения, которые я использовал, я использовал. Я больше не использую libxml для своего кода, а не soap поэтому я могу удалить эти биты. Я могу передать свою tidy работу персоналу-редуктору и командной строке, так что я тоже потянет это. Тогда бег, хотя мой код (с модульным тестированием был бы фантастическим здесь) и увидев, что сломалось. Перестройте PHP с необходимым расширением, полосканием и повторением. Ясно, что не делайте этого на производстве, иначе у вас будет плохое время .

Байты против битов – это фактор 10. Следовательно, 1.3 MBytes = 13MBits