Я пытаюсь понять использование памяти некоторыми 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