diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-11-18 14:37:22 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-11-18 14:37:22 +0000 |
commit | 56b1b94b3ee7fe0fa4cfcf7184b48246c481a1ac (patch) | |
tree | 619bbaad8087cc3ae52c8167e58e11f067a3a818 /src/ats/gnunet-service-ats_addresses.c | |
parent | cf31c1bc656e1747c2e3deea8ef851743b9e09c5 (diff) | |
download | gnunet-56b1b94b3ee7fe0fa4cfcf7184b48246c481a1ac.tar.gz gnunet-56b1b94b3ee7fe0fa4cfcf7184b48246c481a1ac.zip |
utilization
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.c | 119 |
1 files changed, 104 insertions, 15 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 26b7bc90b..e1042b64b 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c | |||
@@ -265,16 +265,6 @@ struct GAS_Addresses_Handle | |||
265 | struct GNUNET_CONTAINER_MultiPeerMap *addresses; | 265 | struct GNUNET_CONTAINER_MultiPeerMap *addresses; |
266 | 266 | ||
267 | /** | 267 | /** |
268 | * Configure WAN quota in | ||
269 | */ | ||
270 | unsigned long long wan_quota_in; | ||
271 | |||
272 | /** | ||
273 | * Configure WAN quota out | ||
274 | */ | ||
275 | unsigned long long wan_quota_out; | ||
276 | |||
277 | /** | ||
278 | * Is ATS addresses running | 268 | * Is ATS addresses running |
279 | */ | 269 | */ |
280 | int running; | 270 | int running; |
@@ -1271,6 +1261,8 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle, | |||
1271 | &reset_address_it, NULL)); | 1261 | &reset_address_it, NULL)); |
1272 | } | 1262 | } |
1273 | 1263 | ||
1264 | |||
1265 | |||
1274 | static int | 1266 | static int |
1275 | eval_count_active_it (void *cls, const struct GNUNET_PeerIdentity *id, void *obj) | 1267 | eval_count_active_it (void *cls, const struct GNUNET_PeerIdentity *id, void *obj) |
1276 | { | 1268 | { |
@@ -1286,6 +1278,44 @@ eval_count_active_it (void *cls, const struct GNUNET_PeerIdentity *id, void *obj | |||
1286 | return GNUNET_YES; | 1278 | return GNUNET_YES; |
1287 | } | 1279 | } |
1288 | 1280 | ||
1281 | struct SummaryContext { | ||
1282 | unsigned long long bandwidth_in_assigned[GNUNET_ATS_NetworkTypeCount]; | ||
1283 | unsigned long long bandwidth_out_assigned[GNUNET_ATS_NetworkTypeCount]; | ||
1284 | unsigned int addresses_in_network[GNUNET_ATS_NetworkTypeCount]; | ||
1285 | }; | ||
1286 | |||
1287 | |||
1288 | static int | ||
1289 | eval_sum_bw_used (void *cls, const struct GNUNET_PeerIdentity *id, void *obj) | ||
1290 | { | ||
1291 | struct ATS_Address *addr = obj; | ||
1292 | int networks[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkType; | ||
1293 | int net; | ||
1294 | struct SummaryContext *ctx = cls; | ||
1295 | |||
1296 | int c; | ||
1297 | |||
1298 | if (GNUNET_YES == addr->active) | ||
1299 | { | ||
1300 | net = get_performance_info (addr, GNUNET_ATS_NETWORK_TYPE); | ||
1301 | for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++) | ||
1302 | { | ||
1303 | if (net == networks[c]) | ||
1304 | { | ||
1305 | ctx->addresses_in_network[c] ++; | ||
1306 | ctx->bandwidth_in_assigned[c] += ntohl (addr->assigned_bw_in.value__); | ||
1307 | ctx->bandwidth_out_assigned[c] += ntohl (addr->assigned_bw_out.value__); | ||
1308 | } | ||
1309 | } | ||
1310 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Active address in %s with (in/out) %llu/%llu Bps\n", | ||
1311 | GNUNET_ATS_print_network_type(net), | ||
1312 | ntohl (addr->assigned_bw_in.value__), | ||
1313 | ntohl (addr->assigned_bw_out.value__)); | ||
1314 | } | ||
1315 | return GNUNET_OK; | ||
1316 | } | ||
1317 | |||
1318 | |||
1289 | /** | 1319 | /** |
1290 | * Evaluate current bandwidth assignment | 1320 | * Evaluate current bandwidth assignment |
1291 | * | 1321 | * |
@@ -1295,8 +1325,22 @@ void | |||
1295 | GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah) | 1325 | GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah) |
1296 | { | 1326 | { |
1297 | struct GAS_Addresses_Suggestion_Requests *cur; | 1327 | struct GAS_Addresses_Suggestion_Requests *cur; |
1328 | int c; | ||
1329 | |||
1330 | float quality_requests_fulfilled = 0.0; | ||
1331 | float quality_bandwidth_utilization[GNUNET_ATS_NetworkTypeCount]; | ||
1332 | float quality_bandwidth_utilization_total = 0.0; | ||
1333 | float quality_application_requirements = 0.0; | ||
1334 | float guq = 0.0; | ||
1335 | |||
1336 | /* Variable related to requests */ | ||
1298 | unsigned int requests_pending; | 1337 | unsigned int requests_pending; |
1299 | unsigned int requests_fulfilled; | 1338 | unsigned int requests_fulfilled; |
1339 | unsigned int request_active; | ||
1340 | |||
1341 | /* Variable related to utilization */ | ||
1342 | struct SummaryContext sum; | ||
1343 | int network_count; | ||
1300 | 1344 | ||
1301 | GNUNET_assert (NULL != ah); | 1345 | GNUNET_assert (NULL != ah); |
1302 | GNUNET_assert (NULL != ah->addresses); | 1346 | GNUNET_assert (NULL != ah->addresses); |
@@ -1306,20 +1350,65 @@ GAS_addresses_evaluate_assignment (struct GAS_Addresses_Handle *ah) | |||
1306 | /* 1) How many requests could be fulfilled? */ | 1350 | /* 1) How many requests could be fulfilled? */ |
1307 | for (cur = ah->pending_requests_head; NULL != cur; cur = cur->next) | 1351 | for (cur = ah->pending_requests_head; NULL != cur; cur = cur->next) |
1308 | { | 1352 | { |
1309 | 1353 | request_active = GNUNET_NO; | |
1310 | GNUNET_CONTAINER_multipeermap_get_multiple (ah->addresses, | 1354 | GNUNET_CONTAINER_multipeermap_get_multiple (ah->addresses, |
1311 | &cur->id, &eval_count_active_it, &requests_fulfilled); | 1355 | &cur->id, &eval_count_active_it, &request_active); |
1312 | if (GNUNET_YES == requests_fulfilled) | 1356 | if (GNUNET_YES == request_active) |
1313 | requests_fulfilled ++; | 1357 | requests_fulfilled ++; |
1314 | requests_pending ++; | 1358 | requests_pending ++; |
1359 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer `%s': pending requests, %s\n", | ||
1360 | GNUNET_i2s (&cur->id), | ||
1361 | (GNUNET_YES == request_active) ? "active adress" : "no active address"); | ||
1362 | |||
1315 | } | 1363 | } |
1316 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%u pending requests, %u requests fullfilled\n", | 1364 | if (requests_pending > 0) |
1365 | quality_requests_fulfilled = (float) requests_fulfilled / requests_pending; | ||
1366 | else | ||
1367 | quality_requests_fulfilled = 0.0; | ||
1368 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "%u pending requests, %u requests fullfilled\n", | ||
1317 | requests_pending, requests_fulfilled); | 1369 | requests_pending, requests_fulfilled); |
1318 | 1370 | ||
1319 | |||
1320 | /* 2) How well is bandwidth utilized? */ | 1371 | /* 2) How well is bandwidth utilized? */ |
1372 | network_count = 0; | ||
1373 | for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++) | ||
1374 | { | ||
1375 | quality_bandwidth_utilization[c] = 0.0; | ||
1376 | sum.addresses_in_network[c] = 0; | ||
1377 | sum.bandwidth_in_assigned[c] = 0; | ||
1378 | sum.bandwidth_out_assigned[c] = 0; | ||
1379 | } | ||
1380 | GNUNET_CONTAINER_multipeermap_iterate(ah->addresses, | ||
1381 | &eval_sum_bw_used, &sum); | ||
1382 | for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++) | ||
1383 | { | ||
1384 | quality_bandwidth_utilization[c] = (((float)sum.bandwidth_out_assigned[c] / ah->env.out_quota[c]) + | ||
1385 | ((float)sum.bandwidth_in_assigned[c] / ah->env.in_quota[c])) / 2; | ||
1386 | |||
1387 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Utilization for network `%s': %f\n", | ||
1388 | GNUNET_ATS_print_network_type(ah->env.networks[c]), | ||
1389 | quality_bandwidth_utilization[c]); | ||
1390 | if (sum.addresses_in_network[c] > 0) | ||
1391 | { | ||
1392 | quality_bandwidth_utilization_total += quality_bandwidth_utilization[c]; | ||
1393 | network_count ++; | ||
1394 | } | ||
1395 | } | ||
1396 | if (0 < network_count) | ||
1397 | quality_bandwidth_utilization_total /= network_count; | ||
1398 | else | ||
1399 | quality_bandwidth_utilization_total = 0.0; | ||
1321 | 1400 | ||
1322 | /* 3) How well does selection match application requirements */ | 1401 | /* 3) How well does selection match application requirements */ |
1402 | |||
1403 | /* GUQ */ | ||
1404 | guq = (quality_requests_fulfilled + quality_bandwidth_utilization_total + quality_application_requirements) /3; | ||
1405 | |||
1406 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
1407 | "Requests fulfilled %.3f bandwidth utilized %.3f application preferences met %.3f => %.3f\n", | ||
1408 | quality_requests_fulfilled, | ||
1409 | quality_bandwidth_utilization_total, | ||
1410 | quality_application_requirements, | ||
1411 | guq); | ||
1323 | } | 1412 | } |
1324 | 1413 | ||
1325 | /** | 1414 | /** |