Skip to content

Commit

Permalink
Closes-Bug: 1467407
Browse files Browse the repository at this point in the history
Added system memory/cpu and process mem/cpu information under NodeStatus hierarchy.

1. In current code, analytics, config and vrouter modules have duplicate code to send system cpu/mem info.
   Moved the functionality to common codebase in nodemgr.
   Now system cpu/mem info is send for all node types.
   - NodeStatus >> system_mem_cpu_info
2. In current code, each process sends cpu/mem info individually.
   Moved the functionality to common codebase in nodemgr to send cpu/mem info for all processes on the node.
   - NodeStatus >> process_mem_cpu_info
3. Created new hierarchy under NodeStatus and added following fields for cpu info
   sockets, cores_per_socket and threads_per_core.
   These fields are sent only during nodemgr init for all node types.
   - NodeStatus >> process_cpu_info
Obsolete hierarchy/duplicate code for the above will be deleted once UI moves to new hierarchy.

Conflicts:
	src/nodemgr/analytics_nodemgr/analytics_event_manager.py
	src/nodemgr/config_nodemgr/config_event_manager.py
	src/nodemgr/control_nodemgr/control_event_manager.py
	src/nodemgr/database_nodemgr/database_event_manager.py

Change-Id: Ib28f22eb855413d88d928a26c4d502df9d975d2d
  • Loading branch information
Santosh Gupta committed May 27, 2016
1 parent c8d6ffa commit 6944d17
Show file tree
Hide file tree
Showing 24 changed files with 270 additions and 57 deletions.
3 changes: 3 additions & 0 deletions src/analytics/analytics.sandesh
Expand Up @@ -76,6 +76,9 @@ struct NodeStatus {
6: optional list<process_info.DiskPartitionUsageStats> disk_usage_info (tags="")
7: optional string description
8: optional list<string> all_core_file_list
10: optional list<cpuinfo.ProcessCpuInfo> process_mem_cpu_usage (aggtype="union")
11: optional cpuinfo.SystemMemCpuUsage system_mem_cpu_usage
12: optional cpuinfo.SystemCpuInfo system_cpu_info
}

/**
Expand Down
4 changes: 3 additions & 1 deletion src/analytics/database/SConscript
Expand Up @@ -26,10 +26,12 @@ for file in local_sources:
local_sources_rules.append(DatabaseEnv.Install("database", file))

database_pkg = DatabaseEnv.SandeshGenPy('#controller/src/analytics/database/database.sandesh', 'database/sandesh/', False)
cpuinfo_pkg = DatabaseEnv.SandeshGenPy('#controller/src/base/sandesh/cpuinfo.sandesh', 'database/sandesh/database/', False)
DatabaseEnv.Depends(cpuinfo_pkg, database_pkg)
process_info_pkg = DatabaseEnv.SandeshGenPy('#/controller/src/base/sandesh/process_info.sandesh', 'database/sandesh/database/', False)
DatabaseEnv.Depends(process_info_pkg, database_pkg)

sdist_depends = [setup_sources_rules, local_sources_rules, database_pkg, process_info_pkg]
sdist_depends = [setup_sources_rules, local_sources_rules, database_pkg, cpuinfo_pkg, process_info_pkg]
sdist_gen = DatabaseEnv.Command('dist', 'setup.py',
'cd ' + Dir('.').path + ' && python setup.py sdist')
DatabaseEnv.Depends(sdist_gen, sdist_depends)
Expand Down
4 changes: 4 additions & 0 deletions src/analytics/database/database.sandesh
Expand Up @@ -7,6 +7,7 @@
* Database Node UVE.
*/

include "base/sandesh/cpuinfo.sandesh"
include "base/sandesh/process_info.sandesh"

/**
Expand Down Expand Up @@ -53,6 +54,9 @@ struct NodeStatus {
7: optional string description
8: optional list<string> all_core_file_list
9: optional string build_info
10: optional list<cpuinfo.ProcessCpuInfo> process_mem_cpu_usage (aggtype="union")
11: optional cpuinfo.SystemMemCpuUsage system_mem_cpu_usage
12: optional cpuinfo.SystemCpuInfo system_cpu_info
}

/**
Expand Down
3 changes: 2 additions & 1 deletion src/analytics/database/setup.py
Expand Up @@ -10,7 +10,8 @@
packages=['database',
'database.sandesh',
'database.sandesh.database',
'database.sandesh.database.process_info'
'database.sandesh.database.process_info',
'database.sandesh.database.cpuinfo'
],
package_data={'': ['*.html', '*.css', '*.xml']},
zip_safe=False,
Expand Down
5 changes: 4 additions & 1 deletion src/base/cpuinfo.cc
Expand Up @@ -109,7 +109,9 @@ static void SystemMemInfo(SystemMemInfo &info) {
// MemFree: 90333184 kB
file >> tmp; file >> info.free; file >> tmp;
// Buffers: 1029924 kB
file >> tmp; file >> info.buffers;
file >> tmp; file >> info.buffers; file >> tmp;
// Cached: 10290012 kB
file >> tmp; file >> info.cached;
// Used = Total - Free
info.used = info.total - info.free;
}
Expand Down Expand Up @@ -179,6 +181,7 @@ void CpuLoadData::FillCpuInfo(CpuLoadInfo &cpu_load_info, bool system) {
sys_mem_info.set_used(info.sys_mem_info.used);
sys_mem_info.set_free(info.sys_mem_info.free);
sys_mem_info.set_buffers(info.sys_mem_info.buffers);
sys_mem_info.set_cached(info.sys_mem_info.cached);
cpu_load_info.set_sys_mem_info(sys_mem_info);
}
}
Expand Down
1 change: 1 addition & 0 deletions src/base/cpuinfo.h
Expand Up @@ -29,6 +29,7 @@ struct SystemMemInfo {
uint32_t used;
uint32_t free;
uint32_t buffers;
uint32_t cached;
};

struct CpuInfo {
Expand Down
17 changes: 17 additions & 0 deletions src/base/sandesh/cpuinfo.sandesh
Expand Up @@ -27,6 +27,7 @@ struct SysMemInfo {
2: u32 used;
3: u32 free;
4: u32 buffers;
5: u32 cached;
}

/**
Expand Down Expand Up @@ -57,3 +58,19 @@ struct ProcessCpuInfo {
4: double cpu_share
5: u32 mem_res
}

struct SystemCpuInfo {
1: u32 num_socket;
2: u32 num_cpu;
3: u32 num_core_per_socket;
4: u32 num_thread_per_core;
}

/**
* This structure carries system memory and cpu information
*/
struct SystemMemCpuUsage {
1: SysMemInfo mem_info;
2: CpuLoadAvg cpu_load;
3: double cpu_share;
}
1 change: 1 addition & 0 deletions src/config/common/vnc_cpu_info.py
Expand Up @@ -126,6 +126,7 @@ def _send_cpustats(self):
mod_cpu.cpu_info.sys_mem_info.used = self._virtmem_info.used / 1024
mod_cpu.cpu_info.sys_mem_info.free = self._virtmem_info.free / 1024
mod_cpu.cpu_info.sys_mem_info.buffers = self._virtmem_info.buffers / 1024
mod_cpu.cpu_info.sys_mem_info.cached = self._virtmem_info.cached / 1024

# populate CPU Load avg
mod_cpu.cpu_info.cpuload = CpuLoadAvg()
Expand Down
3 changes: 3 additions & 0 deletions src/config/uve/cfgm_cpuinfo.sandesh
Expand Up @@ -52,6 +52,9 @@ struct NodeStatus {
6: optional list<process_info.DiskPartitionUsageStats> disk_usage_info (tags="")
7: optional string description
8: optional list<string> all_core_file_list
10: optional list<cpuinfo.ProcessCpuInfo> process_mem_cpu_usage (aggtype="union")
11: optional cpuinfo.SystemMemCpuUsage system_mem_cpu_usage
12: optional cpuinfo.SystemCpuInfo system_cpu_info
}

uve sandesh NodeStatusUVE {
Expand Down
3 changes: 3 additions & 0 deletions src/control-node/sandesh/control_node.sandesh
Expand Up @@ -86,6 +86,9 @@ struct NodeStatus {
6: optional list<process_info.DiskPartitionUsageStats> disk_usage_info (tags="")
7: optional string description
8: optional list<string> all_core_file_list
10: optional list<cpuinfo.ProcessCpuInfo> process_mem_cpu_usage (aggtype="union")
11: optional cpuinfo.SystemMemCpuUsage system_mem_cpu_usage
12: optional cpuinfo.SystemCpuInfo system_cpu_info
}

/**
Expand Down
7 changes: 6 additions & 1 deletion src/nodemgr/SConscript
Expand Up @@ -76,11 +76,15 @@ common_sources = [
'common/event_manager.py',
'common/process_stat.py',
'common/event_listener_protocol_nodemgr.py',
'common/cpuinfo.py',
]
common_sources_rules = []
for file in common_sources:
common_sources_rules.append(OpEnv.Install(Dir("nodemgr/common"), file))

cpu_info_pkg = OpEnv.SandeshGenPy('#controller/src/base/sandesh/cpuinfo.sandesh', 'nodemgr/common/sandesh/', False)


rel_path = Dir('nodemgr/common').path
def BuildInfoAction(target, source, env):
env.GenerateBuildInfoPyCode(path=rel_path)
Expand All @@ -89,7 +93,8 @@ build_info_rules = [OpEnv.Command(target='buildinfo.py', source = None, action=B

sdist_depends = [setup_sources_rules, local_sources_rules, analytics_sources_rules,
control_sources_rules, config_sources_rules, common_sources_rules,
vrouter_sources_rules, database_sources_rules, build_info_rules
vrouter_sources_rules, database_sources_rules, build_info_rules,
cpu_info_pkg
]

cd_cmd = 'cd ' + Dir('.').path + ' && '
Expand Down
13 changes: 8 additions & 5 deletions src/nodemgr/analytics_nodemgr/analytics_event_manager.py
Expand Up @@ -26,7 +26,7 @@
from analytics.ttypes import \
NodeStatusUVE, NodeStatus
from analytics.process_info.ttypes import \
ProcessStatus, ProcessState, ProcessInfo, DiskPartitionUsageStats
ProcessStatus, ProcessState, ProcessInfo
from analytics.process_info.constants import \
ProcessStateNames

Expand All @@ -50,6 +50,7 @@ def __init__(self, rule_file, discovery_server,
node_type_name, self.instance_id, self.collector_addr,
self.module_id, 8104, ['analytics'], _disc)
sandesh_global.set_logging_params(enable_local_log=True)
self.send_system_cpu_info()
# end __init__

def process(self):
Expand All @@ -68,10 +69,12 @@ def send_nodemgr_process_status(self):
ProcessStateNames, ProcessState, ProcessStatus,
NodeStatus, NodeStatusUVE)

def get_node_status_class(self):
return NodeStatus

def get_node_status_uve_class(self):
return NodeStatusUVE

def get_process_state(self, fail_status_bits):
return self.get_process_state_base(
fail_status_bits, ProcessStateNames, ProcessState)

def send_disk_usage_info(self):
self.send_disk_usage_info_base(
NodeStatusUVE, NodeStatus, DiskPartitionUsageStats)
91 changes: 91 additions & 0 deletions src/nodemgr/common/cpuinfo.py
@@ -0,0 +1,91 @@
#
# Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
#

import os
import psutil
import subprocess

from subprocess import Popen, PIPE
from sandesh.cpuinfo.ttypes import *

class MemCpuUsageData(object):

def __init__(self, pid):
self.pid = pid
try:
self._process = psutil.Process(self.pid)
except psutil.NoSuchProcess:
raise
else:
if not hasattr(self._process, 'get_memory_info'):
self._process.get_memory_info = self._process.memory_info
if not hasattr(self._process, 'get_cpu_percent'):
self._process.get_cpu_percent = self._process.cpu_percent
#end __init__

def get_num_socket(self):
cmd = 'lscpu | grep "Socket(s):" | awk \'{print $2}\''
proc = Popen(cmd, shell=True, stdout=PIPE)
return int(proc.communicate()[0])
#end get_num_socket

def get_num_cpu(self):
cmd = 'lscpu | grep "^CPU(s):" | awk \'{print $2}\''
proc = Popen(cmd, shell=True, stdout=PIPE)
return int(proc.communicate()[0])
#end get_num_cpu

def get_num_core_per_socket(self):
cmd = 'lscpu | grep "Core(s) per socket:" | awk \'{print $4}\''
proc = Popen(cmd, shell=True, stdout=PIPE)
return int(proc.communicate()[0])
#end get_num_core_per_socket

def get_num_thread_per_core (self):
cmd = 'lscpu | grep "Thread(s) per core:" | awk \'{print $4}\''
proc = Popen(cmd, shell=True, stdout=PIPE)
return int(proc.communicate()[0])
#end get_num_thread_per_core

def _get_sys_mem_info(self):
virtmem_info = psutil.virtual_memory()
sys_mem_info = SysMemInfo()
sys_mem_info.total = virtmem_info.total/1024
sys_mem_info.used = virtmem_info.used/1024
sys_mem_info.free = virtmem_info.free/1024
sys_mem_info.buffers = virtmem_info.buffers/1024
sys_mem_info.cached = virtmem_info.cached/1024
return sys_mem_info
#end _get_sys_mem_info

def _get_cpu_load_avg(self):
load_avg = os.getloadavg()
cpu_load_avg = CpuLoadAvg()
cpu_load_avg.one_min_avg = load_avg[0]
cpu_load_avg.five_min_avg = load_avg[1]
cpu_load_avg.fifteen_min_avg = load_avg[2]
return cpu_load_avg
#end _get_cpu_load_avg

def _get_cpu_share(self):
cpu_percent = self._process.get_cpu_percent(interval=0.1)
return cpu_percent/self.get_num_cpu()
#end _get_cpu_share

def get_sys_mem_cpu_info(self):
sys_mem_cpu = SystemMemCpuUsage()
sys_mem_cpu.cpu_load = self._get_cpu_load_avg()
sys_mem_cpu.mem_info = self._get_sys_mem_info()
sys_mem_cpu.cpu_share = self._get_cpu_share()
return sys_mem_cpu
#end get_sys_mem_cpu_info

def get_process_mem_cpu_info(self):
process_mem_cpu = ProcessCpuInfo()
process_mem_cpu.cpu_share = self._process.get_cpu_percent(interval=0.1)/psutil.NUM_CPUS
process_mem_cpu.mem_virt = self._process.get_memory_info().vms/1024
process_mem_cpu.mem_res = self._process.get_memory_info().rss/1024
return process_mem_cpu
#end get_process_mem_cpu_info
#end class MemCpuUsageData

0 comments on commit 6944d17

Please sign in to comment.