Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Adaptation to 'Change the way we specify the sizes of bandwidth tests to be able...
[simgrid.git] / include / amok / bandwidth.h
1 /* $Id$ */
2
3 /* amok_bandwidth - Bandwidth test facilities                               */
4
5 /* Copyright (c) 2003-2005 Martin Quinson. All rights reserved.             */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #ifndef AMOK_BANDWIDTH_H
11 #define AMOK_BANDWIDTH_H
12
13 /** \addtogroup AMOK_bw
14  *  \brief Test the bandwidth between two nodes
15  *
16  *  This module allows you to retrieve the bandwidth between to arbitrary hosts
17  *  and saturating the links leading to them, provided that they run some GRAS 
18  *  process which initialized this module.
19  * 
20  * \htmlonly <h3>Bandwidth measurement</h3>\endhtmlonly
21  * 
22  *  Retrieving the bandwidth is usually done by active measurment: one send
23  *  a packet of known size, time how long it needs to go back and forth,
24  *  and you get the bandwidth in Kb/s available on the wire.
25  * 
26  *  This is not as easy as it first seems to do so in GRAS. The first issue
27  *  is that GRAS messages can get buffered, or the receiver cannot be
28  *  waiting for the message when it arrives. This results in extra delays
29  *  impacting the measurement quality. You thus have to setup a rendez-vous
30  *  protocol. The second issue is that GRAS message do have an header, so
31  *  figuring out their size is not trivial. Moreover, they get converted
32  *  when the sender and receiver processor architecture are different,
33  *  inducing extra delays. For this, GRAS provide the so-called measurement
34  *  sockets. On them, you can send raw data which is not converted (see
35  *  \ref GRAS_sock_meas). 
36  *
37  *  Solving all these problems is quite error prone and anoying, so we
38  *  implemented this in the current module so that you don't have to do it
39  *  yourself. The API is very simple. Use amok_bw_test() to get the BW
40  *  between the local host and the specified peer, or amok_bw_request() to
41  *  get the BW between two remote hosts. The elapsed time, as long as the
42  *  achieved bandwidth is returned in the last arguments of the functions.
43  * 
44  *  All sizes are in bytes. The \a buf_size is the size of the buffer
45  *   (this is a socket parameter set automatically). The \a exp_size is the
46  *   amount of data to send during an experiment. \a msg_size is the size
47  *   of each message sent. These values allow you to study phenomenon such
48  *   as TCP slow start (which are not correctly modelized by \ref SURF_API,
49  *   yet). They are mimicked from the NWS API, and default values could be
50  *   buf_size=32k, msg_size=16k and exp_size=64k. That means that the
51  *   socket will be prepared to accept 32k in its buffer and then four
52  *   messages of 16k will be sent (so that the total amount of data equals
53  *   64k). Of course, you can use other values if you want to. 
54  * 
55  *  \htmlonly
56  * <center><img align=center src="amok_bw_test.png" alt="amok bandwidth measurement protocol"><br>
57  * Fig 1: AMOK bandwidth measurement protocol.</center>
58  * <h3>Link saturation</h3>
59  * \endhtmlonly
60  * 
61  *  You sometimes want to try saturating some link during the network
62  *  related experiments (at least, we did ;). This also can turn quite
63  *  untrivial to do, unless you use this great module. You can either ask
64  *  for the saturation between the current host and a distant one with
65  *  amok_bw_saturate_begin() or between two distant hosts with
66  *  amok_bw_saturate_start(). In any case, remember that gras actors
67  *  (processes) are not interruptible. It means that an actor you
68  *  instructed to participate to a link saturation experiment will not do
69  *  anything else until it is to its end (either because the asked duration
70  *  was done or because someone used amok_bw_saturate_stop() on the emitter
71  *  end of the experiment).
72  * 
73  *  The following figure depicts the used protocol. Note that any
74  *  handshaking messages internal messages are omitted for sake of
75  *  simplicity. In this example, the experiment ends before the planned
76  *  experiment duration is over because one host use the
77  *  amok_bw_saturate_stop() function, but things are not really different
78  *  if the experiment stops alone. Also, it is not mandatory that the host
79  *  calling amok_bw_saturate_stop() is the same than the one which called
80  *  amok_bw_saturate_start(), despite what is depicted here.
81  * 
82  *  \htmlonly
83  * <center><img align=center src="amok_bw_sat.png" alt="amok bandwidth saturation protocol"><br>
84  * Fig 2: AMOK link saturation protocol.</center>
85  * \endhtmlonly
86  *
87  *  @{
88  */
89
90 /* module handling */
91
92 XBT_PUBLIC(void) amok_bw_init(void);
93 XBT_PUBLIC(void) amok_bw_exit(void);
94
95 XBT_PUBLIC void amok_bw_test(gras_socket_t peer,
96                              unsigned long int buf_size,
97                              unsigned long int msg_size,
98                              unsigned long int msg_amount,
99                              double min_duration,
100                              /*OUT*/ double *sec, double *bw);
101
102 XBT_PUBLIC(void) amok_bw_request(const char* from_name,unsigned int from_port,
103                      const char* to_name,unsigned int to_port,
104                                 unsigned long int buf_size,
105                                 unsigned long int msg_size,
106                                 unsigned long int msg_amount,
107                                 double min_duration,
108                                 /*OUT*/ double *sec, double*bw);
109
110 XBT_PUBLIC(double*) amok_bw_matrix(xbt_dynar_t hosts, /* dynar of xbt_host_t */
111                                    int buf_size_bw, int msg_size_bw, int msg_amount_bw, double min_duration);
112
113 /* ***************************************************************************
114  * Link saturation
115  * ***************************************************************************/
116
117
118 XBT_PUBLIC(void) amok_bw_saturate_start(const char* from_name,unsigned int from_port,
119                             const char* to_name,unsigned int to_port,
120                             unsigned int msg_size, double duration);
121
122 XBT_PUBLIC(void) amok_bw_saturate_begin(const char* to_name,unsigned int to_port,
123                             unsigned int msg_size, double duration,
124                             /*out*/ double *elapsed, double *bw);
125
126 XBT_PUBLIC(void) amok_bw_saturate_stop(const char* from_name,unsigned int from_port,
127                            /*out*/ double *time, double *bw);
128
129 /** @} */
130
131 #endif /* AMOK_BANDWIDTH_H */