diff --git a/panel_task.py b/panel_task.py
index 8382b29bb..84d39bd4f 100755
--- a/panel_task.py
+++ b/panel_task.py
@@ -346,12 +346,10 @@ def systemTask():
# LoadAverage
load_average = sm.getLoadAverage()
- lpro = round(
- (load_average['one'] / load_average['max']) * 100, 2)
+ lpro = round((load_average['one'] / load_average['max']) * 100, 2)
if lpro > 100:
lpro = 100
- sql.table('load_average').add('pro,one,five,fifteen,addtime', (lpro, load_average[
- 'one'], load_average['five'], load_average['fifteen'], addtime))
+ sql.table('load_average').add('pro,one,five,fifteen,addtime', (lpro, load_average['one'], load_average['five'], load_average['fifteen'], addtime))
lpro = None
load_average = None
@@ -381,6 +379,20 @@ def systemTask():
time.sleep(30)
systemTask()
+def systemTask2():
+ # 系统监控任务
+ try:
+ from utils.system import monitor
+ while True:
+ monitor.instance().run()
+ time.sleep(5)
+ except Exception as ex:
+ print(str(ex))
+ mw.writeFile('logs/sys_interrupt.pl', str(ex))
+ restartMw()
+ time.sleep(30)
+ systemTask2()
+
# -------------------------------------- PHP监控 start --------------------------------------------- #
# 502错误检查线程
@@ -584,7 +596,7 @@ def setDaemon(t):
def run():
# # 系统监控
- sysTask = threading.Thread(target=systemTask)
+ sysTask = threading.Thread(target=systemTask2)
sysTask = setDaemon(sysTask)
sysTask.start()
diff --git a/web/static/app/control.js b/web/static/app/control.js
index 4b68cd96b..9ee2e8807 100755
--- a/web/static/app/control.js
+++ b/web/static/app/control.js
@@ -490,7 +490,8 @@ function network(b,e){
option = {
tooltip: {
trigger: 'axis',
- axisPointer: { type: 'cross' }
+ axisPointer: { type: 'cross' },
+ formatter:"时间:{b0}
{a0}: {c0} Kb/s
{a1}: {c1} Kb/s",
},
legend: {
data:[lan.index.net_up,lan.index.net_down]
diff --git a/web/utils/system/monitor.py b/web/utils/system/monitor.py
index 45dd57912..ea5ba96c8 100644
--- a/web/utils/system/monitor.py
+++ b/web/utils/system/monitor.py
@@ -29,6 +29,7 @@ class monitor:
_dbfile = mw.getPanelDataDir() + '/system.db'
_diskinfo = None
+ _netinfo = None
def __init__(self):
pass
@@ -55,41 +56,131 @@ class monitor:
sql.execute(csql_list[index], ())
return True
+ def getMonitorDay(self):
+ monitor_day = mw.M('option').field('name').where('name=?',('monitor_day',)).getField('value')
+ return int(monitor_day)
+
+ def isOnlyNetIoStats(self):
+ monitor_only_netio = mw.M('option').field('name').where('name=?',('monitor_only_netio',)).getField('value')
+ if monitor_only_netio == 'open':
+ return True
+ return False
+
# def safeRun(self):
# self.initDBFile()
# monitor_day =mw.M('option').field('name').where('name=?',('monitor_day',)).getField('value')
# print(monitor_day)
# print("monitor data", mw.formatDate())
+ def psutilNetIoCounters(self):
+ '''
+ 统计网卡流量
+ '''
+ if self.isOnlyNetIoStats():
+ local_lo = (0, 0, 0, 0)
+ ioName = psutil.net_io_counters(pernic=True).keys()
+ for x in ioName:
+
+ if x.find("lo") > -1:
+ local_lo = psutil.net_io_counters(
+ pernic=True).get(x)[:4]
+
+ all_io = psutil.net_io_counters()[:4]
+ result_io = tuple([all_io[i] - local_lo[i]
+ for i in range(0, len(all_io))])
+
+ # print(local_lo)
+ # print(all_io)
+ # print(result_io)
+ return result_io
+ return psutil.net_io_counters()[:4]
def getDiskInfo(self):
+ now_diskinfo = psutil.disk_io_counters()
if self._diskinfo is None:
- self._diskinfo = psutil.disk_io_counters()
+ self._diskinfo = now_diskinfo
+
+ info = {}
+ info['read_count'] = now_diskinfo.read_count - self._diskinfo.read_count
+ info['write_count'] = now_diskinfo.write_count - self._diskinfo.write_count
+ info['read_bytes'] = now_diskinfo.read_bytes - self._diskinfo.read_bytes
+ info['write_bytes'] = now_diskinfo.write_bytes - self._diskinfo.write_bytes
+ info['read_time'] = now_diskinfo.read_time - self._diskinfo.read_time
+ info['write_time'] = now_diskinfo.write_time - self._diskinfo.write_time
+
+ self._diskinfo = now_diskinfo
+ return info
+
+ def getNetIoInfo(self):
+ # 取当前网络Io
+ net_io = self.psutilNetIoCounters()
+ if not self._netinfo:
+ self._netinfo = net_io
+ info = {}
+ info['upTotal'] = net_io[0]
+ info['downTotal'] = net_io[1]
+ info['up'] = round(float((net_io[0] - self._netinfo[0]) / 1024), 2)
+ info['down'] = round(float((net_io[1] - self._netinfo[1]) / 1024), 2)
+ info['downPackets'] = net_io[3]
+ info['upPackets'] = net_io[2]
+
+ self._netinfo = net_io
+ return info
+
+ def getLoadAverage(self):
+ c = os.getloadavg()
+ data = {}
+ data['one'] = round(float(c[0]), 2)
+ data['five'] = round(float(c[1]), 2)
+ data['fifteen'] = round(float(c[2]), 2)
+ data['max'] = psutil.cpu_count() * 2
+ data['limit'] = data['max']
+ data['safe'] = data['max'] * 0.75
+ return data
def run(self):
self.initDBFile()
- monitor_day = mw.M('option').field('name').where('name=?',('monitor_day',)).getField('value')
- print(monitor_day)
- print("monitor data", mw.formatDate())
-
- now_info = {}
+ monitor_day = self.getMonitorDay()
+
+ info = {}
# 取当前CPU Io
- now_info['used'] = psutil.cpu_percent(interval=1)
- now_info['mem'] = getMemUsed()
-
- network_io = psutil.net_io_counters()[:4]
- diskio = psutil.disk_io_counters()
-
- print(network_io)
- print(now_info)
- print(diskio)
- # if tmp['used'] > 80:
- # panel_title = mw.getConfig('title')
- # ip = mw.getHostAddr()
- # now_time = mw.getDateFromNow()
- # msg = now_time + '|节点[' + panel_title + ':' + ip + \
- # ']处于高负载[' + str(tmp['used']) + '],请排查原因!'
- # mw.notifyMessage(msg, '面板监控', 600)
+ info['used'] = psutil.cpu_percent(interval=1)
+ info['mem'] = getMemUsed()
+
+ netio = self.getNetIoInfo()
+ diskio = self.getDiskInfo()
+
+ addtime = int(time.time())
+ deltime = addtime - (monitor_day * 86400)
+
+ # CPU/内存数据入库
+ cpu_mem_data = (info['used'], info['mem'], addtime)
+ cmd_objm = mw.M('cpuio').dbPos(mw.getPanelDataDir(),'system')
+ cmd_objm.add('pro,mem,addtime', cpu_mem_data)
+ cmd_objm.where("addtime", (deltime,)).delete()
+
+ # 网络数据入库
+ netio_data = (netio['up'] / 5, netio['down'] / 5, netio['upTotal'], netio['downTotal'], netio['downPackets'], netio['upPackets'], addtime)
+ network_objm = mw.M('network').dbPos(mw.getPanelDataDir(),'system')
+ network_objm.add('up,down,total_up,total_down,down_packets,up_packets,addtime', netio_data)
+ network_objm.where("addtime", (deltime,)).delete()
+
+ # 磁盘数据入库
+ disk_data = (diskio['read_count'], diskio['write_count'], diskio['read_bytes'], diskio['write_bytes'], diskio['read_time'], diskio['write_time'], addtime)
+ disk_objm = mw.M('diskio').dbPos(mw.getPanelDataDir(),'system')
+ disk_objm.add('read_count,write_count,read_bytes,write_bytes,read_time,write_time,addtime', disk_data)
+ disk_objm.where("addtime", (deltime,)).delete()
+
+ # 负载数据入库
+ load_data = self.getLoadAverage()
+ lpro = round((load_data['one'] / load_data['max']) * 100, 2)
+ if lpro > 100:
+ lpro = 100
+ load_objm = mw.M('load_average').dbPos(mw.getPanelDataDir(),'system')
+ load_objm.add('pro,one,five,fifteen,addtime', (lpro, load_data['one'], load_data['five'], load_data['fifteen'], addtime))
+ load_objm.where("addtime", (deltime,)).delete()
+ return True
+
diff --git a/web/utils/system/query.py b/web/utils/system/query.py
index 9d2710070..71ddec03b 100644
--- a/web/utils/system/query.py
+++ b/web/utils/system/query.py
@@ -60,7 +60,7 @@ def toAddtime(data, tomem=False):
def toUseAddtime(data):
dlen = len(data)
for i in range(dlen):
- data[i]['addtime'] = time.strftime('%m/%d %H:%M', time.localtime(float(data[i]['addtime'])))
+ data[i]['addtime'] = time.strftime('%m/%d %H:%M:%S', time.localtime(float(data[i]['addtime'])))
return data
def getLoadAverageByDB(start, end):