Есть сайт с приличной нагрузкой часть пользователей на котором отваливаются по 504 ошибке. nginx отдает статику, apache разруливает php. mysql крутится на другой машинке. Узкое место больше склоняюсь в mysql. Немного о той машинке: core duo, 8 gb ОЗУ Загрузки по процессору нет, la меньше 1. iowait в среднем 10% - вся база в память не лезет. mtop показывает кучу sleep'ов и есть запросы которые обрабатываются по/более 50 секунд судьба их дальше не известна. Примерная картина в mtop:
"mysql.allow_persistent = On" Off как то боязно пробовать. Смущает "Cache Hit: 99.93%" На графике оно вроде так же присутствует, но пропорции не 99%.
Мысли - что дело не в железе/нагрузке, а некорректной работе/недонастроенном bitrix'е Так как машинка досталась недавно в настройках php_interface/dbconn.php там: define("CACHED_b_iblock", false); define("DBPersistent", true); @ini_set("memory_limit", "96M"); Подскажите, куда копнуть, что подстроить. зы: машинка на Linux
Причина: спящие процессы появляются потому, что при коннекте к базе данных используется mysql_pconnect "define("DBPersistent", true);", можно, конечно, отключить, но тогда нагрузка на сервак будет при постоянных коннектах к MySQL, отсюда возникает необходимость подчищать лишние коннекты(которые,между прочим, держат ресурсы сервера), почему до этого не додумались разработчики продукта - сие тайна . Решение: добавить в функции API битрикса Connect() Disconnect() следующий код(куда думаю сам разберешься):
Код
$result=mysql_query("SHOW PROCESSLIST");
while ($row=mysql_fetch_array($result))
{
$process_id=$row["Id"];
if ($process_id <> $this->db_Conn) //это чтобы не убить текущий коннект
{
if (($row["Time"] > 20 ) && ($row["Command"]=="Sleep") )
{
//print $row[”Id”];
$sql="KILL ".$process_id." ";
mysql_query($sql);
}
}
}
Время существования спящих процессов можешь выбрать сам, у меня стоит 20 секунд $row["Time"] > 20; Итог: нагрузка на сервер значительно уменьшилась, и пользователей перестало выбивать.
читай выше, отредактировал сообщение(добавил пояснение);
Цитата
Причина: спящие процессы появляются потому, что при коннекте к базе данных используется mysql_pconnect "define("DBPersistent", true);", можно, конечно, отключить, но тогда нагрузка на сервак будет при постоянных коннектах к MySQL, отсюда возникает необходимость подчищать лишние коннекты(которые,между прочим, держат ресурсы сервера), почему до этого не додумались разработчики продукта - сие тайна .
Интересно а как вы понимаете смысл работы mysqlp_connect? Он и используется для того чтобы при повторном соединение не открывать коннект, соответственно и процессы должны ждать. Дело не в продукте а в настройке сервера.
Интересно а как вы понимаете смысл работы mysqlp_connect? Он и используется для того чтобы при повторном соединение не открывать коннект, соответственно и процессы должны ждать
В том то и дело, для следующего коннекта оставляем текущий коннект, и все коннекты время "сна" которых меньше определенного времени ( у меня 20 секунд), потому что при следующих коннектах он не цепляется к спящим, а создает новые. И вот чтобы новые не создавались до предела( числа соединений к базе данных) вот для этого и создан этот код.