Fix CPU Algorithm

This commit is contained in:
LollipopKit
2021-10-28 01:24:50 +08:00
parent 6a0aa00f05
commit 5843219289
6 changed files with 49 additions and 80 deletions

View File

@@ -0,0 +1,17 @@
import 'package:toolbox/data/model/cpu_status.dart';
class Cpu2Status {
List<CpuStatus> pre;
List<CpuStatus> 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<CpuStatus> newStatus) {
return Cpu2Status(now, newStatus);
}
}

View File

@@ -15,13 +15,13 @@ class CpuStatus {
} }
*/ */
late String id; late String id;
late double user; late int user;
late double sys; late int sys;
late double nice; late int nice;
late double idle; late int idle;
late double iowait; late int iowait;
late double irq; late int irq;
late double softirq; late int softirq;
CpuStatus( CpuStatus(
this.id, this.id,
@@ -56,8 +56,5 @@ class CpuStatus {
return data; return data;
} }
double get calculateUsedPercent { int get total => user + sys + nice + idle + iowait + irq + softirq;
final used = idle / (user + sys + nice + iowait + irq + softirq + idle);
return used.isNaN ? 0 : used;
}
} }

View File

@@ -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/disk_info.dart';
import 'package:toolbox/data/model/tcp_status.dart'; import 'package:toolbox/data/model/tcp_status.dart';
@@ -28,7 +28,7 @@ class ServerStatus {
} }
*/ */
List<CpuStatus>? cpuPercent; Cpu2Status? cpu2Status;
List<int?>? memList; List<int?>? memList;
String? sysVer; String? sysVer;
String? uptime; String? uptime;
@@ -36,59 +36,10 @@ class ServerStatus {
TcpStatus? tcp; TcpStatus? tcp;
ServerStatus( ServerStatus(
{this.cpuPercent, {this.cpu2Status,
this.memList, this.memList,
this.sysVer, this.sysVer,
this.uptime, this.uptime,
this.disk, this.disk,
this.tcp}); this.tcp});
ServerStatus.fromJson(Map<String, dynamic> json) {
cpuPercent = [];
for (var item in json["cpuPercent"]) {
cpuPercent!.add(CpuStatus.fromJson(item));
}
if (json["memList"] != null) {
final v = json["memList"];
final arr0 = <int>[];
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 = <DiskInfo>[];
v.forEach((v) {
arr0.add(DiskInfo.fromJson(v));
});
disk = arr0;
}
tcp = TcpStatus.fromJson(json['tcp']);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
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;
}
} }

View File

@@ -4,7 +4,8 @@ import 'package:logging/logging.dart';
import 'package:ssh2/ssh2.dart'; import 'package:ssh2/ssh2.dart';
import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/core/provider_base.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/server_connection_state.dart';
import 'package:toolbox/data/model/disk_info.dart'; import 'package:toolbox/data/model/disk_info.dart';
import 'package:toolbox/data/model/server.dart'; import 'package:toolbox/data/model/server.dart';
@@ -21,11 +22,13 @@ class ServerProvider extends BusyProvider {
final logger = Logger('ServerProvider'); final logger = Logger('ServerProvider');
List<CpuStatus> get emptyCpuPercent => CpuStatus get emptyCpuStatus => CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0);
[CpuStatus('cpu', 0, 0, 0, 0, 0, 0, 0)];
Cpu2Status get emptyCpu2Status =>
Cpu2Status([emptyCpuStatus], [emptyCpuStatus]);
ServerStatus get emptyStatus => ServerStatus( ServerStatus get emptyStatus => ServerStatus(
cpuPercent: emptyCpuPercent, cpu2Status: emptyCpu2Status,
memList: [100, 0], memList: [100, 0],
disk: [ disk: [
DiskInfo( DiskInfo(
@@ -142,7 +145,7 @@ class ServerProvider extends BusyProvider {
final tcp = await client.execute('cat /proc/net/snmp') ?? ''; final tcp = await client.execute('cat /proc/net/snmp') ?? '';
return ServerStatus( return ServerStatus(
cpuPercent: _getCPU(cpu), cpu2Status: _getCPU(cpu, _servers[idx].status.cpu2Status!),
memList: _getMem(mem), memList: _getMem(mem),
sysVer: sysVer.trim(), sysVer: sysVer.trim(),
disk: _getDisk(disk), disk: _getDisk(disk),
@@ -150,7 +153,7 @@ class ServerProvider extends BusyProvider {
tcp: _getTcp(tcp)); tcp: _getTcp(tcp));
} }
List<CpuStatus> _getCPU(String raw) { Cpu2Status _getCPU(String raw, Cpu2Status old) {
final List<CpuStatus> cpus = []; final List<CpuStatus> cpus = [];
for (var item in raw.split('\n')) { for (var item in raw.split('\n')) {
if (item == '') break; if (item == '') break;
@@ -158,18 +161,19 @@ class ServerProvider extends BusyProvider {
final matches = item.replaceFirst(id, '').trim().split(' '); final matches = item.replaceFirst(id, '').trim().split(' ');
cpus.add(CpuStatus( cpus.add(CpuStatus(
id, id,
double.parse(matches[0]), int.parse(matches[0]),
double.parse(matches[1]), int.parse(matches[1]),
double.parse(matches[2]), int.parse(matches[2]),
double.parse(matches[3]), int.parse(matches[3]),
double.parse(matches[4]), int.parse(matches[4]),
double.parse(matches[5]), int.parse(matches[5]),
double.parse(matches[6]))); int.parse(matches[6])));
} }
if (cpus.isEmpty) { if (cpus.isEmpty) {
return emptyCpuPercent; return emptyCpu2Status;
} }
return cpus;
return old.update(cpus);
} }
String _getUpTime(String raw) { String _getUpTime(String raw) {

View File

@@ -34,7 +34,7 @@ class _ServerDetailPageState extends State<ServerDetailPage> {
} }
Widget _buildCPUView(ServerStatus ss) { Widget _buildCPUView(ServerStatus ss) {
return Text(ss.cpuPercent!.toString()); return Text(ss.cpu2Status!.toString());
} }
Widget _buildMemView(ServerStatus ss) { Widget _buildMemView(ServerStatus ss) {

View File

@@ -136,7 +136,7 @@ class _ServerPageState extends State<ServerPage>
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
_buildPercentCircle(ss.cpuPercent!.first.calculateUsedPercent, 'CPU'), _buildPercentCircle(ss.cpu2Status!.usedPercent(), 'CPU'),
_buildPercentCircle( _buildPercentCircle(
ss.memList![1]! / ss.memList![0]! * 100 + 0.01, 'Mem'), ss.memList![1]! / ss.memList![0]! * 100 + 0.01, 'Mem'),
_buildIOData('Net', 'Conn:\n' + ss.tcp!.maxConn!.toString(), _buildIOData('Net', 'Conn:\n' + ss.tcp!.maxConn!.toString(),