Home     RSSRSS

Archives: Performance Engineering

My SQL InnoDB Storage Engine

January 24, 2015 by kiranbadi1991 | Comments Off on My SQL InnoDB Storage Engine | Filed in Database, Environment, Performance Engineering, Small Businesses

MySQL comes with different level of support for InnoDB Storage engine for every version of its release. The Default configuration settings for InnoDB also varies version wise. So its always a wise decision to ensure that if we are upgrading the MySQL and are having InnoDB as default Storage engine, then it does no harm to revisit the configuration settings.

InnoDB is default general purpose storage engine and is recommended for all tables unless you have any special cases. MySQL Server has a pluggable storage engine architecture that enables storage engines to be loaded into and unloaded from a running MySQL server.

InnoDB has below features that separates it from other engine types,

  1. Row level Locking – blocks  reading or writing of table data by connections if another connection is currently using that data.(MyISAM has table level locks) .
  2. Acid ComplianceAtomicity means that if a transaction fails then the changes are rolled back and not committed. Consistency means that each successfully executed transaction will move the database ahead in time from one state to the next in a consistent manner without errors or data integrity issues. Isolation means that each transaction will see separate sets of data in time and not conflict with other transactional data access.Durability  ensures that any data that has been committed in a successful transaction will be written to disk in its final state, without the risk of data loss from errors or system failure, and will then be available to transactions that come in the future. So chances of transaction corruption is not possible or very small.All transactions are executed in isolations.
  3. Referential Integrity – It has ability to store data in multiple tables and maintain referential integrity and data consistency.

One can verify the type of engine used by MySQL by issuing below commands,(I have PhpMyAdmin and it looks something like below screenshot)

image

Also before creating any tables with InnoDB as engine, it makes sense to check transaction isolation levels. This can be checked with below command,

image

Transaction Isolation levels has of below options,

READ UNCOMMITTED -  Every select query operates without locks so you don’t get consistency and might contain dirt reads. So it violates ACID Principles and should never be used if your application issues transactions that require point-in-time consistent data reads.

READ COMMITTED – This setting offer consistent reads without table or row locks. Each consistent read, even within the same transaction, sets and reads its own fresh snapshot of point-in-time data.It offers  consistency and performance for applications that do not require full ACID.It does not fully comply with ACID.

REPEATABLE READ – The InnoDB default isolation level for ACID compliance.

SERIALIZABLE: This is the same as REPEATABLE READ but MySQL converts  select queries with the preface of LOCK IN SHARED MODE when auto-commit is enabled. If auto-commit is disabled then each select query is started in a separate transaction, which will ensure that all reads are consistent. This setting also allows for XA distributed transactions support, which you can read more about in the MySQL manual.The SERIALIZABLE value setting will impact database transaction execution performance, so only enable this if it is absolutely necessary.

Tags: , ,

Oops Error and Java Error/Exception Handling

April 4, 2014 by kiranbadi1991 | Comments Off on Oops Error and Java Error/Exception Handling | Filed in Development, Environment, Performance Engineering, Project Management, Web Server

Very Often during the testing for java based application, I come across the generic Oops error message which looks something like below screenshot,

image

Lot many developers who are building the java based application  or are new to development use these techniques to display error or exception message. It’s a good technique and even I have this technique in my application which I have coded.The code to display Oops error which I have in my application is something like below,

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage="true" %>
<html>
    <head>
        <title>Show Error Page</title>
    </head>
    <body>
        <h1>Oops...</h1>
        <table width="100%" border="1">
            <tr valign="top">
                <td width="40%"><b>Error:</b></td>
                <td>${pageContext.exception}</td>
            </tr>
            <tr valign="top">
                <td><b>URI:</b></td>
                <td>${pageContext.errorData.requestURI}</td>
            </tr>
            <tr valign="top">
                <td><b>Status code:</b></td>
                <td>${pageContext.errorData.statusCode}</td>
            </tr>
            <tr valign="top">
                <td><b>Stack trace:</b></td>
                <td>
                    <c:forEach var="trace" 
                               items="${pageContext.exception.stackTrace}">
                        <p>${trace}</p>
                    </c:forEach>
                </td>
            </tr>
        </table>
    </body>
</html>

The code above uses the JSTL tag and EL to display the error page.It works perfectly fine and it does display most of the exception which is thrown by the application.

However drawback of this approach  is that it shows error or exception directly to the end user and it means that we are leaking information to the outside world about our code base. Its not good. Some of the reasons as why its not good can be found here.

Most of the sites display catchy error screens when something goes wrong with site. They look so good and in fact  appeal the users. Great number of examples  can be found here.

Now changing from that Generic Oops page to some thing catchy and stylish is also very easy. It involves creating one static page with funny image in it and steps for the user to go to other section of the site or report the error message to site administrator or something which you want your users do when they see error page. However to implement this change some knowledge as how java handles error/exception is required. Below links are probably worth the read  to understand the science of java errors or exception,

http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html

http://www.artima.com/intv/solidP.html

http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=2

http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html

Now changing from Generic Oops page to some catchy page is also quite easy. Build the static JSP or HTML page and edit the web xml error page section. It looks something like below in Netbean editor,sorry I use netbean for development so I have screenshot based on it. Web xml can also edited in notepad or any other IDE.Editing via IDE is recommended since its heart of the application.

image

We can also write the exception handler servlet and build the page dynamically using the throwable class. The important thing to be considered here is that we are not leaking information and at the same time we are also informing users that something went wrong and they can follow some other path to their work. Once you have implemented the change, we can immediately test this change by triggering the error condition to see that in fact we are redirecting to error page correctly.

If you are QA  and if you see Oops Page, then probably you want to log the defect for this irrespective of the condition/data as what triggered the error.However you also need to make sure that exception stack trace is correctly logged in the logs and it has all the information that is required to debug the condition. If you are using any logging framework like Log4j ,it should not take more time to redirect the error to appender and verify the completeness of the message.

Tags: , ,

How to enable logging in IIS 7.0

February 24, 2014 by kiranbadi1991 | Comments Off on How to enable logging in IIS 7.0 | Filed in Development, Environment, Performance Engineering, Web Server

IIS 7 on Windows 2008 Server has increased the logging capability of IIS compare to IIS 6. IIS 7 ships with below modules which are default on set up,

HTTP Logging Module(loghttp.dll)

Interacts with HTTP.sys process and processes request status. It is required for generation of logs.

Failed Request Tracing Module(iisfreb.dll)

Logs failed Requests for debugging purpose

Request Monitor Module(iisreqs.dll)

Watches the worker process activity

Tracing Module(iisetw.dll)

ETW tracing to capture trace file

Custom log Module(logcust.dll)

Logs custom module information

All the modules are located in system 32 /inetsrv directory of the server (Please see below screenshot),

image

It’s now possible to log information on per site basis or globally with IIS. It’s also possible to log just only the failed requests or only successful requests. Centralized logging can be done in Binary or W3C format.

In Order to enable logging, below steps needs to be followed,

  • Open Server Manager. Open command Prompt window and Type Run. Run Window will open. In Run window type CompMgmtLauncher.exe
  • Click on Roles (Web Server Roles).Check if Http logging is installed. If it’s not then you need to install it by adding appropriate Role.
  • Check the HTTP Logging box and install it.
  • Close the Server manager.
  • Once enabled you should be able to see something like below screen once you click on HTTP logging Module. (Below screen is from IIS 8).

image

Once the logging is enabled, logs tags are automatically created in applicationhost config file.

<log>
<centralBinaryLogFile enabled=”truedirectory=”%SystemDrive%\inetpub\logs\LogFiles/>
<centralW3CLogFile enabled=”truedirectory=”%SystemDrive%\inetpub\logs\LogFiles/>
</log

Its always a best practice to generate logs in the separate drive from your main drive where we have installed IIS 6 or the drive where heavy lifting of requests take place.

Tags: , , , ,