TraceEx03.java
上传用户:ganshun56
上传日期:2020-06-06
资源大小:27k
文件大小:18k
源码类别:

网格计算

开发平台:

Java

  1. /*
  2.  * Author: Anthony Sulistio
  3.  * Date: November 2004
  4.  * Description: A simple program to demonstrate of how to use GridSim
  5.  *              workload trace functionality using a network extension.
  6.  *
  7.  * A Workload entity can be classified as a grid user entity.
  8.  * In this example, we only create workload and resource entities.
  9.  * Each Workload entity sends Gridlets to only one grid resource.
  10.  *
  11.  * In addition, this example creates other GridSim user entities.
  12.  * This example shows that Workload entity can be run together with other
  13.  * entities.
  14.  *
  15.  * Running this experiment might take a lot of memory and very long time
  16.  * if the size of trace file is big (in terms of number of lines/jobs).
  17.  * If you encounter "out of memory" exception, you need to increase JVM heap
  18.  * size using 'java -Xmx' option.
  19.  * For example set the heap size to 300MB:
  20.  * In Unix/Linux:
  21.  *      java -Xmx300000000 -classpath $GRIDSIM/jars/gridsim.jar:. TraceEx03
  22.  * In Windows:
  23.  *      java -Xmx300000000 -classpath %GRIDSIM%jarsgridsim.jar;. TraceEx03
  24.  *
  25.  * where $GRIDSIM or %GRIDSIM% is the location of the gridsimtoolkit package.
  26.  *
  27.  * When you see the output, there are few warnings about about a Gridlet
  28.  * requires more than 1 PE. This is because the current GridSim schedulers,
  29.  * TimeShared and SpaceShared, only process 1 PE for each Gridlet.
  30.  * You are welcome to write your own scheduler that incorporates this
  31.  * QoS (Quality of Service) requirement.
  32.  */
  33. import gridsim.*;
  34. import gridsim.net.*;
  35. import gridsim.util.Workload;
  36. import java.util.*;
  37. /**
  38.  * Test Driver class for this example
  39.  */
  40. public class TraceEx03
  41. {
  42.     /**
  43.      * Creates main() to run this example
  44.      */
  45.     public static void main(String[] args)
  46.     {        
  47.         try
  48.         {
  49.             //////////////////////////////////////////
  50.             // Step 1: Initialize the GridSim package. It should be called
  51.             // before creating any entities. We can't run this example without
  52.             // initializing GridSim first. We will get run-time exception
  53.             // error.
  54.             
  55.             // number of grid user entities + any Workload entities.
  56.             int num_user = 5;
  57.             Calendar calendar = Calendar.getInstance();
  58.             // a flag that denotes whether to trace GridSim events or not.
  59.             boolean trace_flag = false;
  60.             // Initialize the GridSim package
  61.             System.out.println("Initializing GridSim package");
  62.             GridSim.init(num_user, calendar, trace_flag);
  63.             //////////////////////////////////////////
  64.             // Step 2: Creates one or more GridResource entities
  65.             // baud rate and MTU must be big otherwise the simulation
  66.             // runs for a very long period.
  67.             double baud_rate = 1000000;     // 1 Gbits/sec
  68.             double propDelay = 10;   // propagation delay in millisecond
  69.             int mtu = 100000;        // max. transmission unit in byte
  70.             int rating = 400;        // rating of each PE in MIPS
  71.             int i = 0;
  72.             
  73.             // more resources can be created by
  74.             // setting totalResource to an appropriate value
  75.             int totalResource = 3;
  76.             ArrayList resList = new ArrayList(totalResource);
  77.             String[] resArray = new String[totalResource];
  78.             
  79.             for (i = 0; i < totalResource; i++)
  80.             {
  81.                 String resName = "Res_" + i;
  82.                 GridResource res = createGridResource(resName, baud_rate,
  83.                                                       propDelay, mtu, rating);
  84.                 // add a resource into a list
  85.                 resList.add(res);
  86.                 resArray[i] = resName;
  87.             }
  88.             //////////////////////////////////////////
  89.             // Step 3: Get the list of trace files. The format should be:
  90.             // ASCII text, gzip or zip.
  91.             // In this example, I use the trace files from:
  92.             // http://www.cs.huji.ac.il/labs/parallel/workload/index.html
  93.             String[] fileName = {
  94.                 "l_lanl_o2k.swf.zip",     // LANL Origin 2000 Cluster (Nirvana)
  95.                 "l_sdsc_blue.swf.txt.gz", // SDSC Blue Horizon
  96.             };
  97.             String dir = "../";     // location of these files
  98.             String customFile = "custom_trace.txt"; // custom trace file format
  99.             
  100.             // total number of Workload entities
  101.             int numWorkload = fileName.length + 1;  // including custom trace
  102.             //////////////////////////////////////////
  103.             // Step 4: Creates one or more Workload trace entities.
  104.             // Each Workload entity can only read one trace file and
  105.             // submit its Gridlets to one grid resource entity.
  106.             int resID = 0;
  107.             Random r = new Random();
  108.             ArrayList load = new ArrayList();     
  109.             
  110.             for (i = 0; i < fileName.length; i++)
  111.             {
  112.                 resID = r.nextInt(totalResource);
  113.                 Workload w = new Workload("Load_"+i, baud_rate, propDelay, mtu, 
  114.                                     dir + fileName[i], resArray[resID], rating);
  115.                 // add into a list
  116.                 load.add(w);
  117.             }
  118.             // for the custom trace file format
  119.             Workload custom = new Workload("Custom", baud_rate, propDelay, mtu,
  120.                                            dir + customFile, resArray[resID], rating);
  121.             // add into a list
  122.             load.add(custom);
  123.             // tells the Workload entity what to look for.
  124.             // parameters: maxField, jobNum, submitTime, runTime, numPE
  125.             custom.setField(4, 1, 2, 3, 4);
  126.             custom.setComment("#");     // set "#" as a comment
  127.             //////////////////////////////////////////
  128.             // Step 5: Creates one or more grid user entities.
  129.             // number of grid user entities
  130.             int numUserLeft = num_user - numWorkload;
  131.             
  132.             // number of Gridlets that will be sent to the resource
  133.             int totalGridlet = 5;
  134.             // create users
  135.             ArrayList userList = new ArrayList(numUserLeft);
  136.             for (i = 0; i < numUserLeft; i++)
  137.             {
  138.                 // if trace_flag is set to "true", then this experiment will
  139.                 // create User_i.csv where i = 0 ... (num_user-1)
  140.                 NetUser user = new NetUser("User_"+i, totalGridlet, baud_rate,
  141.                                            propDelay, mtu, trace_flag);
  142.                 // add a user into a list
  143.                 userList.add(user);
  144.             }
  145.             //////////////////////////////////////////
  146.             // Step 6: Builds the network topology among entities.
  147.             // In this example, the topology is:
  148.             // user(s)     --1Gb/s-- r1 --10Gb/s-- r2 --1Gb/s-- GridResource(s)
  149.             //                       |
  150.             // workload(s) --1Gb/s-- |
  151.             // create the routers.
  152.             // If trace_flag is set to "true", then this experiment will create
  153.             // the following files (apart from sim_trace and sim_report):
  154.             // - router1_report.csv
  155.             // - router2_report.csv
  156.             Router r1 = new RIPRouter("router1", trace_flag);   // router 1
  157.             Router r2 = new RIPRouter("router2", trace_flag);   // router 2
  158.             // connect all user entities with r1 with 1Mb/s connection
  159.             // For each host, specify which PacketScheduler entity to use.
  160.             NetUser obj = null;
  161.             for (i = 0; i < userList.size(); i++)
  162.             {
  163.                 // A First In First Out Scheduler is being used here.
  164.                 // SCFQScheduler can be used for more fairness
  165.                 FIFOScheduler userSched = new FIFOScheduler("NetUserSched_"+i);
  166.                 obj = (NetUser) userList.get(i);
  167.                 r1.attachHost(obj, userSched);
  168.             }
  169.                         
  170.             // connect all Workload entities with r1 with 1Mb/s connection
  171.             // For each host, specify which PacketScheduler entity to use.
  172.             Workload w = null;
  173.             for (i = 0; i < load.size(); i++)
  174.             {
  175.                 // A First In First Out Scheduler is being used here.
  176.                 // SCFQScheduler can be used for more fairness
  177.                 FIFOScheduler loadSched = new FIFOScheduler("LoadSched_"+i);
  178.                 w = (Workload) load.get(i);
  179.                 r1.attachHost(w, loadSched);
  180.             }
  181.             // connect all resource entities with r2 with 1Mb/s connection
  182.             // For each host, specify which PacketScheduler entity to use.
  183.             GridResource resObj = null;
  184.             for (i = 0; i < resList.size(); i++)
  185.             {
  186.                 FIFOScheduler resSched = new FIFOScheduler("GridResSched_"+i);
  187.                 resObj = (GridResource) resList.get(i);
  188.                 r2.attachHost(resObj, resSched);
  189.             }
  190.             // then connect r1 to r2 with 10 Gbits/s connection
  191.             // For each host, specify which PacketScheduler entity to use.
  192.             baud_rate = 10000000;            
  193.             
  194.             Link link = new SimpleLink("r1_r2_link", baud_rate, propDelay, mtu);
  195.             FIFOScheduler r1Sched = new FIFOScheduler("r1_Sched");
  196.             FIFOScheduler r2Sched = new FIFOScheduler("r2_Sched");
  197.             // attach r2 to r1
  198.             r1.attachRouter(r2, link, r1Sched, r2Sched);
  199.             //////////////////////////////////////////
  200.             // Step 7: Starts the simulation
  201.             GridSim.startGridSimulation();
  202.             //////////////////////////////////////////
  203.             // Final step: Prints the Gridlets when simulation is over
  204.             // also prints the routing table
  205.             r1.printRoutingTable();
  206.             r2.printRoutingTable();
  207.             GridletList glList = null;
  208.             for (i = 0; i < userList.size(); i++)
  209.             {
  210.                 obj = (NetUser) userList.get(i);
  211.                 glList = obj.getGridletList();
  212.                 printGridletList(glList, obj.get_name(), trace_flag);
  213.             }
  214.             
  215.             // prints the Gridlets inside a Workload entity
  216.             for (i = 0; i < load.size(); i++)
  217.             {
  218.                 w = (Workload) load.get(i);
  219.                 w.printGridletList(trace_flag);
  220.             }
  221.         }
  222.         catch (Exception e)
  223.         {
  224.             e.printStackTrace();
  225.             System.out.println("Unwanted errors happen");
  226.         }
  227.     }
  228.     /**
  229.      * Creates one Grid resource. A Grid resource contains one or more
  230.      * Machines. Similarly, a Machine contains one or more PEs (Processing
  231.      * Elements or CPUs).
  232.      * <p>
  233.      * In this simple example, we are simulating one Grid resource with three
  234.      * Machines that contains one or more PEs.
  235.      * @param name          a Grid Resource name
  236.      * @param baud_rate     the bandwidth of this entity
  237.      * @param delay         the propagation delay
  238.      * @param MTU           Maximum Transmission Unit
  239.      * @param rating        a PE rating
  240.      * @return a GridResource object
  241.      */
  242.     private static GridResource createGridResource(String name,
  243.                 double baud_rate, double delay, int MTU, int rating)
  244.     {
  245.         System.out.println();
  246.         System.out.println("Starting to create one Grid resource with " +
  247.                 "3 Machines");
  248.         // Here are the steps needed to create a Grid resource:
  249.         // 1. We need to create an object of MachineList to store one or more
  250.         //    Machines
  251.         MachineList mList = new MachineList();
  252.         //System.out.println("Creates a Machine list");
  253.         // 2. A Machine contains one or more PEs or CPUs. Therefore, should
  254.         //    create an object of PEList to store these PEs before creating
  255.         //    a Machine.
  256.         PEList peList1 = new PEList();
  257.         //System.out.println("Creates a PE list for the 1st Machine");
  258.         // 3. Create PEs and add these into an object of PEList.
  259.         peList1.add( new PE(0,rating) ); // need to store PE id and MIPS Rating
  260.         peList1.add( new PE(1,rating) );
  261.         peList1.add( new PE(2,rating) );
  262.         peList1.add( new PE(3,rating) );
  263.         //System.out.println("Creates 4 PEs with same MIPS Rating and put them"+
  264.         //        " into the PE list");
  265.         // 4. Create one Machine with its id and list of PEs or CPUs
  266.         mList.add( new Machine(0, peList1) );   // First Machine
  267.         //System.out.println("Creates the 1st Machine that has 4 PEs and " +
  268.         //        "stores it into the Machine list");
  269.         //System.out.println();
  270.         // 5. Repeat the process from 2 if we want to create more Machines
  271.         // NOTE: if you only want to create one Machine for one Grid resource,
  272.         //       then you could skip this step.
  273.         PEList peList2 = new PEList();
  274.         //System.out.println("Creates a PE list for the 2nd Machine");
  275.         peList2.add( new PE(0, rating) );
  276.         peList2.add( new PE(1, rating) );
  277.         peList2.add( new PE(2, rating) );
  278.         peList2.add( new PE(3, rating) );
  279.         //System.out.println("Creates 4 PEs with same MIPS Rating and put them"+
  280.         //        " into the PE list");
  281.         mList.add( new Machine(1, peList2) );   // Second Machine
  282.         //System.out.println("Creates the 2nd Machine that has 4 PEs and " +
  283.         //        "stores it into the Machine list");
  284.         //System.out.println();
  285.         PEList peList3 = new PEList();
  286.         //System.out.println("Creates a PE list for the 3rd Machine");
  287.         peList3.add( new PE(0, rating) );
  288.         peList3.add( new PE(1, rating) );
  289.         //System.out.println("Creates 2 PEs with same MIPS Rating and put them"+
  290.         //        " into the PE list");
  291.         mList.add( new Machine(2, peList3) );   // Third Machine
  292.         //System.out.println("Creates the 3rd Machine that has 2 PEs and " +
  293.         //        "stores it into the Machine list");
  294.         //System.out.println();
  295.         // 6. Create a ResourceCharacteristics object that stores the
  296.         //    properties of a Grid resource: architecture, OS, list of
  297.         //    Machines, allocation policy: time- or space-shared, time zone
  298.         //    and its price (G$/PE time unit).
  299.         String arch = "Sun Ultra";      // system architecture
  300.         String os = "Solaris";          // operating system
  301.         double time_zone = 9.0;         // time zone this resource located
  302.         double cost = 3.0;              // the cost of using this resource
  303.         ResourceCharacteristics resConfig = new ResourceCharacteristics(
  304.                 arch, os, mList, ResourceCharacteristics.TIME_SHARED,
  305.                 time_zone, cost);
  306.         //System.out.println("Creates the properties of a Grid resource and " +
  307.         //        "stores the Machine list");
  308.         // 7. Finally, we need to create a GridResource object.
  309.         long seed = 11L*13*17*19*23+1;
  310.         double peakLoad = 0.0;        // the resource load during peak hour
  311.         double offPeakLoad = 0.0;     // the resource load during off-peak hr
  312.         double holidayLoad = 0.0;     // the resource load during holiday
  313.         // incorporates weekends so the grid resource is on 7 days a week
  314.         LinkedList Weekends = new LinkedList();
  315.         Weekends.add(new Integer(Calendar.SATURDAY));
  316.         Weekends.add(new Integer(Calendar.SUNDAY));
  317.         // incorporates holidays. However, no holidays are set in this example
  318.         LinkedList Holidays = new LinkedList();
  319.         GridResource gridRes = null;
  320.         try
  321.         {
  322.             // creates a GridResource with a link
  323.             gridRes = new GridResource(name,
  324.                 new SimpleLink(name + "_link", baud_rate, delay, MTU),
  325.                 seed, resConfig, peakLoad, offPeakLoad, holidayLoad,
  326.                 Weekends, Holidays);
  327.         }
  328.         catch (Exception e) {
  329.             e.printStackTrace();
  330.         }
  331.         System.out.println("Finally, creates one Grid resource (name: " + name +
  332.                 " - id: " + gridRes.get_id() + ")");
  333.         System.out.println();
  334.         return gridRes;
  335.     }
  336.     /**
  337.      * Prints the Gridlet objects
  338.      */
  339.     private static void printGridletList(GridletList list, String name,
  340.                                          boolean detail)
  341.     {
  342.         int size = list.size();
  343.         Gridlet gridlet = null;
  344.         String indent = "    ";
  345.         System.out.println();
  346.         System.out.println("============= OUTPUT for " + name + " ==========");
  347.         System.out.println("Gridlet ID" + indent + "STATUS" + indent +
  348.                 "Resource ID" + indent + "Cost");
  349.         // a loop to print the overall result
  350.         int i = 0;
  351.         for (i = 0; i < size; i++)
  352.         {
  353.             gridlet = (Gridlet) list.get(i);
  354.             System.out.print(indent + gridlet.getGridletID() + indent
  355.                     + indent);
  356.             System.out.print( gridlet.getGridletStatusString() );
  357.             System.out.println( indent + indent + gridlet.getResourceID() +
  358.                     indent + indent + gridlet.getProcessingCost() );
  359.         }
  360.         if (detail == true)
  361.         {
  362.             // a loop to print each Gridlet's history
  363.             for (i = 0; i < size; i++)
  364.             {
  365.                 gridlet = (Gridlet) list.get(i);
  366.                 System.out.println( gridlet.getGridletHistory() );
  367.                 System.out.print("Gridlet #" + gridlet.getGridletID() );
  368.                 System.out.println(", length = " + gridlet.getGridletLength()
  369.                         + ", finished so far = " +
  370.                         gridlet.getGridletFinishedSoFar() );
  371.                 System.out.println("======================================n");
  372.             }
  373.         }
  374.     }
  375. } // end class