Archive of October 2011
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!
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:
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 ofwe 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 :)







