<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7623434036211003634</id><updated>2012-02-16T19:49:00.481-08:00</updated><category term='entreprenuership'/><category term='Life'/><category term='Technical'/><category term='Election'/><category term='Lustre'/><category term='NFS'/><category term='people'/><category term='Linux'/><category term='kernel'/><category term='Corporate'/><category term='storage'/><category term='code'/><category term='celebration'/><category term='conference'/><category term='algorithms'/><category term='musings'/><category term='Cloud'/><category term='Politics'/><title type='text'>Rumble in the Mind</title><subtitle type='html'>This blog will mainly contain the technical ramblings borne from my imagination and experiences. And maybe something more, depending on the level of my enthusiasm.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-1772047660606462197</id><published>2010-01-25T11:03:00.000-08:00</published><updated>2010-01-25T11:03:18.089-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Zero Copy - Mapping buffer into pages for disk IO</title><content type='html'>I needed to implement zero-copy for a block device driver. It turned out that a lot of IO in the driver was happening through buffers and earlier each IO involved page allocations and copying of data from page to buffer. This naturally ate up lot of CPU and needed improvements. &lt;br /&gt;&lt;br /&gt;While implementing I did not find good example code in Linux kernel, due to which I ended up wasting some time in investigations. Some issues to consider: &lt;br /&gt;&lt;br /&gt;1) Don't assume that all memory was kmalloc'ed. Check using is_vmalloc_addr() what type of memory it is.&lt;br /&gt;2) On some architectures, even kmalloc allocations will cross page boundaries&lt;br /&gt;&lt;br /&gt;void buffer_disk_io(struct my_req * req)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int is_vmalloc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct bio * bio;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct page * pg;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int sector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void *addr;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = (req-&amp;gt;num_sectors-1) / (PAGE_SIZE / SECTOR_SIZE) + 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* The buffer may not start from page boundary in some cases&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * but it can cross page boundaries */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset = offset_in_page(req-&amp;gt;buffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (offset &amp;amp;&amp;amp; (offset + (req-&amp;gt;num_sectors &amp;lt;&amp;lt; 9)) &amp;gt; PAGE_SIZE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio = bio_alloc(GFP_NOIO, count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bio == NULL) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; req-&amp;gt;status.syserr = -ENOMEM;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; req-&amp;gt;status.code = DS_ERR_UNKNOWN;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_bdev = req-&amp;gt;path-&amp;gt;bdev;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_sector = req-&amp;gt;start_sector;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_private = req;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_end_io = __end_io_indirect;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if memory is vmalloc'ed or kmalloc'ed */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is_vmalloc = is_vmalloc_addr(req-&amp;gt;buffer);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sector = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (sector &amp;lt; req-&amp;gt;num_sectors) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addr = (req-&amp;gt;buffer + (sector &amp;lt;&amp;lt; 9));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (is_vmalloc) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pg = vmalloc_to_page(addr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pg = virt_to_page(addr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get_page(pg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset = offset_in_page(addr);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Consider case when offset in not on page boundary and it may&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * or may not cross page boundaries */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((req-&amp;gt;num_sectors - sector) &amp;gt;= (PAGE_SIZE / DS_SECTOR_SIZE))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = PAGE_SIZE - offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (offset + ((req-&amp;gt;num_sectors - sector) &amp;lt;&amp;lt; 9) &amp;lt; PAGE_SIZE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = (req-&amp;gt;num_sectors - sector) &amp;lt;&amp;lt; 9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = PAGE_SIZE - offset;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!bio_add_page(bio, pg, len, offset))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto failed;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sector += (len &amp;gt;&amp;gt; 9);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* set command */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (req-&amp;gt;cmd == IO_READ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_rw = READ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else if(req-&amp;gt;cmd == IO_WRITE) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_rw = WRITE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bio-&amp;gt;bi_rw |= (1UL&amp;lt;&lt;bio_rw_sync);&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; generic_make_request(bio);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/bio_rw_sync);&gt;&lt;br /&gt;&lt;br /&gt;failed:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(bio != NULL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __end_io_indirect(bio, 0, -ENOMEM);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-1772047660606462197?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/1772047660606462197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=1772047660606462197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/1772047660606462197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/1772047660606462197'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2010/01/zero-copy-mapping-buffer-into-pages-for.html' title='Zero Copy - Mapping buffer into pages for disk IO'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-2585561581267175727</id><published>2010-01-18T03:56:00.000-08:00</published><updated>2010-01-18T04:00:02.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Performance engineering with OProfile</title><content type='html'>I have been working on a Linux kernel replication product and have been wanting to profile the kernel module for evaluating performance. I used &lt;a href="http://oprofile.sourceforge.net/news/"&gt;OProfile&lt;/a&gt; as the tool for extracting the profiling information.&lt;br /&gt;&lt;br /&gt;1. Install kernel-debuginfo packages or compile a kernel since we need &lt;i&gt;vmlinux&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;2. Since I was working with VMWare, I needed to load oprofile module and use timer interrupts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; modprobe oprofile timer=1&lt;br /&gt;This took a little bit of time to figure out. If this step is not done, then you would not see any logs even though you would not see any errors.&lt;br /&gt;&lt;br /&gt;3. Provide oprofile with the path to your vmlinux file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opcontrol --vmlinux=/usr/lib/debug/lib/&lt;kernel&gt;/vmlinux&lt;/kernel&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ii gt" id=":1y7"&gt;4. Reset the data from oprofile is needed with&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opcontrol --reset&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;5. Run whatever operations you want to profile&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opcontrol --start; &lt;operations profile="" to="" want="" you=""&gt; ; opcontrol --stop&lt;/operations&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&lt;br /&gt;6. Dump the logs that were generated&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opcontrol --dump&lt;br /&gt;&lt;br /&gt;7. View the logs&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opreport -c --demangle=smart --image-path=&lt;path module="" to="" your=""&gt; --merge tgid | less&lt;/path&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;The logs can be viewed in various formats and many types of information can be extracted. You can see the command for that &lt;a href="http://oprofile.sourceforge.net/examples/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is a snippet of the output which tells us that performance bottleneck is at lock_conflict() so we can look at the logic in and around this function to improve performance.&lt;br /&gt;&lt;/div&gt;&lt;div class="ii gt" id=":1y7"&gt;&lt;br /&gt;samples&amp;nbsp; %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; samples&amp;nbsp; %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; app name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol name&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;40503&amp;nbsp;&amp;nbsp;&amp;nbsp; 41.7815&amp;nbsp; 19369&amp;nbsp;&amp;nbsp;&amp;nbsp; 19.9559&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prepare_to_copy&lt;br /&gt;&amp;nbsp; 40503&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 19369&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prepare_to_copy [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;19951&amp;nbsp;&amp;nbsp;&amp;nbsp; 20.5808&amp;nbsp; 6399&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.5929&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lock_conflict&lt;br /&gt;&amp;nbsp; 19951&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 6399&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lock_conflict [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;7056&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7.2787&amp;nbsp; 25345&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.1130&amp;nbsp; pcnet32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pcnet32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (no symbols)&lt;br /&gt;&amp;nbsp; 7056&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 25345&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; pcnet32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pcnet32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (no symbols) [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;6358&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.5587&amp;nbsp; 1824&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.8793&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; locks_overlapped&lt;br /&gt;&amp;nbsp; 6358&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 1824&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; locks_overlapped [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;6072&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.2637&amp;nbsp; 12217&amp;nbsp;&amp;nbsp;&amp;nbsp; 12.5872&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsnlock_release_1&lt;br /&gt;&amp;nbsp; 6072&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 12217&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsnlock_release_1 [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;2844&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.9338&amp;nbsp; 4098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.2222&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_lockmgr&lt;br /&gt;&amp;nbsp; 2844&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 4098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_lockmgr [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;792&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.8170&amp;nbsp; 831&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.8562&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; block_write_umap&lt;br /&gt;&amp;nbsp; 792&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 831&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; block_write_umap [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;733&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.7561&amp;nbsp; 626&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.6450&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsnlock_release&lt;br /&gt;&amp;nbsp; 733&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 626&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsnlock_release [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;671&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.6922&amp;nbsp; 129&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1329&amp;nbsp; dt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fill_buffer&lt;br /&gt;&amp;nbsp; 671&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 129&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; dt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fill_buffer [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;428&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.4415&amp;nbsp; 173&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1782&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __make_request&lt;br /&gt;&amp;nbsp; 428&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 173&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vmlinux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __make_request [self]&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;401&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.4137&amp;nbsp; 412&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.4245&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadConfigurationFromCfg&lt;br /&gt;&amp;nbsp; 401&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; 412&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100.000&amp;nbsp; foo.ko&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadConfigurationFromCfg [self]&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-2585561581267175727?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/2585561581267175727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=2585561581267175727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/2585561581267175727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/2585561581267175727'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2010/01/performance-engineering-with-oprofile.html' title='Performance engineering with OProfile'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-8305772301271981474</id><published>2010-01-16T04:18:00.000-08:00</published><updated>2010-01-16T04:24:26.186-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='musings'/><title type='text'>Connected?</title><content type='html'>I found the following an interesting read from &lt;a href="http://howardmann.com/"&gt;Howard Mann&lt;/a&gt; :&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There are tens of thousands of businesses making many millions a year in profits that still haven’t ever heard of twitter, blogs or facebook. Are they all wrong? Have they missed out or is the joke really on us? They do business through personal relationships, by delivering great customer service and it’s working for them. They’re more successful than most of those businesses who spend hours pontificating about how others lose out by missing social media and the latest wave. And yet they’re doing business. Great business. Not writing about it. Doing it.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I’m continually amazed by the number of people on Twitter and on blogs, and the growth of people (and brands) on facebook. But I’m also amazed by how so many of us are spending our time. The echo chamber we’re building is getting larger and louder.&lt;br /&gt;&lt;br /&gt;More megaphones don’t equal a better dialogue. We’ve become slaves to our mobile devices and the glow of our screens. It used to be much more simple and, somewhere, simple turned into slow.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;We walk the streets with our heads down staring into 3-inch screens while the world whisks by doing the same. And yet we’re convinced we are more connected to each other than ever before. Multi-tasking has become a badge of honor. I want to know why.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I don’t have all the answers to these questions but I find myself thinking about them more and more. In between tweets, blog posts and facebook updates.&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;I tend to agree with him, especially the first paragraph. Twitter, Facebook and rest of the social media are certainly redefining &lt;i&gt;virtual&lt;/i&gt; relationships and &lt;i&gt;helping &lt;/i&gt;to create personal relationships. So while social media is a very important medium to reach more people, we mustn't forget that reaching people is only half the job done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-8305772301271981474?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/8305772301271981474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=8305772301271981474' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/8305772301271981474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/8305772301271981474'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2010/01/connected.html' title='Connected?'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-2664761764010134346</id><published>2009-10-10T13:00:00.000-07:00</published><updated>2009-10-10T13:00:47.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='people'/><title type='text'>Cloud'ed Thoughts</title><content type='html'>&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;These were some of the questions posed to me during the cloud computing panel discussion at &lt;a href="http://www.csi2009.co.in/CSI2009/index.htm"&gt;CSI Annual Convention 2009&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Each one of you has a different view (PaaS, services, testing, startup, management) in the domain. A 5-minute warmer on your take on cloud computing based on your current work will be great. This will set the stage nicely for the discussion.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;There are many “definitions” of cloud computing but for me “Cloud Computing is the fifth generation of computing after Mainframe, Personal Computer, Client-Server and the Web.” Its not often that we have a whole new platform and delivery model to create businesses on. And what's more its a new business model as well – using a 1000 servers for 1 hour costs the same as using 1 server for 1000 hours – no upfront costs, completely pay as you go!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;How has cloud computing suddenly creeped on us and become technologically and economically viable? Because of 3 reasons:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;ol style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Use  of commodity hardware and increased software complexity to manage  redundancy on such hardware. The perfect example of such softwares  is virtualisation, MapReduce, Google File System, Amazon's Dynamo,  etc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Economies  of scale. In a medium sized data center it costs $2.2 /GB/month  while in a large data center it costs $0.40/GB/month. That is a cost  saving of 5.7 times which cloud computing vendors have been possible  to pass on to the customers. In general, cloud infrastructure  players can avail 5 to 7 times decrease in cost.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;The  third and according to me the most important reason: there was a  need to scale for many organizations but not the ability to scale:  As the world became data intensive, players realized that unless  scalable computing, scalable storage and scalable software was  available, their business models won't scale. Consider analytics as  an example. Some years back it was possible for mid-sized companies  to mine the data in their own data center but with data doubling  every year they have been unable to keep up. They have decided to  scale out to the cloud. Amazon, Google realized this from their own  needs very early and look here we are eating their dog-food!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;Developers with new ideas for innovative internet services no longer require large capital investments in hardware to deploy their service. They can potentially go from 1 customer to 100k customers in a matter of days. Over-provisioning or under-provisioning is no longer a factor if your product is hosted on cloud computing platforms. This enables small companies to focus on their core competency rather than worrying about infrastructure. This enables a much quicker go-to-market strategy.&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Another advantage is that clouds are available in various forms:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Amazon  EC2 is as good as a physical machine and you can control the entire  software stack.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Google  AppEngine and salesforce.com are platforms which are highly  restrictive but good for quick development and allows the scaling  complexity to be handled by the platform itself. &lt;/span&gt;  &lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Microsoft  Azure is at an intermediate point between the above two.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;So depending on your needs, you can choose the right cloud!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;As I said earlier its a new development environment and there is lot of scope for innovation which is what my company “Clogeny” is focusing on.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Cloud computing is not just about “compute” – it is also storage, content distribution and a new way of visualizing and using unlimited storage. How has storage progressed from multi-million dollar arrays and tapes to S3 and Azure and Google Apps?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;I remember that when I started writing filesystems I needed to check for an error indicating that the filesystem was full. It just struck me that I have no need for such error checking when using cloud storage. So yes, its actually possible to have potentially infinite storage.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Storage:   &lt;/b&gt;&lt;span style="font-weight: normal;"&gt;Storage arrays have grown in capacity and complexity over the years to satisfy the ever-increasing demand for size and speed.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt; But cloud storage is pretty solid as well. Amazon, Microsoft and most other cloud vendors keep 3 copies of data and atleast 1 copy is kept at a separate geographical location. When you factor this into the costs, cloud storage is pretty cheap. Having said that, cloud storage is not going to replace local storage, fast and expensive arrays will still be needed for IOPS and latency hungry applications. But the market for such arrays may taper off.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Content Distribution: &lt;/b&gt;&lt;span style="font-weight: normal;"&gt;A content delivery network is a system of nodes in multiple locations which co-operate to satisfy requests for content efficiently. These nodes move the content around to serve it optimally where the node nearest to the user, serves the request. All the cloud providers offer content distribution services thereby improving reach and performance since requests can be served around the world from the nearest available server. This makes the distribution extremely scalable and cost efficient. The fun part is that the integration between cloud and CDN is seamless and can be done through simple APIs.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Visualizing storage: &lt;/b&gt;&lt;span style="font-weight: normal;"&gt;Storage models for the cloud have undergone a change as compared to the POSIX model and relational databases that we are used to. The POSIX model has given way to a more scalable flat key-value store in which a “bucket-name, object-name” tuple points to a piece of data. There is no concept of folder and files that we are used to. Note that for ease of use a folder-file hierarchy can be emulated. Amazon provides SimpleDB, a non-traditional database which is again easier to scale but your data organization and modeling will need to change when migrating to SimpleDB. MapReduce is a framework to operate on very large data sets in highly parallel environments. MapReduce can work on structured or unstructured data.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;Consider this as an example, there is a online photo sharing company called SmugMug which estimates that it has saved $500,000 in storage expenditures and cut its disk storage array costs in half by using Amazon S3.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;CC breaks the traditional models of scalability and infrastructure investment, especially for startups. A 1-person startup can easily compare with an IBM or Google on infrastructure availability if the revenue model is in place. What are the implications and an example of how?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Definitely, startups need to only focus on their revenue model and implementing their differentiators. The infrastructure, management and scaling are inherently available in a pay as you go manner so that ups and downs in traffic can be sustained. For examples, some sites get hit by very high traffic in first few weeks and need high infrastructure costs to service this traffic. But then the load tapers off and infrastructure lies unused. This is where the pay as you go model works very well. So yes, cloud computing is a leveller fostering many start-ups.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Also many businesses are using cloud computing for scale-out whereby their in-house data center is enough to handle certain amount of load but when load goes beyond a certain point they avail the cloud. Such hybrid computing is sometimes more economically viable.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Xignite employs Amazon EC2 and S3 to deliver financial market data to enterprise applications, portals, and websites for clients such as Forbes, Citi and Starbucks. This data needs to be delivered in real-time and needs rapid scale up and scale down.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;What do you see when you gaze in the crystal bowl?&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;Security is a concern for many customers but consider that the most paranoid customer – the US government has started a cloud computing initiative called “App.gov” where they are providing SaaS applications for federal use. Even if there are some issues, they are being surmounted as we speak. Cloud computing has now reached a critical mass and the ecosystem will continue to grow.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;In terms of technology, I believe that there will be some application software running on-premise and another piece running on the cloud for scaling out. The client part can provide service in case of disconnected operations and importantly can help to resolve latency issues. Most cloud computing  applications will have in-built billing systems that will either be a standard or software that both the vendor and customer trust. I would love to see some standards emerging in this space since that will help to accelerate acceptance.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;“&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Over the long term, absent of other barriers, economics always wins!”&lt;/i&gt;&lt;span style="font-style: normal;"&gt; and the economics of cloud computing are too strong to be ignored.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-2664761764010134346?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/2664761764010134346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=2664761764010134346' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/2664761764010134346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/2664761764010134346'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/10/clouded-thoughts.html' title='Cloud&apos;ed Thoughts'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-650549194043787353</id><published>2009-10-10T12:53:00.000-07:00</published><updated>2009-10-10T23:54:14.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='people'/><title type='text'>A "Cloudy" day at CSI Annual Convention 2009</title><content type='html'>&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;I had a very interesting opportunity to be one of the speakers on the panel discussion on cloud computing at &lt;a href="http://www.csi2009.co.in/CSI2009/index.htm"&gt;CSI Annual Convention 2009&lt;/a&gt;. As it turned out the entire day was "cloudy" with most topics and discussions being centered around cloud computing. Most people agreed that cloud is the next generation of computing but there are still doubts as to which form of cloud computing will take off. The conclusion is that there IS a lot of hype and when that has died down, the products and companies who solve real problems will survive. People who try to monetize the medium instead of the product, might end up failing. Here are some of the excerpts from the day.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The day started with a keynote address on "Cloud Computing - Challenges and Opportunities" by Girish &lt;/span&gt;&lt;span style="font-size: small;"&gt;Venkatachaliah from IBM. His take was that about 20% of IT will move to the cloud in next few years and currently its more hype than substance.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Dr. Srikanth Sunderrajan from Persistent gave a great talk on Google AppEngine, a Platform-as-a-Service offering. His company recently implemented a product on top of Google AppEngine. His take was that AppEngine lacks many features and is a strait-jacket environment with almost no flexibility. They had to write complex libraries to enable file-system like storage and ended up using Amazon EC2 to aid the short-comings of AppEngine. His take was that Google needs to open up the platform and be more like Amazon's cloud offerings. One good thing about AppEngine is that development and deployment is fast and easy.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The panel discussion on cloud computing included &lt;/span&gt;&lt;span style="font-size: small;"&gt;Monish Darda from Websym, &lt;/span&gt;&lt;span style="font-size: small;"&gt;Karan Gujral from BMC , &lt;/span&gt;&lt;span style="font-size: small;"&gt;Gireendra Kasmalkar from SQS, &lt;/span&gt;&lt;span style="font-size: small;"&gt;Vikram Rajkondwar from Microsoft, &lt;/span&gt;&lt;span style="font-size: small;"&gt;Samir Bodas from ICERTIS and &lt;/span&gt;&lt;span style="font-size: small;"&gt;yours truly. The discussions covered PaaS, IaaS, SaaS, testing for the cloud, how can startups leverage the cloud, managing the clouds and much more. Vikram's views which stemmed from his experience working on Microsoft Azure were extremely insightful.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Here are some of the take-away points from the discussion:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;The cloud phenomenon has been seeded due to the economies of scale. The cloud infrastructure providers use commodity hardware and use complex software to manage redundancy. The savings are passed on to the consumer making the cloud a very cost effective platform.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Evolution of virtualization technologies has enabled cloud data centers to increase efficiency. All parts of the stack will be virtualized as we progress.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Storage is an important aspect of the cloud. 3 copies of data are maintained by the cloud vendors so in terms of reliability to cost ratio, cloud storage is on par or cheaper than local storage. And unlimited storage is available on a completely pat as you go model.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Cloud is very interesting medium for testing and QE since these phases are needed late in the SDLC and require investment in terms of hardware and provisioning. Clouds make it possible to do functional and scale testing without upfront investment.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;The most compelling use of cloud computing is when load and usage cannot be predicted. Cloud can be used to augment local data center - for scaling out when load exceeds certain levels. Such hybrid clouds will be the future of data centers. Another prime usecase is when loads are periodic - in-case of on-premise data centers this leads to low utilization and hence lesser ROI. Clouds can be provisioned as needed improving the ROI for such companies.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Today even a 1-person startup can compete with Google and IBM in terms of infrastructure. If a good revenue model is in place, then startups can use the pay as you go model to their advantage. Companies like SmugMug, ElephantDrive has done just this to keep up with their phenomenal growth. Without clouds, their growth would have stymied as they would not have had scale out capability.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;The data center management companies will need to upgrade their products to manage the clouds. They will have to look at provisioning, job scheduling, profiling for the cloud along with the on-premise data center.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Everyone agreed that on-premise data centers will never be replaced by the cloud. They will be augmented. A lot of web hosting will move to the cloud though.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;The conclusion was that companies and consumers should try to look through the hype and try to identify solutions that actually solve their problems. Every little software when provided as Software-as-a-Service does not become a better solution. If you find your sweet spot in the cloud, you are poised for phenomenal growth.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-650549194043787353?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/650549194043787353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=650549194043787353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/650549194043787353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/650549194043787353'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/10/cloudy-day-at-csi-annual-convention.html' title='A &quot;Cloudy&quot; day at CSI Annual Convention 2009'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-996324136122151829</id><published>2009-09-24T23:55:00.000-07:00</published><updated>2009-09-24T23:55:45.477-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Lustre'/><title type='text'>Talk on Lustre at FOSS.in/2008</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://foss.in/"&gt;&lt;strong&gt;FOSS.IN&lt;/strong&gt;&lt;/a&gt; is one of the world’s largest Free and Open Source Software (FOSS) events, held annually in India. The event is highly focussed on FOSS development and contribution. Over the years, it has attracted thousands of participants, and the speaker roster reads like a “Who’s Who” of FOSS contributors from across the world.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Last year I had the privilege of giving a talk on "Lustre: A Scalable Clustered Filesystem" at this event. This is one of the few events with a very techie agenda and I had some interesting discussions with the delegates. The breakout sessions where hackers sit together and actually code up a feature is really cool. Not many events would have people actually coding!&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Here is my presentation. It describes the architecture of Lustre - a distributed, clustered filesystem which runs on 7 of the top 10 supercomputers. It goes on to describe some of the cutting-edge features that are being planned for future Lustre releases.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://kalpak.shah.googlepages.com/Lustre-A_scalable_clustered_filesyst.pdf" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Hn-t8jfS410/Srxm8HiCqBI/AAAAAAAABmg/TDjoKedIbeI/s320/foss.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-996324136122151829?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/996324136122151829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=996324136122151829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/996324136122151829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/996324136122151829'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/09/talk-on-lustre-at-fossin2008.html' title='Talk on Lustre at FOSS.in/2008'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Hn-t8jfS410/Srxm8HiCqBI/AAAAAAAABmg/TDjoKedIbeI/s72-c/foss.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-3897652216162263411</id><published>2009-09-22T01:28:00.000-07:00</published><updated>2009-09-22T03:40:15.161-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='people'/><category scheme='http://www.blogger.com/atom/ns#' term='entreprenuership'/><title type='text'>Inspirations from TiECon Delhi 2009</title><content type='html'>&lt;span style="font-family: times new roman;font-family:verdana;font-size:130%;"  &gt;It isn't often that you get a chance to rub shoulders with industry leaders and successful entrepreneurs. TiECon gives you a chance to connect and interact with founders of successful companies, venture capitalists and budding entrepreneurs. It was great to be in presence of people with amazing clarity of thought and expression.&lt;br /&gt;&lt;br /&gt;As I was contemplating what is the best way to structure this blog, I remembered attending some of the panel discussions where certain quotes and thoughts just resonated with my mind. It's like you have a gut feel of certain things but when they are put in perfect, concise words it becomes easy to put it into action. So the best way to express what I saw and learnt is in the form of quotes that I gathered personally or in discussions.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;"Entrepreneurship is a difficult word to define, an entrepreneur has a difficult path to choose and a difficult path to tread. Many succeed and many fail. An entrepreneur who trips and falls down once; if he is a true entrepreneur will pick himself up and walk the same path or a different path with greater determination. An entrepreneur chases a dream, pursues an idea, and seeks a goal. So I think there is much to be said about entrepreneurship and any organization which promotes entrepreneurship rather than simple businesses." Mr. P. Chidambaram, Home Minister, Ministry of Home Affairs, Government of India &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"Good entrepreneurs react differently to tough times" Deep Kalra, Founder &amp;amp; CEO, MakeMyTrip.com&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"Thinking how soon I can 'breakeven' is a big fallacy. We need to think how will we scale up" Achal Ghai, Managing Director, Avigo Capital&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"When the brand is in experimental stage, even spam works, especially in India" Manish Vij, Co-Founder and Business Head, Quasar Media&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"80-90% of requests for venture capital get rejected due to lack of a marketing plan" Achal Ghai, Managing Director, Avigo Capital&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"Only when you have done enough 'pilots' and have customers who can be brand ambassadors should you think of doing advertising" Manish Vij, Co-Founder and Business Head, Quasar Media&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"For your core team you need like minded people and people who can work with equity" Dhruv Shringi, CEO &amp;amp; Co Founder, Yatra.com&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span class="UIStory_Message"  style="font-size:130%;"&gt;"A part of your skill as an entrepreneur is to be a good salesman" Yashish Dahiya, Co Founder &amp;amp; CEO, Policy Bazaar.com&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;"Its better to be No.1 in a niche market than No.20 in a large market"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;"You must be able to state your core value proposition in a single sentence"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;"Be non-conforming"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: times new roman;font-family:times new roman;" &gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;"Leadership is about action not position"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-3897652216162263411?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/3897652216162263411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=3897652216162263411' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/3897652216162263411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/3897652216162263411'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/09/inspirations-from-tiecon-delhi-2009.html' title='Inspirations from TiECon Delhi 2009'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-2130110974178276517</id><published>2009-08-25T12:39:00.000-07:00</published><updated>2009-08-25T13:05:06.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Compression, encryption and deduplication</title><content type='html'>&lt;div&gt;When you are doing backups or archival - compression and encryption is a must. Compression is necessary to save precious bandwidth while encryption is necessary when you store your data outside the boundaries of your data center/home. Now considering that you are archiving data for long periods, you would want to deduplicate it to reduce the amount of storage. But encryption/compression are quite incompatible with deduplication. Deduplication tries to find same blocks in the data set so that the blocks can be shared and storage space can be saved. But even a small change in your data could cause the encryption/compression algorithms to produce very different outputs, fooling the poor little deduplication engine. Deduplication loves patterns in the data and good encryption algorithms try hard to remove patterns from the data for better security.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some googling led me to &lt;a href="http://rsyncrypto.lingnu.com/index.php/Home_Page"&gt;rsyncrypto&lt;/a&gt; and &lt;a href="http://beeznest.wordpress.com/2005/02/03/rsyncable-gzip/"&gt;rsyncable-gzip&lt;/a&gt; - where the rsync algorithm is modified to be compression/encryption friendly. rsync has an excellent algorithm with which only the changed parts of the data need to be sent over the network for syncing data sets.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;rsyncable-gzip is a patch to gzip which cause the compression to be done in chunks rather than processing the entire file in one go. This localizes changes within the compressed binary allowing rsync to do a better job. This can lead to lower compression ratios in some cases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;rsyncrypto modifies the standard encryption schema by localizing the effects of encryption to keep the side-effect changes minimal. This again allows rsync to work much more efficiently. Again this may reduce the efficiency of the encryption algorithm but it will still be good enough for most use cases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now obviously this problem has an easier solution - deduplicate first, then compress, then encrypt. But this flow may not be possible always.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-2130110974178276517?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/2130110974178276517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=2130110974178276517' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/2130110974178276517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/2130110974178276517'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/08/compression-encryption-and.html' title='Compression, encryption and deduplication'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-1147731442978890856</id><published>2009-08-05T01:51:00.000-07:00</published><updated>2009-08-05T02:01:05.991-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Rackspace CloudFiles</title><content type='html'>&lt;div&gt;&lt;a href="http://www.rackspacecloud.com/cloud_hosting_products/files"&gt;CloudFiles&lt;/a&gt; is a cloud storage offering from Rackspace. You can use it for archiving and backing up your web-based storage data. The data is replicated across 3 locations giving you excellent redundancy.&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;I tried out their offering and here are some of my notes:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;- Max file size of 5GB - most cloud storage vendors have these limits mostly due to protocol limitations&lt;br /&gt;- Along with CloudFiles they provide Content Distribution Network(CDN) for distributing data across their data centers around the world.&lt;br /&gt;- 15 cents/GB/month storage cost. 8 cents inbound and 22 cents outbound/GB&lt;br /&gt;- APIs in multiple languages - PHP, Java, C#, Python, Ruby&lt;br /&gt;- They have a "browser panel" which can be used to upload files and distribute using CDN. - Mozilla extension + Mac app to access CloudFiles storage is available. Not maintained by Rackspace though and *not* a backup tool, its just a front-end.&lt;br /&gt;- Provides SSL for security&lt;br /&gt;- Tokens expire every 24 hours and clients need to reconnect. Every operation must use a authentication token.&lt;br /&gt;- FireUploader simulates a hierarchical file system structure which is not possible with CloudFiles.&lt;br /&gt;- Cyberduck used on Mac is a GPL software and a good frontend for CloudFiles&lt;br /&gt;&lt;/div&gt;  &lt;p&gt;- The only way user can access the content from another account is if they share their username/API access key or a session token.&lt;br /&gt;- Files are called "objects" in Rackspace lingo. Data is saved as-is without compression/encryption. It does support metadata in form of key-value pairs so you can "tag" files and organize your data. Metadata is limited to 4KB and max of 90 individual tags can be stored.&lt;br /&gt;- You can enable CDN on certain containers. Each CDN enabled container has a unique Uniform Resource Locator(URL). For example a CDN enabled container named "photos" can be referenced as &lt;a href="http://cdn.cloudfiles.mosso.com/c3131" target="_blank"&gt;http://cdn.cloudfiles.mosso.&lt;wbr&gt;com/c3131&lt;/a&gt; - if this container has an image named "baby.jpg" then that image can be served through LimeLight Networks CDN with the URL of &lt;a href="http://cdn.cloudfiles.mosso.com/c3131/wow1.jpg" target="_blank"&gt;http://cdn.cloudfiles.mosso.&lt;wbr&gt;com/c3131/wow1.jpg&lt;/a&gt;. This is how we can enable SaaS applications to use data stored on our customer's accounts.&lt;br /&gt;- Code snippets and documentation of APIs is good and code examples are available.&lt;br /&gt;- The APIs are Restful i.e. Representational State Transfer protocol.&lt;/p&gt; &lt;p&gt;- You need to do a GET call on the account to get a list of all containers in the account. You can get this information in JSON or XML format as well.&lt;br /&gt;- Max of 10000 container names can be returned at a time. You can make a continuation call with a "marker" if you want to retrieve later containers.&lt;br /&gt;- HEAD call is used to find out number of containers in the account and the number of used bytes&lt;br /&gt;- GET operation on a container is used to list objects in the container.&lt;br /&gt;- Pseudo hierarchical folders/directories&lt;br /&gt;   - Users will be able to simulate a hierarchical structure in Cloud Files by following a few guidelines. Object names must contain the forward slash character ‘/’ as a path element separator and also create “directory marker” Objects, then they will be able to traverse this nested structure with the new “path” query parameter. This can best be illustrated by example: For the purposes of this example, the Container where the Objects reside is called “backups”. All Objects in this example start with a prefix of “photos” and should NOT be confused with the Container name.&lt;br /&gt;       In the example, the following “real” Objects are uploaded to the storage system with names representing their full filesystem path.&lt;/p&gt; &lt;p&gt;photos/animals/dogs/poodle.jpg&lt;br /&gt;photos/animals/dogs/terrier.&lt;wbr&gt;jpg&lt;br /&gt;photos/animals/cats/persian.&lt;wbr&gt;jpg&lt;br /&gt;photos/animals/cats/siamese.&lt;wbr&gt;jpg&lt;br /&gt;photos/plants/fern.jpg&lt;br /&gt;photos/plants/rose.jpg&lt;br /&gt;photos/me.jpg&lt;/p&gt; &lt;p&gt;        To take advantage of this feature, the “directory marker” Objects must also be created to represent the appropriate directories. The following additional Objects need to be created. A good convention would be to create these as zero or one byte files with a Content-Type of “application/directory”.&lt;br /&gt;photos/animals/dogs&lt;br /&gt;photos/animals/cats&lt;br /&gt;photos/animals&lt;br /&gt;photos/plants&lt;br /&gt;photos&lt;/p&gt; &lt;p&gt;Now issuing a GET request against the Container name coupled with the “path” query parameter of the directory to list can traverse these “directories”. Only the request line and results are depicted below excluding other request/response headers.&lt;/p&gt;  &lt;p&gt;GET /v1/AccountString/backups?&lt;wbr&gt;path=photos HTTP/1.1&lt;/p&gt; &lt;p&gt;photos/animals&lt;br /&gt;photos/cats&lt;br /&gt;photos/me.jpg&lt;/p&gt; &lt;p&gt;To traverse down into the “animals” directory, specify that path. GET /v1/AccountString/backups?&lt;wbr&gt;path=photos/animals&lt;/p&gt; &lt;p&gt;photos/animals/dogs&lt;br /&gt;photos/animals/cats&lt;/p&gt; &lt;p&gt;By combining this “path” query parmater with the “format” query parameter, users will be able to easily distinguish between virtual folders/directories by Content-Type and build interfaces that allow traversal of the pseudo-nested structure. &lt;/p&gt;  &lt;p&gt;- DELETE call on container will not succeed if it has objects&lt;br /&gt;- HEAD operation on object is used to retrieve object metadata and standard HTTP headers&lt;br /&gt;- GET call is used to used to retrieve object data. It supports headers like If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since. It is possible to get a range of bytes as well.&lt;br /&gt;- PUT call is used to write or overwrite an object's metadata and content. End-to-end data integrity can be ensured by including an MD5 checksum of your objects data in the Etag header.&lt;br /&gt;- Chunked requests can be sent if you do not know the size of the object you are PUT'ing but total size must be &lt;5gb&gt; &lt;p&gt;Short-comings mentioned by Rackspace themselves:&lt;br /&gt;- cannot mount or map CloudFiles account as a network drive.&lt;br /&gt;- files cannot be modified so block level changes cannot be done.&lt;br /&gt;- containers cannot be nested&lt;br /&gt;- No ACLs for security&lt;/p&gt;  cURL is a command line tool available on most UNIX environments and it allows you to transmit and receive HTTP requests and responses from the command-line or from within a shell script. So you can work with the ReST API directly instead of using client APIs. I used the cURL tool to test out the calls provided by CloudFiles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-1147731442978890856?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/1147731442978890856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=1147731442978890856' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/1147731442978890856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/1147731442978890856'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/08/rackspace-cloudfiles.html' title='Rackspace CloudFiles'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-6853294465528901906</id><published>2009-05-15T04:55:00.000-07:00</published><updated>2009-05-31T23:21:44.446-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>auto-login using rsh</title><content type='html'>I know that rsh is deprecated but it is used all over the place in the test harness for the product I am working on. I needed to enable auto-login for rsh and rcp but Google didn't give definitive answers. So here is how you should do it:&lt;br /&gt;&lt;br /&gt;- Install rsh-server RPM on the machines which will be communicating&lt;br /&gt;- In /etc/xinetd/{rsh, rexec, rlogin} change "disable = yes" to "disable = no"&lt;br /&gt;- Add rsh, rexec and rlogin to /etc/securetty&lt;br /&gt;- Restart xinetd service:&lt;br /&gt;     service xinetd restart&lt;br /&gt;- Add "hostname username" combinations in ~/.rhosts file. For example if you want to allow root@garfield access then add "garfield root".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-6853294465528901906?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/6853294465528901906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=6853294465528901906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/6853294465528901906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/6853294465528901906'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/05/auto-login-using-rsh.html' title='auto-login using rsh'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-5390673798311096394</id><published>2009-05-15T02:32:00.000-07:00</published><updated>2009-05-15T02:39:34.405-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Fun with assembly level debugging</title><content type='html'>Investigations into a failed regression test revealed that some allocations were breaking page boundaries and when these allocations were passed as buffers to bio's - the read operation failed. The reason for the failure was that DASD requires the bv_len to be on blocksize boundaries whereas if the earlier allocation was breaking across page boundaries without blocksize alignment. It was suspected that the failure was in the dasd_eckd module in dasd_eckd_build_cp():&lt;br /&gt;&lt;br /&gt;       rq_for_each_bio(bio, req) {&lt;br /&gt;        bio_for_each_segment(bv, bio, i) {&lt;br /&gt;        if (bv-&gt;bv_len &amp;amp; (blksize - 1))&lt;br /&gt;                                               /* Eckd can only do full blocks. */&lt;br /&gt;                return ERR_PTR(-EINVAL);&lt;br /&gt;&lt;br /&gt;We needed to make sure that this was the actual point of failure but since we cannot modify the kernel on IBM zSeries machines, we needed to use console debugging to confirm the suspicion.&lt;br /&gt;&lt;br /&gt;Firstly install kernel-debuginfo package which you will need for debugging.&lt;br /&gt;&lt;br /&gt;* Get disassembly code of the module using objdump&lt;br /&gt;&lt;br /&gt;objdump -d /lib/modules/2.6.9-67.EL/kernel/drivers/s390/block/dasd_eckd_mod.ko &gt; dasd_eckd_dis&lt;br /&gt;&lt;br /&gt;0000000000001ef0 &lt;dasd_eckd_build_cp&gt;:&lt;br /&gt;   1ef0:       eb 6f f0 48 00 24          stmg    %r6,%r15,72(%r15)&lt;br /&gt;   1ef6:       c0 d0 00 00 00 00       larl    %r13,1ef6 &lt;dasd_eckd_build_cp+0x6&gt;&lt;br /&gt;   1efc:       b9 04 00 ef                           lgr     %r14,%r15&lt;br /&gt;   1f00:       a7 fb fe 40                            aghi    %r15,-448&lt;br /&gt;   1f04:       c0 c0 00 00 00 00       larl    %r12,1f04 &lt;dasd_eckd_build_cp+0x14&gt;&lt;br /&gt;   1f0a:       e3 e0 f0 98 00 24         stg     %r14,152(%r15)&lt;br /&gt;   1f10:       e3 30 f0 e0 00 24         stg     %r3,224(%r15)&lt;br /&gt;   .....&lt;br /&gt;   .....&lt;br /&gt;   2134:       a7 0a ff ff                 ahi     %r0,-1&lt;br /&gt;   2138:       a7 aa 00 09                         ahi     %r10,9&lt;br /&gt;   213c:       18 51                                           lr      %r5,%r1&lt;br /&gt;   213e:       e3 e0 c0 00 00 04        lg      %r14,0(%r12)&lt;br /&gt;   2144:       e3 90 f1 18 00 04         lg      %r9,280(%r15)&lt;br /&gt;   214a:       58 20 90 08                         l       %r2,8(%r9)&lt;br /&gt;   214e:       18 12                         lr      %r1,%r2&lt;br /&gt;   2150:       18 32                        lr      %r3,%r2&lt;br /&gt;   2152:       14 10                        nr      %r1,%r0&lt;br /&gt;   2154:       88 30 a0 00                        srl     %r3,0(%r10)&lt;br /&gt;*   2158:       a7 74 04 53                      jne     29fe &lt;dasd_eckd_build_cp+0xb0e&gt;&lt;br /&gt;   215c:       e3 10 90 00 00 04       lg      %r1,0(%r9)&lt;br /&gt;   .....&lt;br /&gt;   .....&lt;br /&gt;   29fe:       a7 29 ff ea                             lghi    %r2,-22&lt;br /&gt;   2a02:       a7 f4 06 1b                          j       3638 &lt;dasd_eckd_build_cp+0x1748&gt;&lt;br /&gt;&lt;br /&gt;The line with the '*' was the suspected line which was doing the bv_len alignment check. The jump from this line to dasd_eckd_build_cp+0x29fe confirmed this. EINVAL = 22 and after loading the return value the function returns.&lt;br /&gt;&lt;br /&gt;Now while setting breakpoints, remember not to use addresses or offsets from the objdump(if you do remember to subtract start addr of the function from the offset of the instruction). Or better yet you can use the disassembly output from GDB:&lt;br /&gt;&lt;br /&gt;$ gdb /lib/modules/2.6.9-67.EL/kernel/drivers/s390/block/dasd_eckd_mod.ko&lt;br /&gt;&lt;br /&gt;(gdb) disassemble dasd_eckd_build_cp&lt;br /&gt;Dump of assembler code for function dasd_eckd_build_cp:&lt;br /&gt;0x0000000000001ef0 &lt;dasd_eckd_build_cp+0&gt;:    stmg    %r6,%r15,72(%r15)&lt;br /&gt;0x0000000000001ef6 &lt;dasd_eckd_build_cp+6&gt;:    larl    %r13,0x1ef6 &lt;dasd_eckd_build_cp+6&gt;&lt;br /&gt;0x0000000000001efc &lt;dasd_eckd_build_cp+12&gt;:    lgr    %r14,%r15&lt;br /&gt;0x0000000000001f00 &lt;dasd_eckd_build_cp+16&gt;:    aghi    %r15,-448&lt;br /&gt;0x0000000000001f04 &lt;dasd_eckd_build_cp+20&gt;:    larl    %r12,0x1f04 &lt;dasd_eckd_build_cp+20&gt;&lt;br /&gt;0x0000000000001f0a &lt;dasd_eckd_build_cp+26&gt;:    stg    %r14,152(%r15)&lt;br /&gt;0x0000000000001f10 &lt;dasd_eckd_build_cp+32&gt;:    stg    %r3,224(%r15)&lt;br /&gt;0x0000000000001f16 &lt;dasd_eckd_build_cp+38&gt;:    stg    %r2,216(%r15)&lt;br /&gt;0x0000000000001f1c &lt;dasd_eckd_build_cp+44&gt;:    mvi    359(%r15),134&lt;br /&gt;0x0000000000001f20 &lt;dasd_eckd_build_cp+48&gt;:    lg    %r1,16(%r3)&lt;br /&gt;0x0000000000001f26 &lt;dasd_eckd_build_cp+54&gt;:    tml    %r1,1&lt;br /&gt;0x0000000000001f2a &lt;dasd_eckd_build_cp+58&gt;:    mvc    232(8,%r15),88(%r2)&lt;br /&gt;0x0000000000001f30 &lt;dasd_eckd_build_cp+64&gt;:    je    0x1f40 &lt;dasd_eckd_build_cp+80&gt;&lt;br /&gt;0x0000000000001f34 &lt;dasd_eckd_build_cp+68&gt;:    tml    %r1,1&lt;br /&gt;0x0000000000001f38 &lt;dasd_eckd_build_cp+72&gt;:    mvi    359(%r15),133&lt;br /&gt;0x0000000000001f3c &lt;dasd_eckd_build_cp+76&gt;:    je    0x29fe &lt;dasd_eckd_build_cp+2830&gt;&lt;br /&gt;0x0000000000001f40 &lt;dasd_eckd_build_cp+80&gt;:    lg    %r2,232(%r15)&lt;br /&gt;.....&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;Remember that the offsets here are in decimal not in hex.&lt;br /&gt;&lt;br /&gt;0x00000000000029fe &lt;dasd_eckd_build_cp+2830&gt;:    lghi    %r2,-22&lt;br /&gt;&lt;br /&gt;OK, so as you can see we are jumping to 0x29fe which is the above instruction for which the offset is 2830. So find out the address for dasd_eckd_build_cp from kallsyms&lt;br /&gt;&lt;br /&gt;cat /proc/kallsyms &gt; kallsyms.&lt;br /&gt;&lt;br /&gt;Here it is 0x000000006088f27c, so we place a breakpoint on /x 0x000000006088f27c+ 2830&lt;br /&gt;&lt;br /&gt;Go to the CP console and all the rest is to be done here:&lt;br /&gt;&lt;br /&gt;#CP TR I PSWA 6088fd8a&lt;br /&gt;&lt;br /&gt;- this will set a trace point at given address.&lt;br /&gt;&lt;br /&gt;The reason we should not set a tracepoint on the above jump instructions is because we see many false positives and that makes debugging impossible.&lt;br /&gt;&lt;br /&gt;You can query all tracepoints using #CP Q TR.&lt;br /&gt;&lt;br /&gt;When you hit a tracepoint, you can do the following to continue #CP B&lt;br /&gt;&lt;br /&gt;If you want to single step: #CP TR I&lt;br /&gt;followed by #CP B&lt;br /&gt;Each "#CP B" will take you forward one instruction.&lt;br /&gt;&lt;br /&gt;When you want to end tracing and remove all traces do #CP TR END&lt;br /&gt;&lt;br /&gt;If you want to break within a function address range:&lt;br /&gt;#CP TR I R &lt;function-addr&gt;.&lt;range&gt;&lt;br /&gt;&lt;br /&gt;eg. #CP TR I R 6088f27c.200&lt;br /&gt;&lt;br /&gt;To display registers you can use:&lt;br /&gt;#CP D G - group registers&lt;br /&gt;#CP D X - control registers&lt;br /&gt;#CP D AR - access registers&lt;br /&gt;#CP D PSW - display PSW&lt;br /&gt;&lt;br /&gt;After insmod'ing a reproducer module, with the trace on - we hit the instruction which returns EINVAL thereby confirming the problem.&lt;/range&gt;&lt;/function-addr&gt;&lt;/dasd_eckd_build_cp+2830&gt;&lt;/dasd_eckd_build_cp+80&gt;&lt;/dasd_eckd_build_cp+2830&gt;&lt;/dasd_eckd_build_cp+76&gt;&lt;/dasd_eckd_build_cp+72&gt;&lt;/dasd_eckd_build_cp+68&gt;&lt;/dasd_eckd_build_cp+80&gt;&lt;/dasd_eckd_build_cp+64&gt;&lt;/dasd_eckd_build_cp+58&gt;&lt;/dasd_eckd_build_cp+54&gt;&lt;/dasd_eckd_build_cp+48&gt;&lt;/dasd_eckd_build_cp+44&gt;&lt;/dasd_eckd_build_cp+38&gt;&lt;/dasd_eckd_build_cp+32&gt;&lt;/dasd_eckd_build_cp+26&gt;&lt;/dasd_eckd_build_cp+20&gt;&lt;/dasd_eckd_build_cp+20&gt;&lt;/dasd_eckd_build_cp+16&gt;&lt;/dasd_eckd_build_cp+12&gt;&lt;/dasd_eckd_build_cp+6&gt;&lt;/dasd_eckd_build_cp+6&gt;&lt;/dasd_eckd_build_cp+0&gt;&lt;/dasd_eckd_build_cp+0x1748&gt;&lt;/dasd_eckd_build_cp+0xb0e&gt;&lt;/dasd_eckd_build_cp+0x14&gt;&lt;/dasd_eckd_build_cp+0x6&gt;&lt;/dasd_eckd_build_cp&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-5390673798311096394?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/5390673798311096394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=5390673798311096394' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/5390673798311096394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/5390673798311096394'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/05/fun-with-assembly-level-debugging.html' title='Fun with assembly level debugging'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-7870019180396668068</id><published>2009-04-24T04:40:00.000-07:00</published><updated>2009-04-24T06:05:19.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='celebration'/><title type='text'>Overwhelmed</title><content type='html'>Last week on 17th April was our first marriage anniversary. The last year has easily been the best of my life - filled with love, affection, laughter and lots of success for both of us. We definitely planned to celebrate it in a big way and Goa was an ideal place for a romantic getaway.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hn-t8jfS410/SfGpU33fayI/AAAAAAAABWg/lgcSq16AQYg/s1600-h/DSC01862.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 255px; height: 213px;" src="http://2.bp.blogspot.com/_Hn-t8jfS410/SfGpU33fayI/AAAAAAAABWg/lgcSq16AQYg/s320/DSC01862.JPG" alt="" id="BLOGGER_PHOTO_ID_5328226010215181090" border="0" /&gt;&lt;/a&gt;We stayed a &lt;a href="http://www.lemontreehotels.com/"&gt;Lemon Tree Amarante&lt;/a&gt; hotel and the stay was comfortable and leisurely. With the beach just about 500 meters away and an awesome pool(with a pool bar), this is just about the ideal Goa hotel. It was great fun to watch  DVDs on the LCD TV provided in each room.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hn-t8jfS410/SfGqtugTVPI/AAAAAAAABWo/9gcj7QANmD0/s1600-h/DSC01837.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 260px; height: 175px;" src="http://1.bp.blogspot.com/_Hn-t8jfS410/SfGqtugTVPI/AAAAAAAABWo/9gcj7QANmD0/s320/DSC01837.JPG" alt="" id="BLOGGER_PHOTO_ID_5328227536710358258" border="0" /&gt;&lt;/a&gt;The Goa beaches were full of life with lots of shacks providing awesome cocktails and really tasty food. There was a cool breeze soothing us all through the day. Chilling out in each others company on the beach for hours together was really memorable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The icing on the cake were the cute and brilliant gifts given to me by Komal. She gave me all of four gifts, each one better than the other:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hn-t8jfS410/SfGr_g6HW-I/AAAAAAAABWw/pbYJ6-5p8Qk/s1600-h/DSC01860.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_Hn-t8jfS410/SfGr_g6HW-I/AAAAAAAABWw/pbYJ6-5p8Qk/s320/DSC01860.JPG" alt="" id="BLOGGER_PHOTO_ID_5328228941809802210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A very nice photo of ours engraved in a crystal. The platform on which it is elevated beautifies it with different colors being dispersed.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hn-t8jfS410/SfGtDz4_m_I/AAAAAAAABW4/Me3UGdVvYDI/s1600-h/DSC01875.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_Hn-t8jfS410/SfGtDz4_m_I/AAAAAAAABW4/Me3UGdVvYDI/s320/DSC01875.JPG" alt="" id="BLOGGER_PHOTO_ID_5328230115136478194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xmini.nl/"&gt;XMini capsule speakers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A very compact and cute speaker for our iTouch with surprisingly good sound quality for its size. It has a cool battery life of 8 hours and can also be charged through USB port.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hn-t8jfS410/SfGuEzyeZXI/AAAAAAAABXA/zy8IQwRt210/s1600-h/DSC01897.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_Hn-t8jfS410/SfGuEzyeZXI/AAAAAAAABXA/zy8IQwRt210/s320/DSC01897.JPG" alt="" id="BLOGGER_PHOTO_ID_5328231231800632690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A magnificent diamond studded gold pendant with our initials. This design is Komal's handiwork - really creative.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hn-t8jfS410/SfGw6p3SjwI/AAAAAAAABXI/xLJ9YO15nOU/s1600-h/DSC01969.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_Hn-t8jfS410/SfGw6p3SjwI/AAAAAAAABXI/xLJ9YO15nOU/s320/DSC01969.JPG" alt="" id="BLOGGER_PHOTO_ID_5328234355872665346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The tale of our life as a conglomeration of pictures. Komal blew me away with her artistic skills and creativity with this one. She must have spent long hours making this amazing piece of work. Though to be honest, its beauty is not reflected in these pics - it looks much more beautiful in real life.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hn-t8jfS410/SfGw69LnggI/AAAAAAAABXQ/aQ2Nms9gB9U/s1600-h/DSC01971.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_Hn-t8jfS410/SfGw69LnggI/AAAAAAAABXQ/aQ2Nms9gB9U/s320/DSC01971.JPG" alt="" id="BLOGGER_PHOTO_ID_5328234361058198018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cute collage of my pics when I was little and was actually sweet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hn-t8jfS410/SfG09RfyJUI/AAAAAAAABXw/XDWzhvBvldk/s1600-h/DSC01976.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_Hn-t8jfS410/SfG09RfyJUI/AAAAAAAABXw/XDWzhvBvldk/s320/DSC01976.JPG" alt="" id="BLOGGER_PHOTO_ID_5328238798917739842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Collage of Komal's college life pics. Looking beautiful wifu!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hn-t8jfS410/SfG1lxZzfjI/AAAAAAAABX4/GZkcIhSYCJM/s1600-h/DSC01979.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_Hn-t8jfS410/SfG1lxZzfjI/AAAAAAAABX4/GZkcIhSYCJM/s320/DSC01979.JPG" alt="" id="BLOGGER_PHOTO_ID_5328239494677364274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A great pic with awesome expressions!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hn-t8jfS410/SfG2mqgq0WI/AAAAAAAABYA/fSTb4X67wjo/s1600-h/DSC01933.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 281px; height: 240px;" src="http://4.bp.blogspot.com/_Hn-t8jfS410/SfG2mqgq0WI/AAAAAAAABYA/fSTb4X67wjo/s320/DSC01933.JPG" alt="" id="BLOGGER_PHOTO_ID_5328240609518604642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Dinner at the "Beach House" restaurant at the Taj. The ambience was exhilarating - overlooking the sea, with a beautiful breeze and awesome food. Gotta go and stay at Taj sometime - its a different experience which cannot be put into words.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-7870019180396668068?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/7870019180396668068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=7870019180396668068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/7870019180396668068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/7870019180396668068'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/04/overwhelmed.html' title='Overwhelmed'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Hn-t8jfS410/SfGpU33fayI/AAAAAAAABWg/lgcSq16AQYg/s72-c/DSC01862.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-5601160082735234050</id><published>2009-04-20T05:51:00.000-07:00</published><updated>2009-04-21T00:52:34.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Corporate'/><title type='text'>Oracle buys Sun</title><content type='html'>That Sun was putting itself out in the market and someone would step up to pay a decent price was written in stone. And finally it has happened with &lt;a href="http://www.nytimes.com/2009/04/21/technology/companies/21sun.html?ref=technology"&gt;Oracle buying Sun&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Personally I think this is a good deal for Sun. Before the talks with IBM, Sun stock was trading around $3-4 and now they are being sold at $9.50 per share. That is a very good deal for the investors and Sun employees. IBM and Sun had many similar products and would certainly have resulted in job losses. Oracle is flush with money and will surely continue to invest in Sun products since there is little overlap.&lt;br /&gt;&lt;br /&gt;Some of my interesting thoughts about this deal:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Oracle must be loving the thought of owning Java since its the crucial glue in their software offerings.&lt;/li&gt;&lt;li&gt;Contrary to popular perception, Oracle won't kill MySQL - instead they will continue investing in it so that they get an entry in the low-end database market. Customers can then be upgraded to Oracle as they grow - a win-win situation for Oracle. Note that since MySQL is open-source if Oracle won't develop it, someone else surely will.&lt;/li&gt;&lt;li&gt;Oracle now has access to the entire storage stack - Oracle database running on Java, ZFS, Sun hardware, Oracle backed Linux. That is a pretty strong offering.&lt;/li&gt;&lt;li&gt;Every M&amp;amp;A deal brings with it some amount of layoffs, resignations, cultural changes but its this very churn that Sun has needed since a long time. Majority of the people will come of smiling eventually.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-5601160082735234050?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/5601160082735234050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=5601160082735234050' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/5601160082735234050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/5601160082735234050'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/04/oracle-buys-sun.html' title='Oracle buys Sun'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-4723524714319366297</id><published>2009-04-11T22:17:00.000-07:00</published><updated>2009-04-12T00:14:13.079-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Election'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Don't vote for independents and regional parties</title><content type='html'>I have a fervent plea to all voters - please *DO NOT* vote for independents or regional parties for next 10 years or so. Even if these candidates may be honest, hard-working, result-oriented - please keep them out of power.&lt;br /&gt;&lt;br /&gt;I know this logic seems inverted and downright stupid for the uninitiated. But think about it - the only way we can have a strong government is if one of the national parties receives a majority. Only then can the government go forward with development agenda instead of catering to the whims of individuals or factions. I personally don't care if its the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;BJP&lt;/span&gt; or the Congress which gets the majority - come to think of it both of them have tried to do a good job since 1998. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;BJP&lt;/span&gt; did this nation great service by going ahead with the nuclear tests and opening up the economy - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;in fact&lt;/span&gt; it laid the ground-work for the boom we saw post 2004. Congress also tried to make positive reforms in various sectors like insurance, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;telecom&lt;/span&gt;, nuclear deal, etc. but the fear of the Left kept the Congress from doing a stellar job.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Right now the national parties spend half their time hob-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;knobbing&lt;/span&gt; with their so-called allies and only the remainder of the time is given to the people. And I don't blame them. We as a people have failed if we vote on the following basis:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;caste - needless to say majority of votes are given/taken on the basis of caste and the percentage of people voting on the basis of caste must start reducing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;regional pride -  Vote for the national government on the basis of regionalism is downright stupid. A good &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;independent&lt;/span&gt; legislator is *useless*. He cannot push through reforms alone. Democratic  governments run on collective ideology, not personal whims. So while it may *seem* like a good idea to vote for a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;independent&lt;/span&gt; candidate with a clean profile, it doesn't help you eventually.&lt;/li&gt;&lt;li&gt;Short term promises - The only promises that should be respected are those that have the potential of empowerment - education, skill training, long term infrastructure projects through government spending, making bureaucracy accountable, transparent governance. Promises like reservations, subsidies, freebies only weaken the populace as I have indicated in my previous post - though I must admit it will look attractive to the minimum wage earner.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So my request to you is very simple - look who among &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;BJP&lt;/span&gt; or Congress candidate in your region is more better and vote for him.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Ok&lt;/span&gt;, now for the skeptics: you will very rightly say that this cannot go on forever. You are right - we should do this only for this and the next election. And hopefully until then the national parties would have given a good account of themselves. Hopefully by then parties like Shiv Sena, MNS, Left, AIADMK, Trinamool, BSP, BJD, etc. would be relegated to the side-lines and we will have successive strong governments at the centre taking India where it should be.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-4723524714319366297?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/4723524714319366297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=4723524714319366297' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/4723524714319366297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/4723524714319366297'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/04/dont-vote-for-independents-and-regional.html' title='Don&apos;t vote for independents and regional parties'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-6761282081728800504</id><published>2009-04-07T05:33:00.000-07:00</published><updated>2009-04-12T00:14:52.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='NFS'/><title type='text'>NFS tricks</title><content type='html'>Today while trying to use NFS between different OSes I hit a few problems that I had not seen before. I am listing them down here:&lt;br /&gt;&lt;br /&gt;- Since the NFS server had SunOS and client had Linux, they were speaking different NFS protocols. In this case "-o ver=3" option needs to be used so that NFS v3 is used as the protocol.&lt;br /&gt;- The uid and gid on the server and client was not the same and hence permission was being denied. Either I would have to create same UID/GIDs on both server and client, or allow rwx access to all users on the server. I had to choose the latter, since I do not have root access on the server.&lt;br /&gt;- While trying to untar, I hit this error "cannot change ownership to uid X, gid X". This was because while untarring the UID/GID information was being preserved and these were not present on the client. You can get around this by using --no-same-premissions argument for tar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-6761282081728800504?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/6761282081728800504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=6761282081728800504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/6761282081728800504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/6761282081728800504'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/04/nfs-tricks.html' title='NFS tricks'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-870422565885496072</id><published>2009-04-01T04:32:00.000-07:00</published><updated>2009-04-12T00:22:56.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Election'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Of the poor, by the poor, for the poor</title><content type='html'>I came across &lt;a href="http://timesofindia.indiatimes.com/Pune/Time-again-to-elect-govt-of-aam-aadmi-Rahul/articleshow/4341563.cms"&gt;these&lt;/a&gt; comments made by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Rahul&lt;/span&gt; Gandhi and they made me very angry. Lets consider what all our government already does for the poor:&lt;br /&gt;&lt;br /&gt;- subsidized food grains, kerosene&lt;br /&gt;- subsidized petrol, diesel costing approximately 1.3 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;lakh&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;crore&lt;/span&gt; rupees last year&lt;br /&gt;- subsidized work culture since government employees need not be afraid of being fired for not meeting work standards&lt;br /&gt;- farm subsidies including no taxation on agricultural income, free electricity, government regulated fertilizer prices, free power and guess what - free money in the form of loan waivers&lt;br /&gt;- subsidized/free &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;healthcare&lt;/span&gt; at government hospitals&lt;br /&gt;- subsidies in form of ailing and loss making government companies&lt;br /&gt;&lt;br /&gt;At first glance our government comes across as very noble and seemingly the state of the poor people should be alleviated with all this. Then why have these long drawn policies not led to substantial reduction in our poverty rate? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Infact&lt;/span&gt; when Nehru was absolutely pro-poor(to the extent of being anti-rich) our growth rate was at its lowest. What are the reasons for this anti-thesis? While many posts can be written on the reasons, I will start with the most basic ones:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; any robust economy is driven my a minority of the population. This means that in a country of 1+ billion people you cannot expect 70% of the people to be rich/middle class. Whenever the crest of growth of a country is reached, the consumption flattens and leads to deflation - many European countries and Japan is a good example of this.  Currently only 3% of the Indian population pays their taxes. Government should try to increase their tax net to 10-20% over next 5 years. And it is this 10-20% which will be driver of the economy creating enough consumption demand to help alleviate poverty of the rest.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Lesson: stop throwing more good money behind bad money. Instead start new projects which pays for services _in lieu_ for something &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;atleast&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Huge GDP deficits: Insane government spending mostly in form of subsidies causes large GDP deficits. This means that country has spent more money than it has. Every government _raises_ such money by issuing bonds which are bought by banks, other governments, etc. The more your GDP deficit, the more interest you need to pay because your credit rating gets lowered due to heavy borrowing. This increases governments cost of expenditure and slows down growth in the long term. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;"false demand": I would stick my neck out and say that if we had lower subsidies we would be much less affected by the current economic crisis. Reason? Any economic cycle consists of cyclical booms and busts. Important thing is to throttle growth when it is driven by credit money. While the international fuel prices were going through the roof, demand in India wad at its peak because prices here were unaffected. Then suddenly the government realized that country's economy will crumble if we keep subsidizing oil and hence the prices were increased suddenly. This jolts the economy. If prices are decided by market fluctuations then demand also gets throttled at the right time. This way while growth may be slower, it lasts longer and we certainly would not need to see 50% stock market drop in 6 months.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Giving freebies _for a lifetime_ sets a bad habit among the population. What is being implicitly said here is that if you are ready to accept a poor life we will feed you and keep you alive. We want to empower people, provide them with skills or education and until such time that they are learning you can shower them with freebies but please not forever.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-870422565885496072?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/870422565885496072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=870422565885496072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/870422565885496072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/870422565885496072'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2009/04/of-poor-by-poor-for-poor.html' title='Of the poor, by the poor, for the poor'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-6804991181127866671</id><published>2007-10-03T13:10:00.001-07:00</published><updated>2009-04-12T00:21:33.179-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><title type='text'>Making e2fsck parallel?</title><content type='html'>Making any fsck checker parallel is fraught with the likelihood that things can go wrong in some setups, with wierd hardwares and with different RAID configurations. XFS have added a prefetch mechanism to xfs_repair which does gives good results in most use-cases but "parallel fsck" is different from "readahead in fsck".&lt;br /&gt;&lt;br /&gt;I have a few ideas (scattered, but jotting it down lest I forget them), about having proper parallelization in atleast pass1 (and probably pass2) in e2fsck. Pass1 of e2fsck reads inodes and dumps information into certain data structures, like inode_used_map, block_used_map, directory bitmap, dir block list, etc. Val Henson has recently posted a promising patch which adds readahead threads in pass1of e2fsck where processing of inodes will still be done serially. This does not lend any performance benefits&lt;br /&gt;in a single disk case (though she noted excellent benefits in case of multi-disk RAID arrays).&lt;br /&gt;&lt;br /&gt;So coming to the point, I think we can have multiple threads processing on the inodes and dumping information into the pass1 data structures. Contention can be greatly reduced (IMHO made negligible), by having each thread have a cache for each data structure. Each thread can then dump the information into the global shared data structure after its cache is full or after certain time period. This will also speed up e2fsck on single disk machines, as both cores(provided you have a dual-core CPU) can be working parallely.&lt;br /&gt;&lt;br /&gt;Another important addition that can be made is to merge read/write requests coming in from different threads, this will especially help reading directory blocks which tend to be scattered around.&lt;br /&gt;&lt;br /&gt;But, the fun of all this lies in the implementation, design seems easy enough logically, but implementation would be mired in intricacies. But this seems very interesting to implement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-6804991181127866671?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/6804991181127866671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=6804991181127866671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/6804991181127866671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/6804991181127866671'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2007/10/making-e2fsck-parallel.html' title='Making e2fsck parallel?'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7623434036211003634.post-7032604093165426329</id><published>2007-05-17T14:02:00.000-07:00</published><updated>2009-04-12T00:22:16.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technical'/><category scheme='http://www.blogger.com/atom/ns#' term='Lustre'/><title type='text'>Lustre on UML, it works!!!!</title><content type='html'>I have always hated being dependent on my test machine and finding ways to dump it. VMWare is agonizingly slow and requires a LOT of memory which I cannot afford. Also what if I want to run 5 instances of a kernel??? So the next best option is UML (User Mode Linux), setting it up for basic filesystem programming was easy enough but setting it up for Lustre (www.lustre.org) was a good challenge. Lustre requires networking support, external modules so gcc versions should match, etc. so some extra stuff needs to be configured.&lt;br /&gt;&lt;br /&gt;After many futile attempts at getting this done, I finally managed to run Lustre in UML. These are the approximate steps to do it. not for the weak of heart :)&lt;br /&gt;&lt;br /&gt;But once it is setup you can work on it just like a test machine and setup a proper cluster with different MDS and OSTs and clients.&lt;br /&gt;&lt;br /&gt;1) Patch your linux sources (2.6.18 lets say) with the lustre patches&lt;br /&gt;and compile it for UML.&lt;br /&gt;&lt;br /&gt;make defconfig ARCH=um&lt;br /&gt;make menuconfig ARCH=um&lt;br /&gt;select hostfs, loopback support, all ext3 options, universal tun support for networking.&lt;br /&gt;make ARCH=um&lt;br /&gt;&lt;br /&gt;2) Presuming you are doing this on fc6, get a fc6 root image from the internet or from me. Boot from the root image by&lt;br /&gt;$ ./linux ubda=FC6_root_image eth0=tuntap,,,192.168.1.254 mem=256M&lt;br /&gt;&lt;br /&gt;On your host system, you should set eth0 to the above string and do a tunctl -u root (this means you set the user for the tun, you need tun.ko present)&lt;br /&gt;&lt;br /&gt;In UML, do ifconfig eth0 192.168.1.253 up and eth0 will be up in UML. Now add routing info by route add default gw 192.168.1.254 and your network is up.&lt;br /&gt;&lt;br /&gt;3) Compile lustre sources with-linux set to your UML folder.&lt;br /&gt;&lt;br /&gt;4) In UML, mount the host folder which has lustre like:&lt;br /&gt;mount -t hostfs none -o /mnt/store/my_lustre_path /mnt/host_fs&lt;br /&gt;&lt;br /&gt;5) Go to the lustre sources and insmod the modules by hand or run llmount.sh and you are done.&lt;br /&gt;Make sure that host and rootfs use same gcc versions.&lt;br /&gt;&lt;br /&gt;Note that there will be a few problems in between but nothing that&lt;br /&gt;google can't solve. Then dump your test machine. :)&lt;br /&gt;&lt;br /&gt;Here are some potential problems you may face:&lt;br /&gt;1) UML does not compile on your system. Google and see if you can find some patch from blaisorblade. If not hack away, thats what I did. Deleted some headers and move some defines, whatever needs to be done. Make sure that you dont try to do it on fc6 since fc6 has some utrace patches which stop UML kernel from booting.&lt;br /&gt;2) GCC versions of host and rootfs do not match and hence modules do not get inserted. I tried using a different GCC versions but caused problems.&lt;br /&gt;3) Lustre networking - You may forget setting up the routing table, so you may want to automate it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7623434036211003634-7032604093165426329?l=tech-rumble.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tech-rumble.blogspot.com/feeds/7032604093165426329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7623434036211003634&amp;postID=7032604093165426329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/7032604093165426329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7623434036211003634/posts/default/7032604093165426329'/><link rel='alternate' type='text/html' href='http://tech-rumble.blogspot.com/2007/05/lustre-on-uml-it-works.html' title='Lustre on UML, it works!!!!'/><author><name>Kalpak Shah</name><uri>http://www.blogger.com/profile/00361573276371670024</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='18' src='http://3.bp.blogspot.com/_Hn-t8jfS410/SeF3TUyG53I/AAAAAAAABL4/Q3jtQCMcXwI/S220/DSC01783.JPG'/></author><thr:total>0</thr:total></entry></feed>
