Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

nginx apache bitrix mysql. Много sleep'ов в mysql. 504

00 голосов
7
Есть сайт с приличной нагрузкой часть пользователей на котором отваливаются по 504 ошибке.
nginx отдает статику, apache разруливает php. mysql крутится на другой машинке.
Узкое место больше склоняюсь в mysql. Немного о той машинке:
core duo, 8 gb ОЗУ Загрузки по процессору нет, la меньше 1. iowait в среднем 10% - вся база в память не лезет. mtop показывает кучу sleep'ов и есть запросы которые обрабатываются по/более 50 секунд судьба их дальше не известна. Примерная картина в mtop:

load average: 0.47, 0.49, 0.45 mysqld 5.0.45-community up 0 day(s), 1:13 hrs
68 threads: 10 running, 10 cached. Queries/slow: 1.5M/0 Cache Hit: 99.93%
Opened tables: 0 RRN: 994 TLW: 356 SFJ: 0 SMP: 0 QPS: 114

ID USER HOST DB TIME COMMAND STATE INFO
537 xxx 10.10.10.10:3980 xxx_xxxZZZ 2175 Sleep
648 xxx 10.10.10.10:4037 xxx_xxxZZZ 2121 Sleep
587 xxx 10.10.10.10:4002 xxx_xxxZZZ 2110 Sleep
...Sleep...
2855 xxx 10.10.10.10:5289 xxx_xxxZZZ 213 Sleep
2337 xxx 10.10.10.10:4577 xxx_xxxZZZ 67 Sleep
2536 xxx 10.10.10.10:5653 xxx_xxxZZZ 50 Query Updating UPDATE b_stat_session SET USER_ID = 0, USER_AUTH = 'N', USER_AGENT = 'Mozilla/4
2694 xxx 10.10.10.10:5222 xxx_xxxZZZ 50 Sleep
2684 xxx 10.10.10.10:5219 xxx_xxxZZZ 49 Query Updating UPDATE b_stat_session SET USER_ID = 0, USER_AUTH = 'N', USER_AGENT = 'Mozilla/4

Графики по mysql'у:
http://img267.imageshack.us/my.php?image=mysqlbytesdayzp3.png
http://img267.imageshack.us/my.php?image=mysqlqueriesdaydk6.png
http://img267.imageshack.us/my.php?image=mysqlslowqueriesday...
http://img267.imageshack.us/my.php?image=mysqlthreadsdayot4.png

"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
спросил 07 Авг, 13 от JabaHat (160 баллов)

7 Ответы

00 голосов
А таблички в каком формате храняться? Если MyISAM попробуйте перевести в InnoDB. И сколько просессов апача у вас работает, и собственно какой стоит?
ответил 07 Авг, 13 от Dakost (580 баллов)
00 голосов
StartServers 5
Server version: Apache/1.3.41 (Unix)
Эти таблицы там в MyISAM, клиент наврятли согласиться конвертировать.
ответил 10 Окт, 13 от JabaHat (160 баллов)
00 голосов
Дело не в сервере, а в продукте.
Была аналогичная проблема, но никто из людей, которые здесь находятся не помог, пришлось решать самому.
(http://www.1c-bitrix.ru/support/forum/forum6/topic10664/messages/)

Причина: спящие процессы появляются потому, что при коннекте к базе данных используется 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;
Итог: нагрузка на сервер значительно уменьшилась, и пользователей перестало выбивать.
ответил 10 Янв, 14 от Gibel (260 баллов)
00 голосов
Цитата
calculator пишет:
define("DBPersistent", true);


Цитата
Nik Semenov пишет:
Причина: спящие процессы появляются потому, что при коннекте к базе данных используется mysql_pconnect.


Если поменять в dbconn.php:
define("DBPersistent", false);

помогает?
ответил 27 Апр, 14 от Shadow (820 баллов)
00 голосов
читай выше, отредактировал сообщение(добавил пояснение);
Цитата
Причина: спящие процессы появляются потому, что при коннекте к базе данных используется mysql_pconnect
"define("DBPersistent", true);", можно, конечно, отключить, но тогда нагрузка на сервак будет при постоянных коннектах к MySQL, отсюда возникает необходимость подчищать лишние коннекты(которые,между прочим, держат ресурсы сервера), почему до этого не додумались разработчики продукта - сие тайна .
ответил 23 Авг, 14 от Gibel (260 баллов)
00 голосов
Интересно а как вы понимаете смысл работы mysqlp_connect? Он и используется для того чтобы при повторном соединение не открывать коннект, соответственно и процессы должны ждать. Дело не в продукте а в настройке сервера.
ответил 29 Дек, 14 от Dakost (580 баллов)
00 голосов
Цитата
Интересно а как вы понимаете смысл работы mysqlp_connect? Он и используется для того чтобы при повторном соединение не открывать коннект, соответственно и процессы должны ждать

В том то и дело, для следующего коннекта оставляем текущий коннект, и все коннекты время "сна" которых меньше определенного времени ( у меня 20 секунд), потому что при следующих коннектах он не цепляется к спящим, а создает новые. И вот чтобы новые не создавались до предела( числа соединений к базе данных) вот для этого и создан этот код.
ответил 17 Апр, 15 от Gibel (260 баллов)

Похожие вопросы

0 голосов
6 ответов
спросил 23 Авг, 13 от EXEtrmALL (160 баллов)
0 голосов
3 ответов
0 голосов
3 ответов
0 голосов
5 ответов
спросил 17 Дек, 13 от hipiro (280 баллов)
0 голосов
5 ответов
спросил 19 Сен, 13 от xCheatx (120 баллов)