jueves, 21 de enero de 2016

Afinamiento o puesta a punto de servidores Tomcat con balanceo de carga en ambientes productivos

Si están por acá es porque andan buscando como optimizar algun servidor tomcat, o tambien como configurar algun balanceador de carga, entonces están en el lugar adecuado, no me gusta robar información y hacerla como si fuera mia, en esta ocasión voy a reconocer todos los créditos por el siguiente tutorial a http://www.adictosaltrabajo.com/tutoriales/tuning/, y voy a copiar y pegar la información de ese sitio, se preguntarán porque hago esto?, ya me he encontrado con varios enlaces que despues de un tiempo no están disponibles, y la información fuente se perdió, en mi blog pueden encontrar muchas cosas adicionales al respecto de tomcat y LB. bueno sin mas preambulos, voy a adicionar la información.

"

3. Introducción y montado de una arquitectura de producción

En el contexto de las aplicaciones web, las arquitecturas de producción no solo cuentan con un Tomcat al que todos los clientes atacan, sino que suele ser algo más parecido a la imagen siguiente, y es muy parecida a la que vamos a montar en este tutorial.
Esto se hace así por varios motivos:
  • Primero porque teniendo un Apache delante del Tomcat, se puede servir el contenido estático directamente por él, ya que es para esto para lo que mejor nos sirve un apache, y reducimos la carga en el Tomcat.
  • Segundo porque lo podemos utilizar para balancear entre distintos Tomcats, por si necesitamos un sistema de alta disponibilidad o simplemente porque el número de usuarios en concurrencia requiere dos máquinas.
Comprobamos nuestra versión de java con el comando java -version. Si no tenéis instalado Java, podéis obtener la última versión de este enlace.
Descargamos el Apache Tomcat. Simplemente lo descomprimimos en el directorio que queramos. Podéis utilizar el comando tar -xvf nombre_del_archivo.tar.gz
Como vamos a hacer pruebas sobre una aplicación Web ( cortesía de Francisco Javier ), os la voy pasando para comprobar que la instalación del Tomcat ha sido correcta. Os podéis descargar la aplicación Web del siguiente enlace.
Como veis es un zip que contiene un war ,un fichero c3p0.properties y un mysql-connector-java-5.1.11.jar. El archivo war lo copiais en la carpeta /TOMCAT_HOME/webapps/, en donde /TOMCAT_HOME/ es el directorio en el que habéis instalado el Tomcat. Los archivos c3p0.properties y mysql-connector-java-5.1.11.jar los copiais en /TOMCAT_HOME/lib/. Los más avispados de la clase se habrán dado cuenta de que vamos a utilizar base de datos. Para el ejemplo vamos a usar MySql. Os la podéis descargar del siguiente enlace.
Vamos a necesitar una base de datos con tan solo una tabla, aquí os dejo el script para que podáis crearosla fácilmente.
También vamos a necesitar un usuario sorteo con una password sorteo, que pueda acceder a dicha base de datos, es decir, con los privilegios necesarios. Lo podemos hacer con el interfaz gráfico pero os dejo los comandos para los que no dispongáis de uno.
Ya tenemos todo lo necesario para que nuestra aplicación Web funcione, vamos a comprobar que estamos en lo cierto, y que la instalación que hemos hecho funciona. Abrimos un terminal y nos dirigimos a /TOMCAT_HOME/. Arrancamos el Tomcat con el siguiente comando ./bin/startup.sh. Si todo ha ido bien, podremos acceder a la aplicación web en la siguiente url: http://localhost:8080/tuning-web/. Nos logamos con usuario:admin password:admin.
Ahora vamos a montar el Apache. Con mi sistema operativo tengo ya instalado uno, asique es el que voy a utilizar. Si estás utilizando un sistema operativo Unix puedes descargártelo con el comando apt-get install apache2 y si etás en Windows te lo puedes bajar de este enlace.
Ya tenemos los dos servidores montados y funcionando. Ahora vamos a conectarlos mediante el protocolo AJP 1.3 con mod_proxy. Abrimos primero el archivo /TOMCAT_HOME/conf/server.xml. Por defecto el Tomcat viene configurado para que el apache se pueda conectar a él mediante el puerto 8009, como podéis ver en la siguiente línea:
Entonces lo único que tenemos que hacer es configurar el Apache. Vamos a editar ahora el archivo /APACHE_HOME/httpd.conf. En los que tengáis sistema operativo MAC, APACHE_HOME se encuentra en /etc/apache2/, y los que tengáis un sistema operativo Linux me parece que la instalación os la hace también en ese path, pero el archivo de configuración no se llama httpd.conf, sino apache2.conf. Al final da igual que editéis uno u otro porque si no estoy muy equivocado el fichero apache2.conf al final hace un include del httpd.conf, por lo que podéis editar el que queráis.
Añadimos las siguientes líneas al final del fichero /APACHE_HOME/httpd.conf
Con la línea 1 estamos consiguiendo redirigir todo el tráfico al puerto 8009. En este caso nos da lo mismo pero si queréis afinar un poco más podéis poner lo siguiente:
Con eso conseguimos que todas las peticiones que van al contexto /tuning-web/ se redirijan al Tomcat. Con la segunda línea lo que estamos haciendo es montar un Reverse Proxy, es decir, le permitimos al Apache cambiar las cabeceras Location, Content-Location y URI de las respuestas que nos manda el Tomcat, de tal forma que para un usuario externo, el que le está respondiendo es el Apache, y no un Tomcat por detrás.
Quiero aconsejaros un par de páginas de la documentación de mod_proxy por si os queda alguna duda o queréis ampliar algún concepto:
Reiniciamos el Apache para que coja los cambios que hemos hecho en la configuración. En Mac tenemos una forma muy fácil de reiniciar el Apache. Las imágenes siguientes hablan por si solas.
Vamos a hacer ahora la prueba de fuego. Abrimos un navegador y vamos a la siguiente url: http://localhost/tuning-web/. Nos debería salir lo siguiente:
Si todo es correcto, ¡genial!, quiere decir que hemos conectado el Apache con el Tomcat.
A partir de ahora vamos a necesitar JMeter, ya que vamos a simular carga en la aplicación para ver distintas situaciones y como podríamos arreglarlas. Podéis descargalo desde la página oficial.
Una vez lo tenemos instalado vamos a hacerle unos cambios ya que le vamos a meter un poco de caña y vamos a necesitar más memoria de la que trae configurada por defecto. Editamos el fichero /JMETER_HOME/bin/jmeter.
Le he puesto 2GB porque en este ordenador tengo 8GB y ahora mismo con todo funcionando tengo incluso otros 4 GB que no estoy usando, pero en casa si no disponéis de tanta memoria, ponerle menos. Tanto en windows como en Unix como en Mac, es el mismo fichero el que tenéis que tocar para configurar la memoria, pero si estás en windows para ejecutar JMeter tendrás que ejecutar jmeter.bat, los que estamos con Mac/Unix jmeter.sh.
Aquí tenéis un plan de pruebas sencillito que me he creado grabando una navegación por la aplicación web. Si queréis saber como se hace esto, aquí tenéis un tutorial que lo explica muy bien: JMeter, pruebas de stress sobre aplicaciones web: Grabando y reproduciendo navegaciones
Vamos a necesitar también AppDynamics Lite para ver donde se nos va el tiempo. Aquí os dejo un tutorial que explica perfectamente como os lo podéis descargar e instalar: AppDynamics Lite, encontrar problemas de rendimiento en aplicaciones Java en un entorno de producción
Pues nada, ejecutamos JMeter con el comando ./JMETER_HOME/bin/jmeter.sh y pinchamos en abrir y seleccionamos el plan de pruebas que os acabais de descargar (pruebas.jmx). Sin más dilación le damos al play y nos posicionamos en Informe Agregado.
A medida que más usuarios están haciendo peticiones el tiempo máximo de cada petición sube. Ahora mismo tenemos 250 usuarios creando participantes y sorteando premios entre ellos, mientras se logan y se salen de la aplicación.
Tras un breve tiempo ya empiezan a aparecer los primeros errores, como puede verse en la imagen
Abrimos también un navegador y accedemos a la consola de AppDynamics en: http://localhost:8990/. Podemos observar por ejemplo peticiones de este tipo.
… que si la analizamos en profundidad …
… nos damos cuenta de que lo que en realidad está penalizando es el obtener una conexión a la base de datos, de hecho espera 27 segundos hasta poder acceder a una conexión. Esto nos indica lo siguiente:
  • Estamos gestionando mal las conexiones a la base de datos. No las cerramos, abrimos más de la cuenta …
  • Tenemos un pool de conexiones que no aguanta 250 usuarios en concurrencia.

3.1 Configuración del pool de conexiones a la base de datos

La configuración a la base de datos la tenemos precisamente en el archivo c3p0.properties que copiamos en /TOMCAT_HOME/lib. Si abrimos este fichero, vemos como tenemos seteado el atributo c3p0.maxPoolSize a tan solo 10 conexiones. Vamos a probar a aumentar el atributo a 100, reiniciamos el Tomcat y repetimos la prueba. Esta vez vamos a monitorizar también con jconsole, por lo que abrimos un terminal y simplemente con el comando jconsole, se nos abrirá esta herramienta.
Seleccionamos el servidor Tomcat en la lista y damos a conectar.
En la siguiente imagen vemos como se ha aumentado el rendimiento tras el cambio a las 100 conexiones.
El rendimiento se ha aumentado en un 300%, y ya no hay errores. Podemos ver lo importante que es este parámetro. Para sacar este dato lo que tenéis que comparar es el rendimiento (también llamado throughput) de la primera prueba (12,5 por segundo) con el de la segunda (37,8 por segundo).
Si nos fijamos ahora en AppDynamics podemos ver que hay algunas consultas que están tardando mucho en obtener una respuesta, pero ya no es por obtener el pool de conexiones. Por la propia prueba de la aplicación y por la aplicación en si, tenemos que 250 usuarios están continuamente consultando y escribiendo en UNA sola tabla, por lo que se va mucho tiempo en la gestión de la transaccionalidad, como es lógico. Si abrís las consultas SQL que se ejecutan en las peticiones lo podéis observar. Aquí no podemos hacer nada.
Vamos a ver si los resultados de jConsole nos dicen algo más.
Viendo esta gráfica podemos decir a simple vista 3 cosas:
  • Primero: que la aplicación está gestionando bien la memoria (no parece haber memory leaks). Si veis la gráfica de Heap Memory Usage, está en serrucho, lo que indica que se libera memoria de forma correcta. Si tuviera una pendiente ascendiente, que no se recupera la memoria … podríamos pensar que tenemos memory leaks Hemos llegado al pico de memoria, que lo tenemos puesto en 512 MB en 3 ocasiones, lo que nos hace ver que el uso de memoria es intensivo. Un aumento de esta podría beneficiar el rendimiento de la aplicación.
  • Segundo: que la CPU va muy relajada. Es decir, si fuera por la CPU se podrían poner en estas condiciones otros 250 usuarios. Ahora mismo vamos a ver que en realidad tenemos otro cuello de botella que hace que no estemos con 250 usuarios.
  • Tercero: que pese a lanzar la prueba con 250 usuarios el Tomcat solo tiene 180 threads funcionando, es decir, estos 80 hilos que faltan podrían estarse quedando en el Apache. Tenemos otro cuello de botella, vamos a ver si como sospechamos es el Apache.

3.2 Configuración de Threads de Apache y Tomcat

Vamos a probar a aumentar el número de Threads que puede atender el Apache. Lo primero que tenemos que hacer es, ver en que modo se está ejecutando nuestro servidor Apache. Para ello ejecutamos el siguiente comando en un terminal httpd -V. Este comando es válido tanto para Windows, como para Mac, em cambio si estás siguiendo el tutorial y haciendo las pruebas con un sistema operativo Linux el comando sería apache2 -V. El resultado sería algo parecido a lo siguiente:
podéis consultar la documentación oficial sobre los módulos de multiproceso (MPM) en el siguiente enlace. En esta página básicamente nos está diciendo que los modos por defecto para sistemas Unix es prefork (tal y como nos decía httpd -V), y para sistemas Windows es WinNT. Si pinchamos en el enlace que se nos ofrece para MPM prefork, nos están diciendo que el número de hilos que ofrecen por defecto es 256. El cuello de botella entonces no está en Apache !!!. Tiene que estar en el Tomcat. También nos dicen que si necesitamos ampliarlo o decrementarlo, la directiva que tenemos que usar es MaxClients. ¡OJO! los usuarios de windows, que la directiva es distinta, os la chivo, para sistemas Windows la directiva es ThreadsPerChild. Parámetros como estos, yo los considero importantes, y aunque por defecto se sirven 256 hilos, a mi me gusta poner la directiva en el Apache, ya que hoy me acuerdo que son 256 porque lo acabo de mirar en la documentación. Dentro de un mes seguro que no me acuerdo, asique para no tener que volver a buscarlo, voy a editar el fichero http.conf para añadir lo siguiente: MaxClients 300. Voy a poner 300 para no dejarlo justo a 250 sino tener un pequeño margen. Reiniciamos el Apache.
Vamos a ver entonces el número de hilos que tiene configurado el Tomcat.
Como estamos conectando Apache con Tomcat, voy a leerme primero la documentación de AJP 1.3, a ver donde se puede cambiar este parámetro. Esta es la documentación de AJP 1.3 para Tomcat 7. En maxThreads nos está diciendo que podemos setear el número máximo de hilos que va a crear este conector, o sea el número de peticiones simultaneas que vamos a poder atender. Por defecto son 200. Además nos dice que si tenemos definido un executor y está asociado con este conector este atributo se ignora y se usa el del executor. Si nos vamos al fichero /TOMCAT_HOME/conf/server.xml, vemos que efectivamente tenemos definido un executor. … y que algunos conectores lo tienen asociado …
… pero nuestro conector no lo está usando, asique le setemos el atributo maxThreads de nuevo a 300 para dejarnos un margen. Debería quedarnos de la siguiente forma:
… reiniciamos el Tomcat.
También hay otro parámetro a nivel de configuración del proxy en el Apache, que me parece importantísimo. Lo podéis ver en este enlace. Me refiero al parámetro retry. Tal y como veis en la documentación este parámetro está puesto por defecto a 60 segundos, lo que significa que cuando el Tomcat nos devuelve en una petición un error, Apache no le va a mandar más peticiones en 60 segundos. Esto puede pasar en picos altos de uso, en los que hay muchos usuarios y el Tomcat nos devuleve un timeout para una de ellas. No ha sido capaz de atender la petición y nos devuelve un error. Con la configuración por defecto tardaríamos 60 segundos en volver a mandar peticiones. Este tiempo es excesio y provoca que tengamos un rendimiento menor, si haceis pruebas con muchos usuarios observaréis que las peticiones van como en ráfagas y que hay tiempos en que la CPU está con un rendimiento del 0%, es porque cuando una petición falla tarda un rato en volver a mandar nuevas, y mientras tanto el servidor está totalmente relajado. Vamos a poner este parámetro a 5 segundos y vamos a ver como el rendimiento aumenta considerablemente. Editamos el fichero /APACHE_HOME/http.conf y añadimos retry=5 a la configuración del ProxyPass. Nos debería quedar de la siguiente forma:
… reiniciamos el Apache.
Pues nada, vamos a darle caña de nuevo con 250 usuarios a ver como afectan estos cambios al rendimiento.
Vamos a analizar primero las gráficas que nos muestra el jConsole.
Podemos sacar varias conclusiones:
  • Primero: La CPU tiene prácticamente el mismo uso que en la prueba anterior. Esto es debido a que con 180 hilos o con 280 está trabajando lo mismo, es decir, está trabajando poco. Aquí quien está trabajando es la BBDD, ya que la aplicación es muy sencillita y lo único que hace es persistir usuarios en la misma tabla de base de datos. En un caso normal de aplicación tendréis más tablas, entrada/salida, algoritmos más complicados y estas optimizaciones os pondrán la CPU al 100%, y os subirán el rendimiento en un alto porcentaje.
  • Segundo: Hemos conseguido los 250 usuarios en concurrencia, pero vemos que lo que realmente estamos midiendo aquí es la transaccionalidad sobre una tabla gestionada por MySQL, es decir, la base de datos no da para más. No podemos gestionar concurrencia y exclusión mutua sobre una tabla a más velocidad para 250 usuarios. Seguramente el rendimiento óptimo no sea con 250 usuarios. Antes teníamos unos 150 y teníamos más rendimiento. Para ver los usuarios en concurrente os tenéis que fijar en el número de threads que son 250 del JMeter + X threads que usa el Tomcat internamente = 283 Live threads.
Los resultados del JMeter van en consonancia. Ahora tenemos más usuarios, pero la base de datos es la misma, y seguimos insertando datos en una tabla, luego habiendo más usuarios a la vez tardaremos más, porque hay que gestionar más usuarios concurrentes, y el rendimiento en consecuencia baja. Hay que tener claro que el punto óptimo de una aplicación para una configuración determinada es X usuarios. Si te pasas de esos usuarios el rendimiento decrece, lo que no quiere decir que necesariamente la aplicación no escale, sino que tienes que adapatar la configuración a ello, por eso lo primero que tienes que tener claro es el número de usuarios máximo que se espera en una aplicación, para configurar que la aplicación tenga un comportamiento óptimo para ese número. Si luego se meten el doble de usuarios es obvio que el rendimiento decrecerá.
Con este tutorial hemos visto como interpretar las gráficas, e identificar posibles cuellos de botella. Me gustaría animar a los lectores a probar una aplicación desarrollada por ellos para ver su comportamiento e intentar ajustar la configuración para optimizarlo todo lo posible. Hay otros parámetros que podéis configurar para aumentar el rendimiento de vuestra aplicación. Os recomiendo este enlace.

4. Conclusiones

A nivel personal he descubierto un tema que me gusta bastante y he aprendido y recordado muchas cosas haciendo este tutorial. Espero que al lector le haya servido y parecido tan interesante como a mi. El rendimiento de las aplicaciones es algo que tenemos que tener muy en cuenta. Os voy a recomendar un libro que me ha ayudado y me ha parecido muy interesante: Packtpub JBoss AS 5 Performance Tuning Dec 2010. Un saludo !!"

jueves, 15 de mayo de 2014

cerrar o bloquear acceso a root por ssh y a otros usuarios por ssh

hola, en mi diario trabajo me encontré con la necesidad de asegurar ciertos accesos, restringir a los usuarios principales o de mayores privilegios y dejar solo a un usuario con pocos privilegios con acceso ssh para evitar accesos no deseados, por lo anterior me vi en la obligacion de bloquear acceso ssh a root y a otros usuarios que estan en el sistema y dejar acceso  a un unico usuario para poder asi saltar de usuario en usuario de manera interna en el servidor.

despues del largo intro viene el instructivo asi:

1. editar el archivo:
vi /etc/ssh/sshd_config

2. al final del archivo agregar:
PermitRootLogin no
AllowUsers unicoUsuarioIngresar
MaxAuthTries 3

en donde:
PermitRootLogin no
significa que no se desea que el usuario root ingrese de manera remota "ssh".

AllowUsers unicoUsuarioIngresar

significa que el unico usuario que puede ingresar por ssh es unicoUsuarioIngresar, por lo cual ningun usuario mas podrá ingresar de manera remota si no se registra en esta linea, la manera de separar a los usuarios en caso de ser varios es un espacio " " así:
AllowUsers unicoUsuarioIngresar OTROUsuarioIngresar

y MaxAuthTries 3 es para la máxima cantidad de intentos fallidos que se pueden dar antes de cortar la conexión, es de aclarar que el 3 indica cuantos intentos se desean, pueden ser mas o menos segun se cambie el numero.


luego se cierra el archivo guardando los cambios.

y finalmente se reinicia el servicio de ssh así:

/sbin/service ssh restart



y listo solo han quedado con acceso remoto los usuarios que se hayan incluido en la lista de permitidos "AllowUsers", espero haber sido de utilidad y hasta pronto!






modificar o cambiar hora a servidor Linux CENTOS o RHEL

Hola, bueno, lo primero es dar los créditos respectivos, copio la información de este sitio es por la disponibilidad, bueno, los comandos son los siguientes:

primero borrar el fichero en donde se tiene el registro de la hora, sino se borra, al reiniciar el sistema la hora quedará igual como está actualmente "sin modificaciones":

rm /etc/adjtime

luego se establece la fecha y hora del SO así:

date --set "2014-05-15 16:26"

posteriormente se actualiza la hora de la BIOS con la deseada "generalmente se usa la misma digitada en el comando date"

hwclock --set --date="2014-05-15 16:27"

es mejor mantener la fecha y hora actualizada del sistema desde un servidor de internet, para esto se usa el comando:

ntpdate -u ntp.ubuntu.com

pero mejor para sincronizar ahora la hora de la BIOS con la que se ha dejado sincronizada con el servidor de internet se usa:

hwclock --set --date="`date '+%D %H:%M:%S'`"


espero que haya sido de utilidad, hasta pronto!


miércoles, 5 de febrero de 2014

script de bash para reiniciar tomcat

Hola amigos, en las tareas del dia a dia me encontré con el tema de tener que reiniciar un servidor tomcat de manera automatica, la solicion fue buscar un script de bash que  realizara la tarea.

me he encontrado este script muy interesante y con bastantes validaciones les dejo la url:

http://java360.blogspot.com/2012/03/restart-tomcat-via-shell-script-using.html

por si acaso copio el contenido porque puede que despues no se encuentre disponible...


#!/bin/bash
#Important!! Script Must be run as root(you can ignore this if your tomcat does not need root
PATH=$PATH:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ant/bin:/opt/java/
export PATH
NOW=$(date +"%Y%m-%dT%H%M")

if [ "$(id -u)" != "0" ];
then
echo "This script must be run as root" 1>&2
exit 1
fi

echo `date` ":=================================" >> /tmp/tomcat-restart.log
echo `date` ":Tomcat restart script initiated!!" >> /tmp/tomcat-restart.log
echo `date` ":=================================" >> /tmp/tomcat-restart.log

if [ `ps -ef | egrep 'tomcat6' | egrep -v egrep | wc -l` -gt 0 ];
then
echo `date` ":Tomcat is running" >> /tmp/tomcat-restart.log

kill -3 `ps ax | grep tomcat6 | grep -v grep | awk '{print $1}'`
/opt/tomcat/bin/catalina.sh stop
echo `date` ":Tomcat has shutdown" >> /tmp/tomcat-restart.log

if [ `ps -ef | egrep 'tomcat6' | egrep -v egrep | wc -l` -gt 0 ];
then
kill -9 `ps ax | grep tomcat6 | grep -v grep | awk '{print $1}'`
fi

#echo "Restarting tomcat !!!!!" >> /tmp/tomcat-restart.log
#/opt/tomcat/bin/catalina.sh start
#else
#echo "Tomcat not found running" >> /tmp/tomcat-restart.log
#echo "Restarting tomcat !!!!!" >> /tmp/tomcat-restart.log
#/opt/tomcat/bin/catalina.sh start
fi

echo `date` "Sleep started" >> /tmp/tomcat-restart.log
sleep 30
echo `date` "Sleep End" >> /tmp/tomcat-restart.log

if [ `ps -ef | egrep 'tomcat6' | egrep -v egrep | wc -l` -eq 0 ];
then
/opt/tomcat/bin/catalina.sh start
echo `date` "Tomcat restarted." >> /tmp/tomcat-restart.log
fi


bendito error generico ORA-00600

copio la informacion que seguí paso a paso de esta URL: http://oraclemamukutti.blogspot.com/2011/06/ora-00600-13013-5001.html

por si acaso se llegan a encontrar con el tema que no saben donde ubicar los archivos de log que tienen el error, se puede usar:
select value from v$parameter where name = 'USER_DUMP_DEST'
por otro lado si desean una ubicacion en donde se puede localizar, les dejo esta ruta:

/app/oracle/diag/rdbms/prod/prod/trace/prod_ora_4303.trc

y dentro de ese archivo se debe buscar la cadena: mismatch



Ora - 00600 [13013], [5001]

I experience an Ora-00600 error. Let's look what is the error and the way to resolve it.

Error received
--------------

ORA-00600: internal error code, arguments: [13013], [5001], [4722], [29361923], [9], [29361923], [17], []

Let's look into details of how to solve this issue.

Section 1> What information needs to be Collected
ORA-600 [13013] [a] [b] [c] [d] [e] [f]

This format relates to Oracle Server 8.0.3 to 10.1

Arg [a] Passcount
Arg [b] Data Object number
Arg [c] Tablespace Relative DBA of block containing the row to be updated
Arg [d] Row Slot number
Arg [e] Relative DBA of block being updated (should be same as [c])
Arg [f] Code

The Second argument would give the information about the data object id.
This would give information about the object involved.

SQL> Select object_name,object_type,owner from dba_objects where data_object_id=;

Once the Object is identified run the following :
The below command check if the table has corruption or not .

SQL> Analzye table . validate structure online;

If this goes fine table doesnot have corruption. For next command.
If the above command fails with ORA-1498 go to Section 3

The below command check if table/index has corruption or not

SQL> Analzye table . validate structure cascade online;

If the above command errors out with ora-1499 it indicates a corruption in index.
Go to section 2 for resolution

Run dbverify on the datafile reported in the error
Arg [c] in the ora-0600[13011] would give the Relative DBA

For example
ORA-00600: internal error code, arguments: [13013], [5001], [57353], [155254965], [261], [151062605], [17], []

Arg [c] --> rdba-->155254965
Use this value and find the file and block number for this dba(data block address)

SQL> select dbms_utility.data_block_address_file(155254965) Rfile# ,dbms_utility.data_block_address_block(155254965) "Block#" from dual;

RFILE# Block#
---------- ----------
37 65717

You can run dbveirfy on datafile with rfile#=37

SQL> Select name from v$datafile where rfile#=37;

$ dbv file= blocksize=

Section 2 > How to resolve if an Index is corrupted.

You would need to drop and recreate the index
Ensure before dropping the Index 

SQL> Spool /tmp/createindex.sql
SQL> Set long 100000000
SQL> Select dbms_metadata.get_ddl('INDEX','',<'user name>') from dual; 
SQL> Spool off

To Identify the index please do the following

Analyze table with "validate structure cascade" fails with ORA-1499 and the trace file contains message "Table/Index row count mismatch". Example:

SQL> analyze table test validate structure cascade;
analyze table test validate structure cascade
*
ERROR at line 1:
ORA-01499: table/index cross reference failure - see trace file
 

The associated trace file contains:
Table/Index row count mismatch 
table 6559 : index 10000, 0 
Index root = tsn: 6 rdba: 0x01400091

It means: A table scan returned 6559 rows and an index scan returned 10000 rows. 
"Index root" is the segment header information for the index: 
rdba: 0x01400091 is the Index segment header relative data block address. It is decimal 20971665 which is Rfile#=5 Block#=145 :

SQL> select dbms_utility.data_block_address_file(20971665)  "Rfile#"   
2          ,dbms_utility.data_block_address_block(20971665) "Block#"   
from dual;   

Rfile#     Block#   
---------- ----------   
5          145  

Running the next query can identify the associated index:
QUERY 1:  

SQL> select owner, segment_name, segment_type  
2    from  dba_segments  
3    where header_file = 5  
4      and header_block = 145;  

OWNER    SEGMENT_NAME    SEGMENT_TYPE  
-------- --------------- ------------------  
SCOTT    I_TEST          INDEX 


Section 3> How to resolve if table is corrupted

Option a> Backup is available

Ora-1498 would be reported on the table.

The trace file from Ora-1498 would contain following information

Example

Block Checking: DBA = 1066265208, Block Type = KTB-managed data block ---> 
file 254,block 911992 
data header at 0xc00000010118e07c 
kdbchk: avsp(816) > tosp(812) 
Block header dump: 0x3f8dea78 
Object id on Block? Y 
seg/obj: 0x155b452 csc: 0x05.7b2b4ee6 itc: 3 flg: E typ: 1 - DATA 
brn: 0 bdba: 0x3f8dde0c ver: 0x01 
inc: 0 exflg: 0 

Note the DBA value reported in the trace file DBA = 1066265208
Convert this to find the file number and block number having issue

Sql> Select dbms_utility.data_block_address_file('1066265208') from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE('1066265208') 
-------------------------------------------------- 
254

Sql> Select dbms_utility.data_block_address_block('1066265208') from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK('1066265208') 
--------------------------------------------------- 
911992


Run dbverify on the datafile containing the table

$ dbv file= blocksize=

Corruption would be reported on the block.

If you have an Rman backup do a Rman block recovery (Take the file number and block number affected from the trace file)

Rman> Blockrecover datafile block ;

Or

If you have a user managed backup you can do an restore and recovery from good copy of the problematic datafile
Option b> Backup is not available

If no backups are available then use event 10231 at session level to create a salvage table

SQL> Alter session set events '10231 trace name context forever, level 10'; 
SQL> Create table .salvage_table as select * from ;

Rename the Original table to old.

Rename salvage table to Original table name

How to resolve when Smon terminates the instance due to Ora-00600[13013]

If Smon is terminating the instance then.

Set event 10513 and startup the database
event="10513 trace name context forever, level 2" 

SQL> Startup mount;
SQL> Show parameter event
SQL> Alter datatabase open;

Identify the object involved using information from Section 1.

How to resolve the issue if the object involved belongs to system tablespace

System objects are very important.
Please open a Service request with Oracle support if system tables are involved.