Home     RSSRSS

Posts Tagged ‘Monitoring’

Monitoring Java based Servers with JMX

January 5, 2014 by kiranbadi1991 | 1 Comment | Filed in Development, Environment, Performance Center, Performance Engineering, Web Server

Many times I have seen people struggling to do monitoring set up on the Java based servers like Web logic , Web sphere or even commercial servers like Tibco etc. Any server which supports Java based application can be monitored with JMX Solutions. Even the commercial tools like Sitescope, Silk Performer Monitors use the Custom JMX Client classes behind the scenes to monitor the java based servers.

JMX provides the powerful API to monitor and manage any Java based application servers or infrastructure. Below are some  benefits which I have seen we get by using the JMX API,

  1. Using the JMX we can monitor the health of all servers in the environment. Even if we have non Java based servers , we can always  write the custom wrapper classes which can pull the performance stats from those servers. However this approach consumes some time, but is doable if we have skilled java resources. However if we have Java based infrastructure than probably other than enabling JMX , there is hardly any code is required.
  2. Configuring Resources on the server is also possible with JMX API. With JMX API we can monitor and configure the application and its services either fully or in part by exposing it to the JMX API.
  3. JMX also helps in debugging. Debugging can be enabled at runtime in case if required.
  4. JMX can also send out the alert notification, emails for critical events.However a listener needs to be Configured to send out the actual data.

Setting the JMX Based monitoring on the java based server involves the enabling the JMX Port in the start up option of the server. Normally it’s the flag which needs to be set up in java options of the server.

In this post I will show you as how to do set up in Apache Tomcat 7x server. I have installed the Apache Tomcat on my local machine as windows service.Once you have installed Tomcat as service, navigate to the bin directory of the server and right click tomcat7w.exe file. Please make sure that you run this with administrator rights.

image

In apache Tomcat 7 Properties windows, click on Java tab, you need to enter below options for local monitoring solutions.Please note that with below options we have turned off SSL and authentication is also switched off which means that you don’t need user id and password to connect to the server.

-Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

For remote monitoring of the server we need to enable remote port for jmx. Below options I have shown as how to set JMX Monitoring with user credentials, however if you don’t need user credentials, then probably, you can use options jmxremote.authenthicate as false.

-Dcom.sun.management.jmxremote.port=(your port number)
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file= path to password file

Below screenshot shows you the setting I have given in my tomcat server. Since JMX is based on JMX Specification, set up is pretty should be similar in other java based servers. However in those servers, we might set the java options in class path options while starting the servers.

image

Once the JMX options is enabled, we can use any JMX Client to connect to the server and gather the performance metrics. However please do note that application and server need to expose its functionality via Mbeans. Below screenshots shows the connection with JConsole,

image

Enabling the JMX Options is the first step you need to do if ever you want to monitor any java based servers with JMX.

Lot of people also say that enabling the JMX is cumbersome process, but my experience was bit different and after enabling it did not break any thing on my environment set up.

Technorati Tags: ,,

Tags: , ,

Short note on using Indexes- MS SQL 2005

August 18, 2012 by kiranbadi1991 | 1 Comment | Filed in Database, Development, Environment, Performance Engineering, Testing

Most often whenever Performance Engineer detects some issues  with regard to response time, the first thing the application team thinks as a fix is to check and add some more indexes to the columns in the table.Adding indexes is low hanging fruit which every development team tries and should try  before reviewing their code base for fix.I certainly agree and go with most development team on this.However these concepts are now misused and now people often try to add indexes as band aid than do real time fix for their insufficient design. I recently had one such case, and to everyone’s surprise it failed  and they had rework on their queries.Don’t get me wrong, designs often get outdated with technologies.They don’t stay in pace with growth of technologies.Today I may use Model 2 MVC, but 3 years down the line, Model 2 MVC will be outdated.However these  should not impact low level basics used in the design.If I am storing zip codes, then probably I should be using char or int with limited bytes range depending on zip code format.This according to me is low level basics and the same applies to the basics about indexes.

So this post is all about indexes and my thoughts on it.

Indexes helps in reducing IO when we use it efficiently.Indexes work in the similar manner the way indexes in the book works.Lets say if we have book with around 1000 pages in it and you need to find a definition of some single word and you know for sure that definition exists somewhere in the book but not sure which page,how are you going to find out ?.Just go to the index page of the book and then search of the word what you require and then go to that page number.No need to flip over thousand pages to get the information.That’s the power of index when correctly implemented.Lets assume what happens when there is no index on any column involving the query, MSSQL database engine has to read each row of the table for getting the information and this results in the full table scan.So whenever you have large amount of rows and full table scan happens, the first thing that gets impacted is the response time of the application and to some extent resource usage of the database server.Your Database box is going to get very busy even to fetch 1 row of record.

Indexes are categorized as  clustered and non clustered Indexes.Clustered indexes are the one which often gives the better results and is default index type whenever we create the primary key constraint on the table in MSSQL Database.Clustered indexes are often created first than non clustered indexes since row locators of the non clustered indexes can be pointed toward the index keys of the clustered index.Clustered indexes also helps in sorting of the data and in cases where large range of rows needs to be retrieved.Non clustered index is useful when we are retrieving a very small number of rows.

Then there are also certain situations where in adding the indexes in fact degrade the performance of the application.Indexes often adds overhead costs in terms of more memory consumption and can also impact response time of the applications.The Insert/update/Delete  often gets longer whenever we have indexes on the tables where these operations takes place.Lets take earlier example, If I am deleting 25 pages from 1000 pages book, then the order of the all the pages changes and this change can lead to serious response time issues depending on the frequency of the change.So this is reason as why we should be cautious in using indexes for use cases where in we do high number of these DML operation.

Some of the main factors to be considered while designing indexes are,

  • Where clause and Joins to be used in queries:If the queries returns less rows, better the benefits we get due to index.We have to keep in mind the whole purpose of Where clause is to get exact required information from the table and if Where clause column is already indexed and the benefits due to the index almost gets doubled.
  • Column Data types : Columns with data type char,varchar,nchar etc of String family gains less due to indexes.Less the number of bytes they occupy,more the gain we can have due to indexes.
  • Columns which has duplicate data in large numbers are bad choice for indexes.Boolean columns where in we store the flag status with only 2 options Y and N.The reason these are bad is that it defeats the uniqueness of the Where clause if used.Column which has large number of unique values gains most due to the indexes.

Information about the indexes and their associated costs can also be found out using Data management View (DMV’s) of MS SQL Servers.The DMV sys.dm_db_index_operational stats can help us to get  low-level activity, such as locks and I/O, on an index that is in use. The DMV sys.dm_db_index_usage_stats can give us the  counts of the various index operations that have occurred to an index over time.

These are the key factors to be considered while designing the indexes on the table.Indexes often helps in fixing performance issues but if the design of the table or query is bad, then adding indexes to it may worsen the problem than resolving it.

Tags: , , , , ,

Know how shared is your server box and If Server runs with Default Settings

May 20, 2012 by kiranbadi1991 | Comments Off on Know how shared is your server box and If Server runs with Default Settings | Filed in Database, Development, Environment, Others, Performance Engineering, Testing

Working on the shared environments or clustered environment is quite a challenge and getting the best performance out of the servers requires that we understand as how servers are been designed or maintained in the infrastructure. If during the load testing, we are continuously seeing a very high response time which continuously exceeds the SLA’s given to us, then it’s time probably we should  start focusing on the shared environment aspects of the application.

Some of the question I often ask are as below,

  • Is the Database the only application running on the server box? If it’s sharing the server box with other enterprise applications like web server etc. , then probably it cannot perform optimally.
  • Does the Database memory/CPU/IO counters looks OK and they seems to align with hardware configuration of the server box.
  • Is the hardware of the server box like BIOS, Disk Controller etc. is up to date with latest patches and latest software. (I Know Microsoft Supports recommend this step always in case of any performance issue and I whole heartedly agree to this approach).
  • How often the virus scanning software is running in the server box. Quite often virus scanning software interrupts the smooth functioning of the database servers by interfering with database file system.Both are IO based application. It makes sense to exclude scanning of key database files to improve the performance of the database.
  • Does the database server have regular maintenance window, how often is database maintenance done. Maintenance activities could include applying patches/server reboots etc.

Having the answers to these questions often helps in eliminating the various roots cause for the slow performance of the application. Once we have eliminated these causes and have confirmed that environment or server box seems to good and still we are seeing slowness in the application, then probably it makes sense to drill down the details of the individual database server configuration,

Quite often it happens that most of the servers are installed with default settings. We all love to click next and next and next button while installing any enterprise software.This habit installing enterprise software later on starts giving nightmare to everyone once the application goes live.Every setting is factory made settings.So it times makes sense to drill and find out those default settings of the servers.

So let’s assume that we have MSSQL 2008 as the database server and we need to know the various default configuration setting that is in place for MSSQL 2008 box like what’s the memory /connection/processor setting etc.,

Assuming that you have SQL Management Studio installed, all you need to do is follow the below steps,

  • Connect to the Database server with Management Studio.
  • Using object explorer of studio, right click on the server node and select properties from the context menu.
  • Server property window will be visible to you. This window will have all the information with regard to connections/memory and various other settings that are in place for that database.

We should be able to see the something like below screen,

MSSQL2008_001

Another way of know the default setting is via system procedure sp_configure

SELECT * FROM sys.configurations

ORDER BY name ;

GO

or with

sp_configure

go

All these information will help us to correlate the high response time from the front end to the backend database and at times helps to scale application performance.When you run this procedure, it will show lot many information ,nearly 60+ settings that impacts the database.So in case if you feel any settings do not match with your application requirement then probably you need to talk to the DBA and explain him your reasoning as why that setting is impacting the performance of the applications.

For example, if the user connection value in database is set to 10 , and during your tests with 30 users, you see that response time are high, then probably highlighting this difference to the DBA might help assuming that at some point of time,it might happens that 10 connection might not be sufficient to serve the peak hour demands of the application.

Tags: , , , , ,