![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Servidor linux con CPU al 100%
Hola
Tengo un servidor linux ejecutando firebird 1.5.6 SS . He revisado los parámetros del fichero firebird.conf para optimizar el DefaultDBCahePage a 10240 para tomar algunas páginas más de las 2048 por que trae por defecto. El tema es que el servidor al ejecutar determinadas consultas se pone al 100% y deja al resto de los equipos inoperativos. He revisado dichas consultas y están optimizadas. De hecho los analizadores marcan que todas las consultas se realizan mediante índices. En cualquier caso, con independencia de que la consulta tarde más o menos, lo que no entiendo es porque se quedan bloqueados el resto de los equipos, poniéndose el servidor al 100% de la cpu. ¿No debería ir más lento pero no bloquearse? La cuestión es que me pasa en servidores diferentes así que pienso que es un problema del Firebird. He buscado el error en ibphoenix pero no he conseguido solucionarlo con las indicaciones: http://www.firebirdfaq.org/faq312/ ya que la instrucción que ejecuto es un select con joins entre tablas. La consulta que ejecuto desde el IBExpers: Código:
select cabalbcli.ncentro, linalbcli.carticulo, linalbcli.ncod_albaran, linalbcli.ccod_serie, linalbcli.ncod_orden,cabalbcli.npuntoventa, cabalbcli.ncliente, cabalbcli.dfecha, linalbcli.ncantidad1, linalbcli.ncantidad2, linalbcli.ncantidadvalor, cabalbcli.ntipoop from cabalbcli, linalbcli, articulos, artifabr, multipuntosventa where cabalbcli.ncod_albaran = linalbcli.ncod_albaran and cabalbcli.ccod_serie = linalbcli.ccod_serie and linalbcli.carticulo = articulos.ccod_articulo and artifabr.ccod_articulo=articulos.ccod_articulo and artifabr.ncod_fabricante = 1 and artifabr.lprincipal=1 and multipuntosventa.ncod_puntoventa=cabalbcli.npuntoventa and multipuntosventa.ncod_fabricante=1 and cabalbcli.lfacturable=0 and cabalbcli.ntipoop=2 and linalbcli.lenvase=0 and linalbcli.ncantidadvalor < 0 and artifabr.csureferencia is not null and multipuntosventa.nptovtaserv is null and (linalbcli.ctipolinea='V' or linalbcli.ctipolinea='P' or linalbcli.ctipolinea='R') and linalbcli.nenlacefab is null and (cabalbcli.dfecha >= '10/01/10' and cabalbcli.dfecha <= '10/31/10') order by linalbcli.carticulo, linalbcli.ncod_orden, linalbcli.ccod_serie, linalbcli.ncod_albaran PLAN SORT (SORT (JOIN (CABALBCLI INDEX (FK_CALCLI_TIPOPE,IDX_CALCLI_FECHA),LINALBCLI INDEX (FL_LINALBCLI_ENLACEFAB,FK_LALCLI_CALCLI),ARTIFABR INDEX (PK_ARTIFABR),ARTICULOS INDEX (PK_ARTICULOS),MULTIPUNTOSVENTA INDEX (FK_MULPTOVTA_SERPTOVTA,PK_MULTIPUNTOSVENTA)))) No sé que más puedo mirar. Gracias. Última edición por sur-se fecha: 12-11-2010 a las 12:20:53. |
#2
|
||||
|
||||
Hola, es "casi" imposible que podamos ayudarte si no tenemos el servidor delante y la base de datos para hacer pruebas, de todas formas puedes "trocear" ese sql para encontrar qué tabla/campo es el que está tardando.
También puedes hacer otro cambio, ya que es linux, instala la versión classic server, es más recomendable.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
||||
|
||||
También puedes tratar de hacer el mismo select pero utilizando JOINs
Notas: He utilizado alias (cabalbcli c, por ejemplo) para que el sql sea más legible Presta especial atención a los índices que te marco, pues son los que utilizará para tratar de unir una tabla con otra. Dato que utilizas "and campo is null" entiendo que quieres que te aparezcan registros en los que la tabla asociada no tiene registros. Por eso he utilizado LEFT JOIN. |
#4
|
||||
|
||||
Veo además que utilizas Firebird 1.5.6 SS.
Yo utilizo la misma versión, pero en modalidad CS. Esto tiene para mi dos ventajas: Cada conexión es un proceso distinto, por lo que linux reparte la CP entre procesos y siempre está balanceado. Si un proceso está al 100% puedes entrar al linux, buscar ese proceso y matarlo! Yo hago un top, presiono la letra [k] y le doy el número de proceso Código:
top - 15:28:50 up 32 days, 20:59, 3 users, load average: 0.30, 0.14, 0.15 Tasks: 125 total, 2 running, 123 sleeping, 0 stopped, 0 zombie Cpu(s): 43.6%us, 5.9%sy, 0.0%ni, 48.8%id, 1.7%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1033244k total, 1017480k used, 15764k free, 16664k buffers Swap: 2031608k total, 96k used, 2031512k free, 697860k cached PID to kill: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7482 firebird 20 0 69160 64m 3064 S 0 6.4 5:17.67 fb_inet_server 7943 firebird 20 0 61176 56m 3040 S 0 5.6 3:53.82 fb_inet_server 8095 firebird 20 0 54144 49m 3060 S 0 4.9 2:41.63 fb_inet_server 2355 gdm 20 0 85180 25m 11m S 0 2.6 15:23.83 gdmgreeter 8494 firebird 20 0 24640 20m 2872 R 99 2.1 0:11.79 fb_inet_server 7671 firebird 20 0 23780 20m 2892 S 0 2.0 0:08.64 fb_inet_server 8480 firebird 20 0 21460 17m 2888 S 0 1.8 0:02.71 fb_inet_server 7592 firebird 20 0 19200 15m 2852 S 0 1.5 0:00.91 fb_inet_server . . . |
#5
|
||||
|
||||
Hola.
Lo primero que te recomiendo es que utilices Joins explícitos, como te recomienda el compañero. Facilita mucho la comprensión de la consulta, y por tanto la optimización de la misma. Respecto a los índices, el hecho de que la consulta utilice índices para todas las tablas no quiere decir que esos índices sean óptimos. Está claro que en alguna tabla se podría crear una índice que agilizaría mucho más la consulta de lo que hacen los índices actuales. En todo caso, ante una consulta tan sencilla. Puedes simplemente ir por partes. Empieza por :
Y después le vas añadiendo una a una las tablas relacionadas.
Cuando la consulta se bloquee, ya sabes en que unión tienes que añadir un índice que permita localizar rapidamente sus registros.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#6
|
|||
|
|||
Hola.
Gracias a todos. Habéis acertado con la solución al 100%. Me puse a fraccionar e investigar la SQL con detalle hasta que di con el problema. El join con artifabr era la causa del problema. Esta table tiene un clave primaria por cod_articulo y cod_fabricante, pero adicionalmente tiene una clave referencia en cod_fabricante a la tabla de FABRICANTES. El problema es que el plan que utiliza firebird toma como índice de búsqueda para artifabr la clave referencial por fabricante, en lugar de tomar la clave primaria con artículo y fabricante PLAN ... ARTIFABR INDEX (FK_ARTFAB_FABRIC) y aunque yo le indico que tome ARTIFABR INDEX (PK_ARTIFABR), no lo hace y da error ( ahora que me doy cuenta puse mal el plan que sale en el post inicial). Al cambiar la consulta a left joins, ahora si está tomando el índice correcto y la consulta ha pasado de tardar 352 segundos a tardar 16 milisegundos (si lo he escrito bien de 5 minutos a menos de un 1 segundo). Increible pero cierto... De todas formas, con independencia de la consulta SQL. Lo que sigo sin entender es por qué Firebird pone la CPU al 100% y deja a los demás equipos tirados. ¿No debería compartir la carga de trabajo con los otros equipos y simplemente hacer que tarde un poco más la consulta lenta? Gracias por la magnifica ayuda prestada por todos. |
#7
|
||||
|
||||
Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#8
|
||||
|
||||
Resp
Primero te recoiendo que uses la version clsi server ya que la superserver en linux segun mi punto de vista le estas poniendo hacer un trbajo que de por si el sitem aoperativo lo hace solo que es manear los hilos. y segundo deberias por lo menos decirnos las estructuras de las tablas. Quisas te falte algun indice o algo por estilo.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
#9
|
|||
|
|||
Hola. Gracias por las respuestas.
La verdad es que la decisión de instalar una u otra versión se basa en esta documentación: http://www.firebirdsql.org/manual/es/qsg15-es-classic-or-super.html Para linux, dice que da igual cual elija que no habrá diferencia de rendimiento, así que opté por la solución que parece ser la que se va a desarrollar, o sea la superserver. De todas formas haré lo que decís y lo pasaré a la versión classic server a ver si así va mejor. Un saludo. |
#10
|
||||
|
||||
Cierto, pero la experiencia dice que no es así, instala la classic, verás la diferencia.
Y si el servidor tiene más de un micro o es dual, entonces notarás una diferencia muy muy significativa.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#11
|
|||
|
|||
Hola.
En el caso de un servidor monoprocesador, ¿crees que también se notará mucho el rendimiento? Supongo que en ese caso seguirá prácticamente igual ¿no?. De todas formas gracias de nuevo a todos por la ayuda. |
#12
|
||||
|
||||
Al menos ganarás en esto, puede que sí notes la diferencia.
Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
PHP-Barcode en un servidor Linux | maro | PHP | 7 | 07-11-2007 20:01:54 |
intraweb y servidor linux | jgutti | Internet | 3 | 25-04-2005 23:09:38 |
Servidor de Correo en Linux | COCOL | Linux | 1 | 22-04-2005 16:13:33 |
Como hacer un shares en un Servidos Linux para que otro Servidor Linux .... | FernandoFAI | Linux | 0 | 15-04-2004 09:33:07 |
Servidor Unix Linux | Omar Alejandro | Varios | 1 | 25-09-2003 04:13:45 |
![]() |
|