diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp new file mode 100644 index 00000000000..6af2f8c23c0 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.cpp @@ -0,0 +1,166 @@ +#include "orbsvcs/LoadBalancing/LB_CPU_Utilization_Monitor.h" +#include "tao/ORB_Constants.h" +#include "ace/OS_NS_time.h" +#include "ace/OS_NS_stdio.h" +#include "ace/OS_NS_string.h" +#include "ace/OS_NS_unistd.h" +#include "ace/os_include/os_netdb.h" +#include "ace/os_include/sys/os_loadavg.h" + +ACE_RCSID (LoadBalancing, + LB_CPU_Utilization_Monitor, + "$Id$") + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +double calc_cpu_loading (void) +{ + static char buf[1024]; + static unsigned long prev_idle = 0; + static double prev_total = 0.0; + + FILE *file_ptr = 0; + char *item = 0; + char *arg = 0; + unsigned long delta_idle = 0; + unsigned long user = 0; + unsigned long nice = 0; + unsigned long idle = 0; + unsigned long sys = 0; + + double percent_cpu_load = 0.0; + + if ((file_ptr = fopen("/proc/stat", "r")) == 0) + return percent_cpu_load; + + while ((fgets (buf, sizeof (buf), file_ptr)) != 0) + { + item = ACE_OS::strtok (buf, " \t\n"); + arg = ACE_OS::strtok (0, "\n"); + + if (item == 0 || arg == 0) + continue; + if (item[0] == 'c' && strlen (item) == 3) + { + sscanf (arg, "%lu %lu %lu %lu", &user, &nice, &sys, &idle); + break; + } + + + } + + fclose (file_ptr); + + delta_idle = idle - prev_idle; + double total; + double time_passed; + total = (double) (user + nice + sys + idle); + time_passed = total - prev_total; + + percent_cpu_load = 100.0 - (delta_idle / time_passed * 100.0); + + prev_idle = idle; + prev_total = total; + + return percent_cpu_load; + +} + + +TAO_LB_CPU_Utilization_Monitor::TAO_LB_CPU_Utilization_Monitor (const char * location_id, + const char * location_kind) + : location_ (1) +{ + this->location_.length (1); + + if (location_id == 0) + { + char host[MAXHOSTNAMELEN + 1]; + if (ACE_OS::hostname (host, sizeof (host)) != 0) + { + // Couldn't determine hostname. Use the current time + // instead. + CORBA::ULong t = static_cast<CORBA::ULong> (ACE_OS::time ()); + + // A 64 byte buffer is more than enough to contain the + // string representation of a 32 bit unsigned integer. + char buf[64] = { '\0' }; + ACE_OS::sprintf (buf, "%u", t); + + this->location_[0].id = CORBA::string_dup (buf); + this->location_[0].kind = CORBA::string_dup ("Creation Time"); + } + else + { + this->location_[0].id = CORBA::string_dup (host); + this->location_[0].kind = CORBA::string_dup ("Hostname"); + } + } + else + { + this->location_[0].id = CORBA::string_dup (location_id); + + if (location_kind != 0) + this->location_[0].kind = CORBA::string_dup (location_kind); + } +} + +TAO_LB_CPU_Utilization_Monitor::~TAO_LB_CPU_Utilization_Monitor (void) +{ +} + +CosLoadBalancing::Location * +TAO_LB_CPU_Utilization_Monitor::the_location (void) +{ + CosLoadBalancing::Location * location; + ACE_NEW_THROW_EX (location, + CosLoadBalancing::Location (this->location_), + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO::VMCID, + ENOMEM), + CORBA::COMPLETED_NO)); + + return location; +} + +CosLoadBalancing::LoadList * +TAO_LB_CPU_Utilization_Monitor::loads (void) +{ + CORBA::Float load = 0; + +#if defined (linux) || defined (sun) + + double load_double = calc_cpu_loading (); + load = load_double; + + CosLoadBalancing::LoadList * tmp; + ACE_NEW_THROW_EX (tmp, + CosLoadBalancing::LoadList (1), + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO::VMCID, + ENOMEM), + CORBA::COMPLETED_NO)); + + CosLoadBalancing::LoadList_var load_list = tmp; + + load_list->length (1); + + load_list[0].id = CosLoadBalancing::LoadAverage; + load_list[0].value = load; + + ACE_DEBUG ((LM_DEBUG, "%2f\n", load_list[0].value)); + + return load_list._retn (); + +#else + + ACE_UNUSED_ARG (load); + throw CORBA::NO_IMPLEMENT (); + +#endif /* linux || sun */ + +} + +TAO_END_VERSIONED_NAMESPACE_DECL |