Archive of October 2011


Mon 17 Oct

Percona Live London

La próxima semana comienza la Percona Live y esta vez podremos disfrutarla sin salir de Europa. Durará dos días, 24 y 25 de Octubre.

Durante el primer dia se impartirán tutoriales de diversos tema, como por ejemplo NDB o Sphinx.

http://www.percona.com/live/london-2011/schedule-tutorial/

Y el segundo día se reserva para las conferencias:

http://www.percona.com/live/london-2011/schedule-conference/

Las conferencias serán impartidas no solo por compañeros de Percona, si no también por trabajadores de empresas como Paypal, Facebook, Nokia, Couchbase o Monty Program.

Como se puede comprobar, posibilidades de aprender hay miles. Aún estás a tiempo de apuntarte :) Yo estaré por allí toda la semana, así que si algún lector de este blog va a asistir a la Percona Live... ¡allí nos veremos!


Fri 7 Oct

Recopilar información del SO en el momento preciso

Muchas veces los problemas que tenemos con nuestra base de datos no son continuos, si no puntuales, y ocurren generalmente cuando no estamos mirando la pantalla. Las herramientas que hoy voy a mostraron os permitirán cazar el momento exacto de un problema y recabar todos los datos posibles en ese preciso instante de tiempo.

Las dos herramientas pertenecen al Percona Toolkit. Estas toolkit incluyen lo que antes era Aspersa y Maatkit. Por lo tanto, comenzamos descargando:

Percona Toolkit Download

Dentro de el las utilidades que hoy usaremos serán:

pt-collector: es la herramienta que se lanzará cuando una condición específica se de. Entre otras cosas se encargará de recargar información sobre IO, procesos, memoria, processlist, estado de las variables en MySQL y salidas de comandos como iostat, mpstat, df, lsof. También permite capturar tráfico tcpdump, el proceso con strace y lanzar un profile con Oprofile.

pt-stalk: será el encargado de llamar a pt-collector cuando una determinado estado, definido por nosotros, se de. Por ejemplo, podemos configurarlo de forma que lance pt-collector cuando el número de queries simultáneas alcancen los 100, cuando existan más de 25 tabla temporales en creación, cuando un proceso/usuario en particular se conecte, etc.

Los dos son script en bash (no es Perl! Yuhuu!). No hay fichero de configuración, se deben editar las variables dentro de los propios scripts.

Empezamos con pt-stack:

# ########################################################################
# Configuration settings.
# ########################################################################
# This is the max number of  we want to tolerate.
THRESHOLD=${THRESHOLD:-50}
# This is the thing to check for.
VARIABLE=${VARIABLE:-Threads_connected}
# How many times must the condition be met before the script will fire?
CYCLES=${CYCLES:-1}
# Collect GDB stacktraces?
GDB=${GDB:-no}
# Collect oprofile data?
OPROFILE=${OPROFILE:-yes}
# Collect strace data?
STRACE=${STRACE:-no}
# Collect tcpdump data?
TCPDUMP=${TCPDUMP:-yes}
# Send mail to this list of addresses when the script triggers.
# EMAIL=
# Any options to pass to mysql/mysqladmin, such as -u, -p, etc
# MYSQLOPTIONS=""
# This is the interval between checks.
INTERVAL=${INTERVAL:-30}
[...]
# This is the location of the 'collect' script.
if [ -z "${COLLECT}" ]; then
   COLLECT="/usr/bin/pt-collect";
fi
# This is where to store the collected data.
if [ -z "${DEST}" ]; then
   DEST="/tmp/collected/"
fi

Como vemos, la configuración es sencilla. Estamos diciendo que cuando la variable "Threads_connected" tenga un valor superior a 50 lanzará el pt-collect junto con información de oprofile y tcpdump. Hay más opciones, pero esto es un post de introducción, no un manual :)

Entonces, el primer paso es lanzar el pt-stack:

root@debian-slave:~# pt-stalk 
2011_10_07_14_34_36 check results: Threads_connected = 2, matched = no, cycles_true = 0
[...]
2011_10_07_14_41_28 check results: Threads_connected = 71, matched = yes, cycles_true = 1
2011_10_07_14_41_28 sleeping 300 seconds to avoid DOS attack

Si ahora miramos la carpeta donde se guardan los resultados de collect, ahí tendemos toda la información necesaria recogida.

root@debian-slave:~# ls -l /tmp/collected/
total 1248
-rw-r--r-- 1 root root   9120 oct  7 14:42 2011_10_07_14_41_29-df
-rw-r--r-- 1 root root  19800 oct  7 14:42 2011_10_07_14_41_29-diskstats
-rw-r--r-- 1 root root     13 oct  7 14:42 2011_10_07_14_41_29-hostname
-rw-r--r-- 1 root root   2645 oct  7 14:41 2011_10_07_14_41_29-innodbstatus1
-rw-r--r-- 1 root root   2645 oct  7 14:42 2011_10_07_14_41_29-innodbstatus2
-rw-r--r-- 1 root root  40800 oct  7 14:42 2011_10_07_14_41_29-interrupts
-rw-r--r-- 1 root root     66 oct  7 14:41 2011_10_07_14_41_29-iostat
-rw-r--r-- 1 root root     66 oct  7 14:41 2011_10_07_14_41_29-iostat-overall
-rw-r--r-- 1 root root     91 oct  7 14:41 2011_10_07_14_41_29-log_error
-rw-r--r-- 1 root root  16327 oct  7 14:41 2011_10_07_14_41_29-lsof
-rw-r--r-- 1 root root  35580 oct  7 14:42 2011_10_07_14_41_29-meminfo
-rw-r--r-- 1 root root     66 oct  7 14:41 2011_10_07_14_41_29-mpstat
-rw-r--r-- 1 root root     66 oct  7 14:41 2011_10_07_14_41_29-mpstat-overall
-rw-r--r-- 1 root root  66573 oct  7 14:41 2011_10_07_14_41_29-mutex-status1
-rw-r--r-- 1 root root  66573 oct  7 14:42 2011_10_07_14_41_29-mutex-status2
-rw-r--r-- 1 root root 442530 oct  7 14:42 2011_10_07_14_41_29-mysqladmin
-rw-r--r-- 1 root root  32040 oct  7 14:42 2011_10_07_14_41_29-netstat
-rw-r--r-- 1 root root  41520 oct  7 14:42 2011_10_07_14_41_29-netstat_s
-rw-r--r-- 1 root root     53 oct  7 14:41 2011_10_07_14_41_29-opentables1
-rw-r--r-- 1 root root     52 oct  7 14:42 2011_10_07_14_41_29-opentables2
-rw-r--r-- 1 root root    423 oct  7 14:42 2011_10_07_14_41_29-output
-rw-r--r-- 1 root root  26742 oct  7 14:41 2011_10_07_14_41_29-pmap
-rw-r--r-- 1 root root  15714 oct  7 14:41 2011_10_07_14_41_29-processlist1
-rw-r--r-- 1 root root    194 oct  7 14:42 2011_10_07_14_41_29-processlist2
-rw-r--r-- 1 root root  35224 oct  7 14:42 2011_10_07_14_41_29-procstat
-rw-r--r-- 1 root root  44906 oct  7 14:42 2011_10_07_14_41_29-procvmstat
-rw-r--r-- 1 root root   6451 oct  7 14:41 2011_10_07_14_41_29-ps
-rw-r--r-- 1 root root 229140 oct  7 14:42 2011_10_07_14_41_29-slabinfo
-rw-r--r-- 1 root root     25 oct  7 14:41 2011_10_07_14_41_29-stacktrace
-rw-r--r-- 1 root root  22924 oct  7 14:41 2011_10_07_14_41_29-sysctl
-rw-r--r-- 1 root root   7006 oct  7 14:41 2011_10_07_14_41_29-top
-rw-r--r-- 1 root root     90 oct  7 14:41 2011_10_07_14_41_29-trigger
-rw-r--r-- 1 root root   6596 oct  7 14:41 2011_10_07_14_41_29-variables
-rw-r--r-- 1 root root   2670 oct  7 14:42 2011_10_07_14_41_29-vmstat
-rw-r--r-- 1 root root    313 oct  7 14:42 2011_10_07_14_41_29-vmstat-overall

Por ejemplo:

root@debian-slave:~# cat /tmp/collected/2011_10_07_14_41_29-processlist1 |more
*************************** 1. row ***************************
     Id: 304
   User: root
   Host: localhost
     db: sbtest
Command: Query
   Time: 0
  State: NULL
   Info: UNLOCK TABLES
*************************** 2. row ***************************
     Id: 305
   User: root
   Host: localhost
     db: sbtest
Command: Execute
   Time: 0
  State: Writing to net
   Info: SELECT c from sbtest where id between 504280 and 504379 order by c
*************************** 3. row ***************************
     Id: 306
   User: root
   Host: localhost
     db: sbtest
Command: Query
   Time: 0
  State: NULL
   Info: UNLOCK TABLES
[...]

Ya no es necesario que te quedes a las 3 de la mañana esperando a que todo deje de funcionar para empezar a recopilar datos :)