Мне нужно найти некоторую меру того, как долго мои запросы берутся и загрузка на сервере, если это возможно.
Я сомневаюсь, что это возможно, но я хотел бы также использовать процессор.
Есть идеи?
Синтаксис PHP
$starttime = microtime(); $query = mysql_query("select * from table"); $endtime = microtime();
Затем вычислите разницу между $ starttime и $ endtime.
Посмотрите на профилировщик запросов. Это может сделать бит времени запроса того, что вам нужно.
https://www.digitalocean.com/community/tutorials/how-to-use-mysql-query-profiling
https://dev.mysql.com/doc/refman/5.5/en/show-profile.html
Существуют различные инструменты для просмотра нагрузки на сервер
Почти невозможно, если ваша база данных и веб-сервер расположены по-разному
плюс вы пытаетесь добиться этого с помощью PHP
ограничение
uptime
при каждом выполнении запроса, является излишним обходной путь
встроить cronjob в ваш сервер базы данных,
периодически отправляется по электронной почте, если загрузка сервера повышается
Или
в базе данных,
периодически отправлять электронную почту по текущему запущенному запросу, используя
show full processlist
Пример для хранения ПОКАЗАТЬ ПОЛНЫЙ ПРОЦЕССИСТОР
$con = mysqli_connect(...) or die('unable to connect'); $sql = "show full processlist"; $res = mysqli_query($con, $sql) or die($sql); /* optional path is /tmp */ $fp = fopen('/tmp/'.date('YmdHis'), 'w+'); while ($row = $res->fetch_row()) { fputcsv($fp, $row); } $res->free_result();
Вышеприведенное должно быть достаточным для того, чтобы сбрасывать текущий список процессов mysql в файл.
В linux box имеется множество команд, позволяющих пользователю показывать загрузку процессора.
Но это окна, я думаю, вы можете найти с помощью некоторого поиска в google SO
Существует довольно много информации, которую вы можете получить о работе базы данных
SHOW STATUS;
запрос.
Я бы предположил, что переменная Last_query_cost может быть весьма полезна для ваших целей измерений. Также как Slow_queries, который покажет количество запросов, которые выполнялись дольше, чем определенное количество времени. Полный список этих переменных находится здесь http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html Существует также функция php mysql_stat () php, которая возвращает некоторые данные об использовании базы данных , Например, запросы в секунду могут быть несколько полезными. Но для получения более определенных данных потребуется ssh-доступ к базе данных.
используйте microtime
для измерения времени, необходимого для запроса.
Для загрузки сервера см. http://www.php.net/manual/en/function.sys-getloadavg.php . Использование ЦП в основном не имеет значения, поскольку mysql будет привязан к диску большую часть времени.
Для более подробной статистики вам следует использовать mysqli :: get_connection_stats (если вы используете php 5.3+)
http://www.php.net/manual/en/mysqli.get-connection-stats.php
PHP действительно может только время выполнения mysql_query()
, которое включает в себя все время туда и обратно, время ожидания и время передачи. Чтобы разбить, вам нужно будет использовать профилировщик MySQL, как уже упоминалось. Следующий код должен выводить информацию, которую вам нужно знать. Если вы хотите включить профилирование в свой PHP-процесс, вам нужно будет использовать профилировщик и выбрать соответствующие поля из таблицы information_schema.profiling
, но если нужно просто проверить производительность, приведенное ниже должно быть достаточно.
<?php $con = mysql_connect("localhost","root","my-password"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my-database", $con); function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } mysql_query("set profiling=1;"); $starttime = microtime_float(); $query = mysql_query("SELECT * FROM my-table"); $endtime = microtime_float(); $trans_result = mysql_query("select sum(duration) as transtime from information_schema.profiling where query_id=1"); $transtime = mysql_result($trans_result, 0, 'transtime'); $total_time = ($endtime - $starttime); $transtime = ($total_time - $transtime); echo 'Total time: '.$total_time.' secs<br />'; echo 'Transfer time: '.$transtime.' secs<br />'; echo 'Query time break-down;<br />'; $debug_result = mysql_query("show profile cpu for query 1;"); while ($row = mysql_fetch_assoc($debug_result)) { echo $row['Status'].' (Time: '.$row['Duration'].', CPU_User: '.$row['CPU_user'].', CPY_sys: '.$row['CPU_system'].')<br />'; } ?>
Когда вы довольны производительностью, удалите все, кроме запроса MySQL, который вы хотите.