So with one last changes of the heatsink to a Supermicro SNK-P0038P (bigger than the Intel) and of the chassis to the more silent SC743 TQ-865B-SQ, the server is now complete and I have placed the order. Now the waiting starts because I know that some parts are not in stock.
Incredible how much you learn while looking for the correct parts for a server. Initially I started out with an Intel S5500HCVR motherboard based on the 5500 chipset and an Antec Take 4 650 case and a Noctua NH-U12DX 1366 fan.
Then I started comparing the compatibility of the fan and the case and it turned out the fan didn’t fit, so I changed to a Noctua NH-U9DX 1366 fan with the help of Noctua support by the way.
Secondly, I looked at the motherboard and found out it used the SSI-EEB form factor and apparently that did not fit inside the Antec Case. As a result I started looking at other silent cases that would fit this motherboard but didn’t really find any. So I started looking at other motherboards and found one by Supermicro (the X8TDi-F). Meanwhile I also switched to a motherboard using the 5520 chipset because of better performance with the 5600 series Xeon processors. Fortunately, supermicro provides a really good website and they even had a silent case (the SC743T-665B). Additionally, I could verify the compatibility with the memory that I chose. So all is well, better even, as the new motherboard has 2 old style 32bit PCI slots which can come in handy.
Then while checking the dimensions of the case to see if it would really fit in my rack, I was reading the manual and found out that the case has a so-called air-shroud. This one is basically a ducting solution that connects the fans in the front with those in the back and provides an efficient cooling solution. Of course, the fan that I chose wouldn’t fit anymore but Intel provides a nice passive cooling solution (the STS100P) that fits very well in this case (reducing costs at the same time).
So, all in all a very good collection of parts that I have now. A really good silent rackmount case, passive processor cooling, and a good low power cooling solution. Meanwhile I have also found one shop that can provide all the stuff in one order. And that really helps, in particular in case of problems.
It is flue season again, but this time it is not a regular flue but more like a server virus. I have had this virus before and it usually ends up in me spending a lot of money on very interesting hardware. The last times I had the virus, I bought:
Don’t know where I caught this virus but perhaps it was already there and my resistance was weakened. Anyway, just spent the past evenings looking at specifications for this new server. Tonight this included a big search for a suitable CPU fan for which I also needed to dig in to some Intel motherboard specification to see whether it would fit or not. Since today I know what Universal Retention System and Unified Backplate Assembly mean.
I now have a good setup for what my server ‘could’ look like (supposing I would get it of course):
- 19” server chassis: Supermicro SC743T-665B
- Processor: Intel Xeon L5630 (only one to start with, but can be extended), 40W TDP
- Motherboard: Supermicro X8DTi-F, dual socket motherboard, 5520 chipset
- Memory: 12GB ECC Registered DDR3-1066 (3x4GB)
- CPU Cooler: Intel STS100P
- DVD Rom: something with an ATA interface (below 20EUR in any case)
- Hard disk: in principle none (fully external storage).
Edit: Reusing of course the RAID card, TV card, and eSATA bracket from my current setup.
In 2006 I got myself a new server. The old one was already 7 years old and was at its limit. Memory was tight and the setup was not ideal. For instance, I had 2 internal hard disks with a RAID card and it was just generating a lot of heat and required a lot of cooling. Amazing that it held on for so long.
So in 2006 I got myself a new server. Using a Core Duo processor (not Core 2 Duo) at 1666MHz, one of the first dual core mobile processors. This was of course to reduce power consumption and heat production. To reduce heat production further, I used external hard disks that were put into a separate enclosure. After some time in operation I got myself a 19” rack (of the kind used by musicians) and replaced the external storage by a 19” storage rack. Also, I got a 19” UPS to protect the hardware some more. Another improvement was the use of an Areca ARC-1200 instead of a highpoint rocketraid to get true hardware RAID. Other improvements at that time were the use of logical volume managment and the use of postfix and cyrus instead of sendmail and Universtiy of Washington IMAP.
Over the past weeks I have been looking into managability and backup/restore a bit more. The reason is that this server has been up for already 4 years continuously so failure is becoming more likely every day. To deal with this, I improved my backup strategy so I will lose at most one week of data in case of a problem (or one month in case my house burns down). In any case, I have tested this procedure and have a documented method to simply boot from the backup and continue running the server. In addition I have setup hard disk monitoring so I should have a bigger chance of knowing beforehand when a drive is going to fail.
But having this worked out this changes the whole picture again. Now, instead of having to replace the server by a newer one as a precaution, I can just as well run the server until it breaks. But still, some things are still bothering me. For one, it would be really really cool to be able to:
- run a linux server based on server hardware (for instance low power Intel Xeon L5630)
- run multiple virtualized domains
In particular, one of my aims is to have a hardware independent server that can just be easily replaced by another one in case of problems. Doing this would require a storage area network (e.g. based on iSCSI) and using hardware virtualization (Intel VT). Paravirtualization is not an option as it increases maintenance problems because it ties host and guest together more (dependency between host and guest versions). A problem that I have currently is that although my current processor supports Intel VT, the motherboard blocks it. Also, I do not have enough memory for such a virtualized setup
So in summary, I am now in a situation that there is basically no need to replace my server. Also, it would feel like a waste to ditch a server which is in perfect working order. However, getting a new server would allow me to do al kinds of new interesting stuff with it and to take the next step to a hardware independent server.Another reason to replace the server by a more silent one. In particular, a low power Xeon processor can be cooled passively and there are also good fanless powersupplies that would enable me to get a really silent system. What should I do? Get a new server or not?
I have been using a backup script for my linux server for a longer time now. This script creates backups based on snapshot volumes using linux Logical Volume Management. This has been quite a useful script as I can create reasonably consistent backups that are even bootable.
I am making this script available now. More information is at wamblee.org.
If you are working at a company where cost savings are really really important, then chances are that after reducing cost factor number 1 (wages, i.e. headcount and hourly rate), cost factor number 2 is up. And that is office space.
However, there is a lot of evidence that a correct office workplace is one of the most important factors in productivity, as DeMarco and Lister put it in “Peopleware: Productive Projects and Teams”:
“Police-mentality planners design workplaces the way
they would design prisons: optimized for containment
at minimal cost. We have unthinkingly yielded to
them on the subject of workplace design, yet for most
organizations with productivity problems, there is no
more fruitful area for improvement than the work-
As long as workers are crowded into noisy, sterile, dis-
ruptive space, it’s not worth improving anything but
A factor of 2-3 can be reached compared to an open office or cubicle workspace by following one basic principle of somehow putting the team together in one location and limiting outside interference. Ed Yourdon mentions a few methods for achieving this in his “Death March” book:
- Frontal attack: Convince a project owner such as a high-level manager to put the team into an effective work environment.
- Skunk works mystique: Isolate the team in a separate location isolated from the rest.
- Squatter’s rights: Commandeer existing empty office space.
- Telecommute: Tell everyone to work from home an meet regularly at a location outside of the office. “As an additional diversion, you can put scarecrow-style dummies at the desks normally occupied by the project team; management will have a hard time distinguishing them from the other zombies in the office.”
- Graveyard shift: Shift working times to the night shift.
- Barricades and buffers: In an open office space locate the team together and put up barricades such as cupboards.
From “Toyota Culture: The heart and soul of the Toyota way”.
“If a Toyota leader was asked why they allowed the line to stop, she might make the point that the value the organisation places on quality is higher than hitting production numbers.”, p. 7
After all these years, one thing keeps on coming back: If a project is very well plannable then it is probably not an interesting project.
Contexts and Dependency Injection (JSR-299) is a great standard which is part of Java EE 6 and really simplifies Java EE programming, at least if you stay completely within the confines of Java EE.
However, applications that use CDI also need to be unit tested outside of the application server and in such cases it is useful to also perform CDI dependency injection outside of the container. Fortunately, Weld also support dependency injection in a Java SE environment.
When unit testing, the first idea would be to use CDI as much as possible to wire together the object graphs under test. But when doing this, several problems occur. First, certain managed objects such as EJBs and JPA entity manager and entitymanager factories are not recognized in a Java SE environment. Also, for unit test it should be possible to replace certain objects by test specific mocks. The latter is not supported by CDI as it supports only static configuration using “alternatives” in the beans.xml, whereas mock objects are usually dynamically generated so that the class name is not even known beforehand. Also, the APIs to use for programmatic dependency injection of CDI are a bit cumbersome.
As a result of all these points it is useful to create a simple wrapper library for performing programmatic dependency injection. The mini-framework is found in the wamblee.org support/inject utilities library. The two main concepts are an Injector used for injecting into an object and an InjectorBuilder for creating an injector. Using this concept, injection into a given object becomes easy, for example:
MyPojo pojo = new MyPojo();
The mini framework uses the standard
java.util.ServiceLoader mechanism to find an implementation of the injection technology to use. Therefore, using this mechanism, it is also possible to integrate other dependency injection technologies such as Guice and Spring.
For a working example, checkout the code at subversion.
The usefulness of this approach will become more clear if we take a look at mock testing, integration into 3rd party web frameworks such as Wicket, and some more advanced unit/integration tests in later posts.
In the past I have worked with J2EE 1.4 and admittedly, it was terrible. A lot of plumbing code was required to make applications. Luckily, Spring and Hibernate came to the rescue: Spring for the general infrastructure parts (roughly session EJB replacement) and Hibernate for the persistence part (entity EJB replacement).
Meanwhile, Java EE 5 has been release which has solved a large number of problems and that came a long way in addressing developer productivity. Now, however with the new Java EE 6 standard (released 10th December 2009), things have improved even more.
In a series of blogs I intend to show why Java EE 6 with Contexts and Dependency Injection and JPA as important features should become the preferred tools for development. CDI is a dependency injection standard that is quite similar to Google Guice (although some might disagree) and is largely based on the experiences gained in the last years with dependency injection frameworks. Interestingly, CDI provides an API that allows integration of Java EE dependency injection (e.g. @PersistenceContext, @EJB, @Resource) into arbitrary POJOs, thus facillitating integration of Java EE into third party application frameworks.
I will demonstrate Java EE 6 based development using code examples with some support from the wamblee.org utilities library using a Wicket application At a later stage I will also look at how to cleanly integrate OSGI services into applications.