Pollsys Oracle y consumo de CPU

lun 25 de enero del 2010

En muchas ocasiones me he encontrado procesos oracle con un alto consumo de CPU que prácticamente solo están ejecutando la llamada al sistema pollsys, la salida a un truss muestra tal que:

box# truss -faelid -c -p 12564 ^C syscall seconds calls errors read .000 2 write .000 2 times .000 47 yield .000 145 pollsys 6.568 1335638 -------- ------ ---- sys totals: 5.569 1335834 0 usr time: 35.453 elapsed: 70.540

La llamada pollsys se usa para ver si hay nuevos datos disponibles en un file descriptor, vamos a comprobarlo:

box# truss -faelid -v pollsys -p 12564 [...] 7219/1: 0.0193 pollsys(0xFFFFFFFF7FFF21D0, 2, 0xFFFFFFFF7FFF2110, 0x00000000) = 1 7219/1: fd=8 ev=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND rev=POLLIN|POLLRDNORM [...] box#pfiles 12564 [...] 8: S_IFSOCK mode:0666 dev:298,0 ino:49586 uid:0 gid:0 size:0 O_RDWR|O_NDELAY FD_CLOEXEC SOCK_DGRAM SO_SNDBUF(65536),SO_RCVBUF(131072) sockname: AF_INET 172.16.xxx.xxx port: 5884 [...]

Nuestro proceso oracle está ejecutando la llamada pollsys sobre un socket de forma continua, ¿por qué?, ¿que datos está esperando?.

La respuesta la encontré en el blog de Tanel Poder. Para resumir, Oracle está comprobando continuamente que el usuario no pulse un "ctrl+break" para abortar la consulta que ha lanzado en caso que esta sea de larga duración.

Existe el parámetro break_poll_skip en el fichero sqlnet.ora para que esta comprobación no se haga tan frecuentemente, ahorrando tiempo de CPU.


Posted by Roger Jordan | Permalink | Categories: Opensolaris rss  | Añadir Comentarios, Total: 0