Варианты посчитать производительность большого приложения

Alkinoy

Начинающий
Народ, трям.
Ситуация - есть достаточно большое приложение. Кучка файликов, кучка классов. В зависимости от действий пользователя - подключаются разные классы/файлы. все идет через фронт контроллер (ну почтивсе), но в классах/файлах понатыкано куча экзитов. Используются глобальные переменные. Проект достаточно высоконагружен (десятки тысяч в сутки).
задача - посмотреть на производительность приложения, найти наиболее узкие места и сделать это оперативно.

Как планирую решать.
1-й вариант. Создаю статический класс, потом в разных "подозрительных" местах вызываю его для записи данных измерения. Не нра по причине что я не увижу реального движения запроса пользователя - получу только среднюю производительность отдельных участков (и мороку из-за высокой нагруженности).

2-й вариант. Создать для каждого пользователя объект, который будет считать нагрузку и передавать его по всем вызовам. Не нра по причине - надо переписывать все вызовы... Ну не все - но надо постоянно следить - передался ли этот объект в текущий объект/метод...

3-й вариант. То, на чем остановился. Да, глобальные переменные - зло. Но запихнуть объект, который будет собирать статистику, в глобальные переменные, потом просто добавлять соответствующие вызовы его методов для измерения в разных частях проекта. Не надо думать о доступности объекта - он будет создаваться во фронт-контроллере. Нет необходимости в длительной подготовке - работать метод начинает сразу, постепенно можно расширять его по всему коду.

Собственно, если кто делал что то подобное - выслушаю критику/советы. Спасибо.
 

korchasa

LIMB infected
Посмотри в сторону xhprof. Его в отличие от xdebug можно и в бою запускать, и статистику он собирает автоматом.
 

whirlwind

TDD infected, paranoid
В формате лога 2-го апача есть возможность записывать время выполнения запроса в микросекундах. Мы так искали критичные запросы, а потом уже их детально разбирали. А критичный это не просто самый медленный, а еще и количество в сутки нужно учитывать. Например, если регистрация выполняется 10 секунд, а просмотр профиля 1 секунду и при этом профилей в сутки в среднем просмотрено 100 штук, а регистраций всего 1, то тюнить надо профиль в первую очередь.
 

AmdY

Пью пиво
Команда форума
Посмотри в сторону xhprof. Его в отличие от xdebug можно и в бою запускать, и статистику он собирает автоматом.
а он разве часиками не пользуется, основной оверхед вроде будет из-за определения времени, а профайлинг без этого невозможен. но профайлер можно отключить и запускать по триггеру, тогда доп нагрузки на все запросы не будет?
 

Alkinoy

Начинающий
Народ, спасибо за советы.
смотрю по указанным продуктам, но вопросы остаются. Либо надо устанавливать доп модули (пока недоступно), либо вопрос расстановки маркеров по коду так же остается... Наверное именно расстановка маркеров по коду - бОльший вопрос. Пробовал локально зенд профайлер - красиво, но на продакшн не получится поставить...
 

korchasa

LIMB infected
а он разве часиками не пользуется, основной оверхед вроде будет из-за определения времени, а профайлинг без этого невозможен. но профайлер можно отключить и запускать по триггеру, тогда доп нагрузки на все запросы не будет?
Там точно дело в часиках? xdebug у меня тормозит приложение на порядок, а hxprof "всего" в пару раз.
 
  • Like
Реакции: AmdY

weregod

unserializer
пускал xdebug только под win32, hxprof не трогал.
по xdebug: смотрел сорцы, ничего сверхнеожиданного не было. imho тормоза из-за записи в лог данных профилирования.
 

Фанат

oncle terrible
Команда форума
Если маркеры ставить только в начале и в конце, то auto_prepend/append_file вполне cгодятся.

По поводу тормозить - Пинба, по идее, не должна совсем.
 

korchasa

LIMB infected
пускал xdebug только под win32, hxprof не трогал.
по xdebug: смотрел сорцы, ничего сверхнеожиданного не было. imho тормоза из-за записи в лог данных профилирования.
А как он вызовы замеряет? Если его включить, то инклуды начинают отъедать половину времени.
 

weregod

unserializer
А как он вызовы замеряет? Если его включить, то инклуды начинают отъедать половину времени.
перехватывает php-шные хуки. я тогда конкретно в момент тормозов не вникал, искал рюшечки на предмет профилирования обращений к переменным (не нашёл :()
 

fixxxer

К.О.
Партнер клуба
А нафиг тут пинба? Она удобна для сбора статистики по времени обработки конкретных запросов целиком - от получения запроса до отдачи ответа. А внутри приложения в любом случае маркеры для таймера расставлять. Если нет задачи такие таймеры собирать с нескольких серверов сразу - дык ручками ж куда угодно писать это 10 строк кода.

Я бы делал по 3-му варианту, только синглтоном а не глобалсами (хотя пофиг)

Поубывав бы.

Можно поменять глобал реплейсом на throw new ExitException, ловить во фронт контроллере и логировать бэктрейс. И понемногу расчищать.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
<?php
class _MemoryWatchDog {
	static protected $uid = 0;
	static protected $host = '';
	static protected $uri = '';
	static protected $checkpoints = array();
	
	static public function checkpoint($name) {
		self::$checkpoints[$name] = array(
			'time'  => time(),
			'name'	=> $name,
			'memory'=> memory_get_usage(true),
			'peak'	=> memory_get_peak_usage(true),
			'method'=> $_SERVER['REQUEST_METHOD']
		);
	}
	
	static public function save() {
		self::$uid = uniqid(rand(10000,99999));
		self::$host = $_SERVER['SERVER_NAME'];
		self::$uri = $_SERVER['REQUEST_URI'];
		$array = array(
			'uid' 	=> self::$uid,
			'host'	=> self::$host,
			'uri'	=> self::$uri,
			'checkpoints' => self::$checkpoints
		);
		$filename = __DIR__.'/logs/'.date('d-m-Y').'.log';
		if (!file_exists($filename)) { touch($filename); chmod($filename, 0777); }
		file_put_contents($filename, serialize($array)."\n", FILE_APPEND);
	}
}
_MemoryWatchDog::checkpoint('__start');
?>
У меня 34 получилось :)
Это пихается в auto_prepend_file, в auto_append_file что то вроде
PHP:
<?php
_MemoryWatchDog::checkpoint('__finish');
_MemoryWatchDog::save();
?>
Ну, и чекпоинты потом в нужные места, для отладки. За один вечер у людей так отловил немало бяки.
 
Сверху