Description
Homework This assignment gives you a chance to become familiar with concurrent network clients, servers, covering topics including threads, synchronization, wait/notify (monitor), asynchronous I/O, and benchmarking. Due: Check point [5 points] (Part 1 and Part 2 code): 10 PM on Oct. 11 All [95 points]: 8:00 PM, Friday, Oct. 18, 2013 by uploading to classes Protocol The server that we will design is a simplified version of HTTP 1.0. A server is started with a document directory 11/14/13 CPSC 433/533: Computer Networks
zoo.cs.yale.edu/classes/cs433/cs433-2013-fall/assignments/assign3/index.html 2/4
Following Apache configuration style (https://httpd.apache.org/docs/2.0/vhosts/examples.html; note that we implement a single server name, not multiple, as the example configuration shows), we program each server by reading a configuration file: %java 11/14/13 CPSC 433/533: Computer Networks
zoo.cs.yale.edu/classes/cs433/cs433-2013-fall/assignments/assign3/index.html 3/4
How does x-Socket implement Idle timeout of a connection? Please give an example of how the library does testing (see https://sourceforge.net/p/xsocket/code/HEAD/tree/xsocket/core/trunk/src/test/java/org/xsocket/connection/EchoServerTest.java for an example). Please describe how you may test your server with idle timeout? Part 4: Performance Benchmarking One important computer systems skill is to evaluate the performance of design alternatives. In this assignment, we conduct performance evaluation of the alternatives: To conduct the testing, you will need to setup the DocumentRoot at the server. It is highly recommended that you generate a number of files of different sizes under DocumentRoot named such as file1.html, file2.html, …, file1000.html. If you download gen.tar, and untar it (tar -xvf gen.tar), you will see a directory named doc-root and a directory named request-patterns. To compare the performance with Apache, we will use the department zoo Apache server. We will use /home/httpd/html/zoo/classes/cs433/web/www-root to store testing files. Suppose we want to fetch /home/httpd/html/zoo/classes/cs433/web/www-root/html-small/doc1.html. To use the department Apache server, since the department server has set DocumentRoot as /home/httpd/html/zoo, the URL should be: https://zoo.cs.yale.edu/classes/cs433/web/www-root/html-small/doc1.html To use your server, suppose you set the DocumentRoot as /home/httpd/html/zoo/classes/cs433/web/www-root, and you run your server on cicada.cs.yale.edu at port 9876. Then the URL is: https://cicada.cs.yale.edu:9876/html-small/doc1.html For the test, you will need to generate a request file for the client. The request pattern can have a major impact on your server performance (how requests repeat). The TA will use a Pareto distribution to generate request patterns to test your server. You can write a simple Java program or script to generate the request. You should vary the client parallel (see Client command line above) with a reasonable increment schedule (e.g., 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, …). A reasonable test time is 60 to 120 seconds. You can write a simple script to automate this task. For multithreaded server, please try two thread pool sizes: one small and one large. Part 5: Report You should submit a report on your server design. Please answer any question we specified above. Please report the measured performance of both Apache and your best server for these performance metrics: throughput and (mean) delay. You can use open office or gnuplot to generate figures. Below is an example figure showing the performance of multiple servers. The TA will benchmark all servers and pick the one with the highest throughput. This server will receive a bonus of 25%.
11/14/13 CPSC 433/533: Computer Networks
zoo.cs.yale.edu/classes/cs433/cs433-2013-fall/assignments/assign3/index.html 4/4
Submission Please submit using class server. Please include README to tell the TA the directory structure, e.g., which file is the report. Please generate a single jar file containing all of your files. Suggestions During your async i/o design, think how you implement a finite state machine to handle each request (e.g., initial state after accepting a connection, what other states). Java async i/o does not allow you to select events on a file channel. There are can be multiple design options to handle file i/o: Use standard file i/o by assuming that file system is fast and will not become bottleneck; Try out mapped file i/o: FileInputStream fin = new FileInputStream(args[0]); FileChannel in = fin.getChannel(); ByteBuffer input = in.map(FileChannel.MapMode.READ_ONLY, 0, in.size()); Try out direct transfer: See FileChannel.transferTo; Use standard file i/o and use a thread pool to help with reading files. References Book Java Network Programming, 3rd, 2005, by Elliotte Harold is a good reference book on Java network programming. In particular, you should read chapter 5 on Thread. Yale library has electronic version of this book (you need Yale IP address to gain access). If this link does not work, please try to search Orbis and follow the link. The examples codes can be found here. For details about ByteBuffer, please read chapter 12 of Java Network Programming. General java information: Development environments: zoo has Java installed: eclipse provides a nice java IDE. Java book An overall very good book on Java is Thinking in Java (3rd Edition) by Bruce Eckel, Dec. 2002, by Prentice Hall. This book is also available online at web sites such as: https://www.bruceeckel.com/.