我在Pylons中有这段代码,用于计算运行webapp的Linux系统的网络使用率。基本上,要计算网络利用率,我们需要读取文件/proc/net/dev
两次,这将给出传输的数据量,并将减去的值除以两次读取之间所用的时间。在
我不想定期做这个计算。有一个JS代码定期获取这些数据。传输速率是每个时间单位两个请求之间传输的平均字节数。在Pylons中,我使用pylons.app_globals
来存储下一次请求时从下一个读数中减去的读数。但是显然金字塔中没有app_globals
,我不确定使用线程局部变量是否是正确的操作过程。还有,尽管请求.注册表.设置显然是在所有请求之间共享的,我不愿意将我的数据存储在那里,因为名称意味着它应该只存储设置。在
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']
}
根据官方的pyramid docs,使用请求线程局部变量被认为是糟糕的设计,不应被滥用。在
我的建议是尽可能使用一些简单的键值存储,如memcached或{a3}。在
相关问题 更多 >
编程相关推荐