我在Pylons中有这个代码,用于计算运行webapp的Linux系统的网络使用情况。基本上,为了计算网络利用率,我们需要读取文件/proc/net/dev
两次,这会给我们传输的数据量,并将减去的值除以两次读取之间经过的时间。
我不想定期进行此计算。有一个JS代码定期提取这些数据。传输速率是每个时间单位的两个请求之间的平均传输字节数。在Pylons中,我使用pylons.app_globals
来存储读数,该读数将在后续请求中从下一个读数中减去。但显然金字塔中没有app_globals
,我不确定使用线程本地是否是正确的行动方案。此外,虽然request.registry.settings显然是在所有请求中共享的,但我不愿意将数据存储在那里,顾名思义它应该只存储设置。
def netUsage():
netusage = {'rx':0, 'tx':0, 'time': time.time()}
rtn = {}
net_file = open('/proc/net/dev')
for line in net_file.readlines()[2:]:
tmp = map(string.atof, re.compile('\d+').findall(line[line.find(':'):]))
if line[:line.find(':')].strip() == "lo":
continue
netusage['rx'] += tmp[0]
netusage['tx'] += tmp[8]
net_file.close()
rx = netusage['rx'] - app_globals.prevNetusage['rx'] if app_globals.prevNetusage['rx'] else 0
tx = netusage['tx'] - app_globals.prevNetusage['tx'] if app_globals.prevNetusage'tx'] else 0
elapsed = netusage['time'] - app_globals.prevNetusage['time']
rtn['rx'] = humanReadable(rx / elapsed)
rtn['tx'] = humanReadable(tx / elapsed)
app_globals.prevNetusage = netusage
return rtn
@memorize(duration = 3)
def getSysStat():
memTotal, memUsed = getMemUsage()
net = netUsage()
loadavg = getLoadAverage()
return {'cpu': getCPUUsage(),
'mem': int((memUsed / memTotal) * 100),
'load1': loadavg[0],
'load5': loadavg[1],
'load15': loadavg[2],
'procNum': loadavg[3],
'lastProc': loadavg[4],
'rx': net['rx'],
'tx': net['tx']
}