01: package org.jgroups.tests;
02:
03: import java.io.IOException;
04: import java.net.DatagramPacket;
05: import java.net.DatagramSocket;
06: import java.net.InetAddress;
07:
08: /**
09: * Determine the fragmentation size of a system. Can be used offline, then set properties
10: * FRAG.frag_size and NAKACK.max_xmit_size
11: * @author Bela Ban Dec 11
12: * @author 2003
13: * @version $Id: DetermineFragSize.java,v 1.4 2005/05/30 16:15:11 belaban Exp $
14: */
15: public class DetermineFragSize {
16:
17: static int senseMaxFragSize() {
18: int upper = 4096;
19: int lower = 0;
20: int highest_failed = -1;
21: DatagramSocket sock;
22: byte[] buf;
23: DatagramPacket packet;
24: InetAddress local_addr;
25: final int num_iterations = 15;
26:
27: try {
28: sock = new DatagramSocket();
29: local_addr = InetAddress.getLocalHost();
30: } catch (Exception ex) {
31: System.err.println("failed creating DatagramSocket: " + ex);
32: return lower;
33: }
34:
35: for (int i = 0; i < num_iterations && lower < upper; i++) { // iterations to approximate frag_size
36: try {
37: buf = new byte[upper];
38: // System.out.println("** upper=" + upper + " (lower=" + lower + ")");
39: packet = new DatagramPacket(buf, buf.length,
40: local_addr, 9);
41: sock.send(packet);
42: lower = Math.max(lower, upper);
43: System.out.println("-- trying " + lower + " [OK]");
44: upper = upper * 2;
45: if (highest_failed > -1)
46: upper = Math.min(highest_failed, upper);
47: } catch (IOException io_ex) {
48: if (highest_failed > -1)
49: highest_failed = Math.min(highest_failed, upper); // never exceed max_upper
50: else
51: highest_failed = upper;
52: upper = (upper + lower) / 2;
53: } catch (Throwable ex) {
54: ex.printStackTrace();
55: break;
56: }
57: }
58: return lower;
59: }
60:
61: public static void main(String[] args) {
62: DatagramSocket sock;
63: DatagramPacket packet;
64: int size = 0, frag_size = 0;
65: byte[] buf;
66:
67: try {
68: size = senseMaxFragSize();
69: System.out.println("-- fine tuning (starting at " + size
70: + "):");
71: sock = new DatagramSocket();
72: for (;;) {
73: buf = new byte[size];
74: packet = new DatagramPacket(buf, buf.length,
75: InetAddress.getLocalHost(), 9);
76: sock.send(packet);
77: // System.out.print(size + " ");
78: // System.out.println(size + " [OK]");
79: frag_size = size;
80: size++;
81: }
82: } catch (Throwable t) {
83: // System.out.println(size + " [FAIL]");
84: // t.printStackTrace();
85: }
86: System.out
87: .println("\n***** fragmentation size on your system is "
88: + frag_size + " bytes *******\n");
89: }
90: }
|