From 58432192890769a46a171086ac70684b74304623 Mon Sep 17 00:00:00 2001 From: LollipopKit <2036293523@qq.com> Date: Thu, 28 Oct 2021 01:24:50 +0800 Subject: [PATCH] Fix CPU Algorithm --- lib/data/model/cpu_2_status.dart | 17 ++++++ .../{cpu_percent.dart => cpu_status.dart} | 19 +++---- lib/data/model/server_status.dart | 55 +------------------ lib/data/provider/server.dart | 34 +++++++----- lib/view/page/server/detail.dart | 2 +- lib/view/page/server/tab.dart | 2 +- 6 files changed, 49 insertions(+), 80 deletions(-) create mode 100644 lib/data/model/cpu_2_status.dart rename lib/data/model/{cpu_percent.dart => cpu_status.dart} (77%) diff --git a/lib/data/model/cpu_2_status.dart b/lib/data/model/cpu_2_status.dart new file mode 100644 index 00000000..949b5553 --- /dev/null +++ b/lib/data/model/cpu_2_status.dart @@ -0,0 +1,17 @@ +import 'package:toolbox/data/model/cpu_status.dart'; + +class Cpu2Status { + List pre; + List now; + Cpu2Status(this.pre, this.now); + + double usedPercent({int coreIdx = 0}) { + final used = (now[coreIdx].idle - pre[coreIdx].idle) / + (now[coreIdx].total - pre[coreIdx].total); + return used.isNaN ? 0 : used; + } + + Cpu2Status update(List newStatus) { + return Cpu2Status(now, newStatus); + } +} diff --git a/lib/data/model/cpu_percent.dart b/lib/data/model/cpu_status.dart similarity index 77% rename from lib/data/model/cpu_percent.dart rename to lib/data/model/cpu_status.dart index 9ffb00d6..ae34cdbf 100644 --- a/lib/data/model/cpu_percent.dart +++ b/lib/data/model/cpu_status.dart @@ -15,13 +15,13 @@ class CpuStatus { } */ late String id; - late double user; - late double sys; - late double nice; - late double idle; - late double iowait; - late double irq; - late double softirq; + late int user; + late int sys; + late int nice; + late int idle; + late int iowait; + late int irq; + late int softirq; CpuStatus( this.id, @@ -56,8 +56,5 @@ class CpuStatus { return data; } - double get calculateUsedPercent { - final used = idle / (user + sys + nice + iowait + irq + softirq + idle); - return used.isNaN ? 0 : used; - } + int get total => user + sys + nice + idle + iowait + irq + softirq; } diff --git a/lib/data/model/server_status.dart b/lib/data/model/server_status.dart index 88405d3a..2b78ca9c 100644 --- a/lib/data/model/server_status.dart +++ b/lib/data/model/server_status.dart @@ -1,4 +1,4 @@ -import 'package:toolbox/data/model/cpu_percent.dart'; +import 'package:toolbox/data/model/cpu_2_status.dart'; import 'package:toolbox/data/model/disk_info.dart'; import 'package:toolbox/data/model/tcp_status.dart'; @@ -28,7 +28,7 @@ class ServerStatus { } */ - List? cpuPercent; + Cpu2Status? cpu2Status; List? memList; String? sysVer; String? uptime; @@ -36,59 +36,10 @@ class ServerStatus { TcpStatus? tcp; ServerStatus( - {this.cpuPercent, + {this.cpu2Status, this.memList, this.sysVer, this.uptime, this.disk, this.tcp}); - ServerStatus.fromJson(Map json) { - cpuPercent = []; - for (var item in json["cpuPercent"]) { - cpuPercent!.add(CpuStatus.fromJson(item)); - } - if (json["memList"] != null) { - final v = json["memList"]; - final arr0 = []; - v.forEach((v) { - arr0.add(v.toInt()); - }); - memList = arr0; - } - sysVer = json["sysVer"]?.toString(); - uptime = json["uptime"]?.toString(); - if (json["disk"] != null) { - final v = json["disk"]; - final arr0 = []; - v.forEach((v) { - arr0.add(DiskInfo.fromJson(v)); - }); - disk = arr0; - } - tcp = TcpStatus.fromJson(json['tcp']); - } - Map toJson() { - final Map data = {}; - data["cpuPercent"] = cpuPercent; - if (memList != null) { - final v = memList; - final arr0 = []; - for (var v in v!) { - arr0.add(v); - } - data["memList"] = arr0; - } - data["sysVer"] = sysVer; - data["uptime"] = uptime; - if (disk != null) { - final v = disk; - final arr0 = []; - for (var v in v!) { - arr0.add(v!.toJson()); - } - data["disk"] = arr0; - } - data['tcp'] = tcp; - return data; - } } diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 7661a2b6..b0e7374f 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -4,7 +4,8 @@ import 'package:logging/logging.dart'; import 'package:ssh2/ssh2.dart'; import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/provider_base.dart'; -import 'package:toolbox/data/model/cpu_percent.dart'; +import 'package:toolbox/data/model/cpu_2_status.dart'; +import 'package:toolbox/data/model/cpu_status.dart'; import 'package:toolbox/data/model/server_connection_state.dart'; import 'package:toolbox/data/model/disk_info.dart'; import 'package:toolbox/data/model/server.dart'; @@ -21,11 +22,13 @@ class ServerProvider extends BusyProvider { final logger = Logger('ServerProvider'); - List get emptyCpuPercent => - [CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0)]; + CpuStatus get emptyCpuStatus => CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0); + + Cpu2Status get emptyCpu2Status => + Cpu2Status([emptyCpuStatus], [emptyCpuStatus]); ServerStatus get emptyStatus => ServerStatus( - cpuPercent: emptyCpuPercent, + cpu2Status: emptyCpu2Status, memList: [100, 0], disk: [ DiskInfo( @@ -142,7 +145,7 @@ class ServerProvider extends BusyProvider { final tcp = await client.execute('cat /proc/net/snmp') ?? ''; return ServerStatus( - cpuPercent: _getCPU(cpu), + cpu2Status: _getCPU(cpu, _servers[idx].status.cpu2Status!), memList: _getMem(mem), sysVer: sysVer.trim(), disk: _getDisk(disk), @@ -150,7 +153,7 @@ class ServerProvider extends BusyProvider { tcp: _getTcp(tcp)); } - List _getCPU(String raw) { + Cpu2Status _getCPU(String raw, Cpu2Status old) { final List cpus = []; for (var item in raw.split('\n')) { if (item == '') break; @@ -158,18 +161,19 @@ class ServerProvider extends BusyProvider { final matches = item.replaceFirst(id, '').trim().split(' '); cpus.add(CpuStatus( id, - double.parse(matches[0]), - double.parse(matches[1]), - double.parse(matches[2]), - double.parse(matches[3]), - double.parse(matches[4]), - double.parse(matches[5]), - double.parse(matches[6]))); + int.parse(matches[0]), + int.parse(matches[1]), + int.parse(matches[2]), + int.parse(matches[3]), + int.parse(matches[4]), + int.parse(matches[5]), + int.parse(matches[6]))); } if (cpus.isEmpty) { - return emptyCpuPercent; + return emptyCpu2Status; } - return cpus; + + return old.update(cpus); } String _getUpTime(String raw) { diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 8107174e..ca60163b 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -34,7 +34,7 @@ class _ServerDetailPageState extends State { } Widget _buildCPUView(ServerStatus ss) { - return Text(ss.cpuPercent!.toString()); + return Text(ss.cpu2Status!.toString()); } Widget _buildMemView(ServerStatus ss) { diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 7d69a817..aa6edec2 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -136,7 +136,7 @@ class _ServerPageState extends State Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _buildPercentCircle(ss.cpuPercent!.first.calculateUsedPercent, 'CPU'), + _buildPercentCircle(ss.cpu2Status!.usedPercent(), 'CPU'), _buildPercentCircle( ss.memList![1]! / ss.memList![0]! * 100 + 0.01, 'Mem'), _buildIOData('Net', 'Conn:\n' + ss.tcp!.maxConn!.toString(),