A general purpose Unix or NT server, whether in a development or production environment, is capable of performing many different functions at the same time. For instance, a development server might be both an NFS file server, a compile server, and a database server. This flexibility comes at the cost of some complexity. Some hardware vendors have taken the approach of producing single function servers that are optimized for performing a single operation, such as file serving. Examples of such servers are the dedicated file servers produced by both Network Appliance and Auspex. Such a single function server can potentially have easier administration and provide better performance per CPU cycle because it is optimized for a single, or small set of tasks . On the other hand, a general purpose server has the flexibility that it can be used to run multiple applications.
Especially when it comes to file servers, the bottleneck in most systems is the network, not necessarily the file server. Even modest sized general purpose servers provide much more file system capacity than can be utilized by most development networks. This was illustrated in the SPEC benchmarks reviewed earlier in this chapter.
A good compromise to the single function versus general purpose server argument is to use general purpose servers but limit the number of functions hosted on any single server. For instance, consider a development environment with requirements to support database, file, web, e-mail, calendar, and directory services. Rather than use six separate servers, you might want to combine these functions into two servers, one for database, file, and web serving and a second server for e-mail, calendar, and directory services. There are a number of advantages to this approach. First, by limiting the number of functions on any single server, you simplify administration of the server and reduce the potential of application conflict. Secondly, such an approach is more scalable. Finally, the inherent redundancy of multiple servers allows you to implement clustering solutions to provide high levels of continued application availability even when one of the servers has failed.