<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Coding the Architecture - nonfunctionalrequirements tag</title>
  <link>http://www.codingthearchitecture.com/tags/nonfunctionalrequirements/</link>
  <description>Software architecture for developers</description>
  <language>en</language>
  <copyright>Coding the Architecture</copyright>
  <lastBuildDate>Mon, 21 May 2012 09:41:00 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>Software architecture is a platform for conversation</title>
    <link>http://www.codingthearchitecture.com/2009/12/01/software_architecture_is_a_platform_for_conversation.html</link>
    
      
        <description>
          &lt;p&gt;
If you&#039;re writing software as a part of your day-to-day job, then it&#039;s likely that your software isn&#039;t going to live in isolation. We tend to feel safe in our little project teams, particularly when everybody knows each other and team spirits are high. We&#039;ve even built up development processes around helping us communicate better, prioritise better and ultimately deliver better software. However, most software projects are still developed in isolation by teams that are locked away from their users and their operational environments.
&lt;/p&gt;

&lt;div align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/book/software-architecture-is-a-platform-for-conversation-1.png&#034; alt=&#034;Software architecture is a platform for conversation&#034; /&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;a href=&#034;http://www.codingthearchitecture.com/pages/book/software-architecture-is-a-platform-for-conversation.html&#034; target=&#034;_blank&#034;&gt;Read the full essay...&lt;/a&gt;
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2009/12/01/software_architecture_is_a_platform_for_conversation.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2009/12/01/software_architecture_is_a_platform_for_conversation.html</guid>
    <pubDate>Tue, 01 Dec 2009 22:03:13 GMT</pubDate>
  </item>
  
  <item>
    <title>A developer&#039;s guide to load testing - video</title>
    <link>http://www.codingthearchitecture.com/2009/06/15/a_developers_guide_to_load_testing_video.html</link>
    
      
        <description>
          &lt;p&gt;
Just a quickie ... the video from &lt;a href=&#034;http://www.codingthearchitecture.com/2009/06/11/a_developers_guide_to_load_testing_slides.html&#034;&gt;A developer&#039;s guide to load testing&lt;/a&gt; at Skills Matter last week is now available to &lt;a href=&#034;http://skillsmatter.com/podcast/design-architecture/a-developers-guide-to-load-testing&#034;&gt;view online&lt;/a&gt;. The microphone picked up the questions and comments quite well, which is excellent. Enjoy, and feel free to use the &lt;a href=&#034;http://groups.google.com/group/codingthearchitecture&#034;&gt;Google Group&lt;/a&gt; to continue the discussion.
&lt;/p&gt;

&lt;div align=&#034;center&#034;&gt;
&lt;object width=&#034;400&#034; height=&#034;300&#034;&gt;&lt;param name=&#034;allowfullscreen&#034; value=&#034;true&#034; /&gt;&lt;param name=&#034;allowscriptaccess&#034; value=&#034;always&#034; /&gt;&lt;param name=&#034;movie&#034; value=&#034;http://vimeo.com/moogaloop.swf?clip_id=5116578&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&#034; /&gt;&lt;embed src=&#034;http://vimeo.com/moogaloop.swf?clip_id=5116578&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&#034; type=&#034;application/x-shockwave-flash&#034; allowfullscreen=&#034;true&#034; allowscriptaccess=&#034;always&#034; width=&#034;400&#034; height=&#034;300&#034;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/div&gt;

&lt;p&gt;
Thanks again to &lt;a href=&#034;http://skillsmatter.com&#034;&gt;Skills Matter&lt;/a&gt;.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you deliver software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2009/06/15/a_developers_guide_to_load_testing_video.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2009/06/15/a_developers_guide_to_load_testing_video.html</guid>
    <pubDate>Mon, 15 Jun 2009 22:27:51 GMT</pubDate>
  </item>
  
  <item>
    <title>A developer&#039;s guide to load testing - slides</title>
    <link>http://www.codingthearchitecture.com/2009/06/11/a_developers_guide_to_load_testing_slides.html</link>
    
      
        <description>
          &lt;p&gt;
Thanks to everybody that came along to the &lt;a href=&#034;http://www.codingthearchitecture.com/2009/06/02/a_developers_guide_to_load_testing.html&#034;&gt;CTA user group earlier in the week&lt;/a&gt;. The tube strike may had reduced the numbers but we still had some great discussion about load testing. My slides are available to &lt;a href=&#034;http://static.codingthearchitecture.com/presentations/20090609-load-testing.pdf&#034;&gt;download&lt;/a&gt; (~4MB) and if anybody wants to continue the discussion, please feel free to use the &lt;a href=&#034;http://groups.google.com/group/codingthearchitecture&#034;&gt;Google Group&lt;/a&gt;.
&lt;/p&gt;

&lt;div align=&#034;center&#034;&gt;
&lt;a href=&#034;http://static.codingthearchitecture.com/presentations/20090609-load-testing.pdf&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/20090609-load-testing-thumbnail.png&#034; alt=&#034;A developer&#039;s guide to load testing&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href=&#034;http://static.codingthearchitecture.com/presentations/20090609-load-testing.pdf&#034;&gt;A developer&#039;s guide to load testing&lt;/a&gt; (PDF, ~4MB) 
&lt;/div&gt;

&lt;p&gt;
I&#039;ll post an update when the Skills Matter podcast/video is available to view online.
&lt;/p&gt;

        </description>
      
      
    
    
    
    <category>How do you deliver software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2009/06/11/a_developers_guide_to_load_testing_slides.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2009/06/11/a_developers_guide_to_load_testing_slides.html</guid>
    <pubDate>Thu, 11 Jun 2009 18:40:49 GMT</pubDate>
  </item>
  
  <item>
    <title>A developer&#039;s guide to load testing</title>
    <link>http://www.codingthearchitecture.com/2009/06/02/a_developers_guide_to_load_testing.html</link>
    
      
        <description>
          &lt;p&gt;
Here are the details of the June 2009 &lt;a href=&#034;http://www.codingthearchitecture.com/pages/londonusergroup.html&#034;&gt;London User Group&lt;/a&gt;.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Title&lt;/b&gt; : A developer&#039;s guide to load testing&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Summary&lt;/b&gt; : Load testing is an often forgotten and seemingly difficult task that many people shy away from doing. It doesn&#039;t have to be this way though, with a basic level of load testing often enough to give you confidence that you&#039;ve satisfied your non-functional requirements around performance and scalability. This session will look at load testing a website from a developers perspective. We&#039;ll look at the differences between load testing, stress testing and soak testing along with a hands-on demonstration of an open source load testing tool that you can use to get started. If you&#039;re building websites in Java, .NET, PHP or indeed any other programming language, this session will show you how easy it is to load test your website.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Date&lt;/b&gt; : Tuesday, 9th June 2009&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Time&lt;/b&gt; : 18:30-20:00&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Location&lt;/b&gt; : Skills Matter, &lt;a href=&#034;http://maps.google.co.uk/maps?f=q&amp;hl=en&amp;q=1+Sekforde+Street+London&amp;sll=53.098145,-2.443696&amp;sspn=11.997343,29.619141&amp;ie=UTF8&amp;ll=51.523271,-0.104671&amp;spn=0.006061,0.014462&amp;z=16&amp;om=1&#034;&gt;1 Sekforde Street&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Format&lt;/b&gt; : Presentation and discussion, with further discussion in a local pub (The Crown).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cost&lt;/b&gt; : Free, but &lt;a href=&#034;http://skillsmatter.com/event/design-architecture/coding-the-architecture&#034;&gt;registration is required&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p align=&#034;center&#034;&gt;
&lt;a href=&#034;http://www.skillsmatter.com&#034;&gt;&lt;img src=&#034;http://www.codingthearchitecture.com/images/skillsmatter.gif&#034; alt=&#034;Skills Matter&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;
&lt;br/&gt;
Many thanks to Skills Matter for sponsoring the user group. 
&lt;/p&gt;

&lt;p&gt;
p.s. this session is being run after the second day of our &lt;a href=&#034;http://www.codingthearchitecture.com/2009/04/30/software_architecture_training_in_london.html&#034;&gt;software architecture training at Skills Matter in London&lt;/a&gt; ... there are a couple of places left if you want to come along and learn about software architecture.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://www.codingthearchitecture.com/2009/06/02/a_developers_guide_to_load_testing.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2009/06/02/a_developers_guide_to_load_testing.html</guid>
    <pubDate>Tue, 02 Jun 2009 08:39:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Who should own the non-functional tests?</title>
    <link>http://www.codingthearchitecture.com/2008/07/07/who_should_own_the_non_functional_tests.html</link>
    
      
        <description>
          &lt;p&gt;
This is a follow-up to a post entitled &lt;a href=&#034;http://www.codingthearchitecture.com/2007/11/05/performance_tuning_java_systems.html&#034;&gt;Performance tuning Java systems&lt;/a&gt; that I made last year, which talked about some performance testing that I was doing for a customer. Last week, I went back to the same customer to make some small tweaks to the test scripts, and this very simple act highlighted something I thought was very interesting.
&lt;/p&gt;

&lt;p&gt;
The key thing about the system being tested is that it&#039;s a customized version of an existing vendor product (a high volume, low latency trading platform), with the vendor being responsible for making all of the changes. At some point last year, my customer wanted to run some tests to ensure that the platform could grow with their business, and that&#039;s where I got involved. After a round of testing, environment reconfiguration and patches, the system more or less delivered on what it promised.
&lt;/p&gt;

&lt;p&gt;
Fast-forward to the current day and I was bought back in to make some changes to the test scripts, because the vendor had made some changes to their web application. Since our performance tests were JMeter based, those changes had a knock-on effect on the tests. The thing I found interesting is that the performance test pack hadn&#039;t been handed over to the vendor. Regardless of the reasons, the benefits of doing this are fairly clear.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ownership&lt;/b&gt; : although it&#039;s good that my customer wanted to proactively test some of the non-functional aspects of the software, I can&#039;t help feeling that the software vendor should have ownership of the test pack. My understanding is that they do little in the way of non-functional testing themselves, so this is an ideal opportunity to rectify this.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Continuous execution&lt;/b&gt; : if the vendor has ownership, they can include the test pack as a part of their integration/build/release process for continuous execution and early warning of performance degrading changes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Accuracy&lt;/b&gt; : I like to think that we did a good job at putting together the performance testing scripts, but we don&#039;t have the inside knowledge of the system that the vendor has. Vendor ownership would ensure that the test scripts are as accurate and representative as possible.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Up to date&lt;/b&gt; : the test scripts are inherently tied to the AJAX web application, which means that they need to be kept in sync when changes are made to the user experience. Again, the vendor is best positioned to do this, and taking a more proactive approach would ensure that user experience changes don&#039;t degrade the non-functional characteristics of the software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The overriding question here is why doesn&#039;t the vendor undertake their own performance testing? They *should* take responsibility for the non-functional characteristics of their software, particularly when they are making claims of how fast and scalable it is. But perhaps more interesting is that the vendor of another product in use in the same space also doesn&#039;t do performance testing. Shouldn&#039;t we be asking more from commercial product vendors?
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you deliver software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2008/07/07/who_should_own_the_non_functional_tests.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2008/07/07/who_should_own_the_non_functional_tests.html</guid>
    <pubDate>Mon, 07 Jul 2008 10:03:00 GMT</pubDate>
  </item>
  
  <item>
    <title>NFRs for system replacements</title>
    <link>http://www.codingthearchitecture.com/2008/05/28/nfrs_for_system_replacements.html</link>
    
      
        <description>
          &lt;p&gt;
As software architects, we tend to write about &lt;a href=&#034;http://www.codingthearchitecture.com/tags/nonfunctionalrequirements/&#034;&gt;non-functional requirements&lt;/a&gt; a lot; particularly about how they should be &lt;a href=&#034;http://www.codingthearchitecture.com/2007/09/06/engaging_without_non_functional_requirements.html&#034;&gt;defined&lt;/a&gt; and &lt;a href=&#034;http://www.codingthearchitecture.com/2007/09/26/nines.html&#034;&gt;challenged&lt;/a&gt; because of the &lt;a href=&#034;http://www.codingthearchitecture.com/2007/07/09/the_influence_of_non_functional_requirements.html&#034;&gt;influence&lt;/a&gt; they have. One of the reasons for talking about NFRs a lot is that, in the majority, project teams don&#039;t give them the attention that they should. And here&#039;s a great example that&#039;s slightly different from &lt;a href=&#034;http://www.codingthearchitecture.com/2007/09/06/engaging_without_non_functional_requirements.html&#034;&gt;the story where none of the NFRs were defined&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
As is the case in most organisations, technology has a limited lifespan. Perhaps the business evolves, the technology becomes harder to maintain, etc. Whatever the reason, many organisations regularly look at replacing their existing systems with solutions that are shinier and more buzzword compliant.
&lt;/p&gt;

&lt;p&gt;
In one of these cases, an organisation put together a 125 page specification for the replacement system detailing exactly what the system should do along with some details of the non-functional requirements. However, out of those 125 pages, only 1 of them featured the NFRs, and they can be summarised as follows.
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Performance&lt;/b&gt; : the system must be fast.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scalability&lt;/b&gt; : the system must be able to support 100 messages per second.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Availability&lt;/b&gt; : the system must be available 24x7.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Security&lt;/b&gt; : only certain individuals are permitted to access the system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Credit where credit is due ... at least some thought was put into the non-functional requirements and conversations to explore those requirements aren&#039;t starting from scratch. But on the other hand, those requirements are meaningless!
&lt;/p&gt;

&lt;p&gt;
I want to end this post on a positive note, so let me contrast this story with another replacement project that I&#039;ve been involved with recently. In this instance, the team *had* thought about the non-functional requirements and had detailed definitions for what they should be. This is excellent, particularly considering that the non-functional requirements surrounding the current implementation are vague in nature. System replacements are an opportunity to revisit what&#039;s important,  and that includes the non-functional aspects too.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2008/05/28/nfrs_for_system_replacements.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2008/05/28/nfrs_for_system_replacements.html</guid>
    <pubDate>Wed, 28 May 2008 10:35:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Scalability Principles</title>
    <link>http://www.infoq.com/articles/scalability-principles</link>
    
      
      
        <description>
          &lt;p&gt;
At the simplest level, &lt;a href=&#034;http://www.infoq.com/news/2007/10/whatisscalability&#034;&gt;scalability is
about doing more of something&lt;/a&gt;. This could be responding to more user requests, executing more work or
handling more data. While designing software has its complexities, making that software
capable of doing lots of work presents its own set of problems.
This article presents some principles and guidelines for building scalable software systems.
&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://www.infoq.com/articles/scalability-principles&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2008/05/21/scalability_principles.html#comments</comments>
    <guid isPermaLink="true">http://www.infoq.com/articles/scalability-principles</guid>
    <pubDate>Wed, 21 May 2008 13:12:25 GMT</pubDate>
  </item>
  
  <item>
    <title>Architectural Assumptions</title>
    <link>http://www.codingthearchitecture.com/2007/12/24/architectural_assumptions.html</link>
    
      
        <description>
          &lt;p&gt;
Most of the systems I&#039;ve worked on in the recent past have been latency rather than throughput orientated. However my current project is definitely throughput focused and scales horizontally rather than vertically (this is a simplification but basically correct).
&lt;/p&gt;
&lt;p&gt;
This has lead to me making a few errors based on my incorrect assumptions. As you may have read I&#039;ve been retrofitting performance metrics, we&#039;re trying to discover the level of overhead compared to &#039;real&#039; work, so I&#039;ve been running a single node on my machine to determine the outputs required for statistics. I wanted to write the results to a database and the DBA asked me to produce an estimate of the load in production before he would create my table structures. Cursing the formality of DBAs, I made some calculations based on the number of tasks and the metrics for each. The number I came up with was huge and the DBA almost coughed up his breakfast.
&lt;/p&gt;
&lt;p&gt;
I was surprised by the number because I had failed to realise that my local test was NOT representative of the real system. If the application was vertically scaled then the quantity of metrics in production would be (roughly) the same as on my desktop PC but this application runs across hundreds of grid machines and each one would output these metrics.
&lt;/p&gt;
&lt;p&gt;
I had just designed a distributed denial of service attack on our own database server. The solution was quite simple - I got the machines that aggregate the outputs to also aggregate the performance metrics. This reduced the load by a couple of orders of magnitude.
&lt;/p&gt;
&lt;p&gt;
I think this is a good example of what happens when you fail to take into account the architecture of a system when writing code. All developers need to be aware of the architecure and how it effects the code they are writing. Does anyone else have similar experiences?
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2007/12/24/architectural_assumptions.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2007/12/24/architectural_assumptions.html</guid>
    <pubDate>Mon, 24 Dec 2007 12:44:59 GMT</pubDate>
  </item>
  
  <item>
    <title>Monitoring Java systems</title>
    <link>http://www.codingthearchitecture.com/2007/11/09/monitoring_java_systems.html</link>
    
      
        <description>
          &lt;p&gt;
Earlier in the week I wrote about &lt;a href=&#034;http://www.codingthearchitecture.com/2007/11/05/performance_tuning_java_systems.html&#034;&gt;performance tuning Java systems&lt;/a&gt; and I hinted that being able to monitor a system is a really useful first step in proving and diagnosing the cause of performance issues. Of course, there are times where you need a profiler, but that&#039;s a different story.
&lt;/p&gt;

&lt;p&gt;
So back to monitoring and I&#039;m still surprised by the number of mission critical systems, particularly in the financial markets sector, where the only way to monitor the system is by tailing a log file. As for management, well, that&#039;s typically non-existent.
&lt;/p&gt;

&lt;p&gt;
One of the things that I now do when I&#039;m architecting a new system is to always spend a little time on thinking about the system from an operations/support perspective, reflected by including a &#034;Monitoring and Management View&#034; in my architecture documents. Ultimately, you need to work out what the non-functional requirements are, and a good way to do this is to sit down with the support team to run through the following sorts of questions.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who will be supporting the system?&lt;/li&gt;
&lt;li&gt;Where are they located?&lt;/li&gt;
&lt;li&gt;What is their skillset and experience?&lt;/li&gt;
&lt;li&gt;Will remote support be required?&lt;/li&gt;
&lt;li&gt;Do you think you&#039;ll want to reconfigure the system at runtime?&lt;/li&gt;
&lt;li&gt;How much control do you want over the log files?&lt;/li&gt;
&lt;li&gt;Do you have a standard monitoring infrastructure that the system should publish information to? (e.g. Tivoli, BMC, etc)&lt;/li&gt;
&lt;li&gt;Do you have existing scripts/code/etc for sending (for example) SNMP traps?&lt;/li&gt;
&lt;li&gt;What granularity of monitoring do you need?&lt;/li&gt;
&lt;li&gt;What granularity of management do you need?&lt;/li&gt;
&lt;li&gt;Do you need a single dashboard for the entire system?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Questions like these are important to ask because you really do need to tailor the monitoring and management to the people that will be supporting the application. Of course, like all functionality, you do need to prioritise monitoring and management features because they do have an associated cost. Similarly, you also need to perform some cost-benefit analysis because it&#039;s no good building a comprehensive web-based administration system for a &lt;a href=&#034;http://www.codingthearchitecture.com/2007/06/27/designing_the_tactical_solution.html&#034;&gt;tactical solution&lt;/a&gt; that only has a 3 month lifepsan, for example.
&lt;/p&gt;

&lt;p&gt;
With Java, a really effective way to monitor and manage applications is using the Java Management Extensions (JMX). As &lt;a href=&#034;http://www.simongbrown.com/blog/2007/01/16/what_can_jmx_do_for_you.html&#034;&gt;I&#039;ve said before&lt;/a&gt;, JMX is one of those technologies that rarely gets a look in, but once you get into it, you&#039;ll become &lt;a href=&#034;http://junit.sourceforge.net/doc/testinfected/testing.htm&#034;&gt;infected&lt;/a&gt;. Using JMX is straightforward enough, but you do need to work out what you want to monitor and manage. With this in mind, I would recommend getting those hooks in as early as you can. Finally, even if you *really* don&#039;t have the time to instrument your code, you can get a certain level of JVM monitoring for *free*, just by &lt;a href=&#034;http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#local&#034;&gt;enabling the JMX agent&lt;/a&gt;. Try it, you have no excuse not to!
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you define software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2007/11/09/monitoring_java_systems.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2007/11/09/monitoring_java_systems.html</guid>
    <pubDate>Fri, 09 Nov 2007 11:18:45 GMT</pubDate>
  </item>
  
  <item>
    <title>Performance tuning Java systems</title>
    <link>http://www.codingthearchitecture.com/2007/11/05/performance_tuning_java_systems.html</link>
    
      
        <description>
          &lt;p&gt;
One of my current projects involves me performance testing a third party Java system. In essence, it&#039;s a distributed/n-tier Java EE web application and we&#039;re hitting it with a high simulated load thanks to Apache JMeter. One of the things we found is that performance degraded quite dramatically as load increased, to the point where some requests could take anywhere up to a minute or two to be serviced. By plotting the raw results and calculating (for example) the 95% percentile, we were able to see that only a very small number of the requests suffered in this way.
&lt;/p&gt;

&lt;p&gt;
After some investigation, the suspected cause of these high response times was &#034;stop the world&#034; garbage collection and we eventually proved this by monitoring the JVM during a test run. Thankfully, the new Java VMs include a ton of tuning options and I&#039;ve found the following references particularly useful in the past.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#034;http://java.sun.com/docs/hotspot/gc5.0/ergo5.html&#034;&gt;Ergonomics in the 5.0 Java Virtual Machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://java.sun.com/performance/reference/whitepapers/5.0_performance.html&#034;&gt;J2SE 5.0 Performance White Paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://java.sun.com/javase/technologies/hotspot/index.jsp&#034;&gt;Java SE HotSpot at a Glance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
So then, some advice :
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure that you define your &lt;a href=&#034;http://www.codingthearchitecture.com/tags/nonfunctionalrequirements&#034;&gt;non-functional requirements&lt;/a&gt; as early in the project as you can, specifying performance in the context of scalability. Once you&#039;ve done this, you can focus on figuring out &lt;a href=&#034;http://www.codingthearchitecture.com/2007/10/02/separating_the_non_functionals.html&#034;&gt;how to meet them&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make sure that you test your key non-functional requirements as soon as possible, preferably with something like a &lt;a href=&#034;http://www.codingthearchitecture.com/2007/10/10/reference_architectures.html&#034;&gt;reference architecture&lt;/a&gt;. Tuning your JVMs early lets you gauge how much more performance you might get with further tuning in the future.&lt;/li&gt;
&lt;li&gt;Make sure that you document your JVM settings if you&#039;ve had to tune them to meet your performance targets. The system I&#039;m testing is a third party product and there&#039;s no way that the customer should even be running, what&#039;s basically a &#034;real-time&#034; system, on untuned JVMs.&lt;/li&gt;
&lt;li&gt;If you need to start investigating performance problems, this article over at InfoQ (&lt;a href=&#034;http://www.infoq.com/articles/the-box&#034;&gt;The Box: A Shortcut to finding Performance Bottlenecks&lt;/a&gt;) has some good tips for starting out on this route.&lt;/li&gt;
&lt;li&gt;Ensure that your Java system is easy to monitor, using something like JMX, because this will really help you prove and diagnose any issues you might come across. More on that later in the week.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
If you get the opportunity to do some performance testing then I highly recommend it. Assuring the non-functional requirements is a key part of an architect&#039;s role so it&#039;s great experience.
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>How do you deliver software architecture?</category>
    
    <comments>http://www.codingthearchitecture.com/2007/11/05/performance_tuning_java_systems.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2007/11/05/performance_tuning_java_systems.html</guid>
    <pubDate>Mon, 05 Nov 2007 12:23:34 GMT</pubDate>
  </item>
  
  </channel>
</rss>

