Pull to refresh

Кто стоит за соединениями?

Reading time2 min
Views5.6K
Периодически возникают ситуации, когда хочется понять, какой же процесс на сервере повинен за конкретное соединение с СУБД. К примеру, очень много соединений к базе и хочется узнать, откуда они идут. Либо, есть какие-то «тяжёлые» соединения (по которым какие тяжёлые запросы идут, которые тормозят всё).

Можно ли это вообще узнать эту информацию? Оказалось, что в этом нет ничего сложного! Однако, каждый раз руками устанавливать соответствие довольно муторно. Так почему бы не автоматизировать процесс?

Нет ничего проще!

Кто же вы, незнакомецы?


Итак, узнать, кто стоит за каким соединением в автоматическом варианте можно такой командой:

mysql -u<user> -p<password> -h<host> -e "SHOW PROCESSLIST;" | perl -lne 'print $1 unless !/(:\d+)/' | while read port; do netstat -tp | grep $port; done

Вывод будет примерно такой:

(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 server.local:44800 192.168.1.2:mysql ESTABLISHED 7476/mysql
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 server.local:35766 192.168.1.2:mysql TIME_WAIT -

Да, если запускать приведённую выше команду не из под root'а, будет некоторое количество шлака, как можно видеть выше. И, естественно, не будет возможности узнать процесс, запущенный от другого пользователя ;) В общем, без root'а толку мало.

Что дальше?


Итак, процесс узнан. Как понять, что он делает такого плохо?

Универсальные инструменты для анализа работы запущенного процесса (Гугл поможет с детальным описанием):
  • strace — что внутри?
  • netstat — какие соединения вообще есть у процесса?
P.S. В MySQL 5.1 есть великолепная таблица INFORMATION_SCHEMA.PROCESSLIST, откуда можно более гибко вытаскивать данные.
Tags:
Hubs:
Total votes 35: ↑19 and ↓16+3
Comments17

Articles