Как найти и исправить утечки памяти внутри Apache + PHP + Win2k3 - PullRequest
0 голосов
/ 10 июня 2009

Хорошо, ребята,

У нас есть Apache 2.2.11, работающий с mod_php 5.2.9-2 на компьютере под управлением Windows Server 2003 (Small Business Edition), и каждый запрос выскакивает примерно от 4 до 8 МБ ОЗУ, а затем освобождается примерно от 2 до 6 МБ. , По сути, количество выпусков Apache всегда заметно меньше (в мегабайтах), чем количество, которое он выделяет во время запроса, и через несколько часов процесс httpd.exe завершает потребление всей доступной оперативной памяти, и сервер зависает.

Такое поведение не происходит вообще на наших блоках разработки под Windows XP с той же кодовой базой и следующими конфигами:

  • XP / Apache 2.2.11 / PHP5.2.9-2 / MySQL 5.1.34
  • XP / Apache 2.0.x (разные) /PHP5.2.7/MySQL 5.0.67

Простые PHP-скрипты на производственном сервере (Win2k3) не имеют утечки, например:

  • Основные функции PHP эхо
  • Создание и ссылки на классы
  • Буферизация вывода
  • PDO с постоянными подключениями и без них

Однако при запуске нашего полного приложения все начинает протекать. Единственное, о чем мы можем думать, это может вызвать использование объектов, деталей сеанса, глобальных переменных - но как я могу узнать, что такое утечка? И что это вызывает? Не нарушая слишком много единственной машины, которую мы можем продублировать на ??

1 Ответ

1 голос
/ 10 июня 2009

PHP имеет свои собственные функции памяти, и вы можете создавать магические функции __destroy для мониторинга объектов. Я лично сделал бы тестовую копию, сделал бы несколько правок, чтобы вы могли отслеживать оперативную память и видеть, где она увеличивается или уменьшается.

Лично я бы сначала предположил, что это проблема кеширования, с увеличением памяти, но если это делает систему нестабильной, то это явно не так просто.

  echo "Before SomeStrangeObject == ".memory_get_usage()."<br>";
  $x = new SomeStrangeObject();
  echo "During SomeStrangeObject == ".memory_get_usage()."<br>";
  unset($x);
  echo "After SomeStrangeObject == ".memory_get_usage()."<br>";

И просто поищите очевидный лук-порей. Извините, я не могу быть более полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...