Skip to content

Commit cb04dec

Browse files
author
liaotonglang
committed
fix memavailable on centos6
avail = free + cache + buffer
1 parent 916d7dc commit cb04dec

File tree

3 files changed

+81
-35
lines changed

3 files changed

+81
-35
lines changed

src/main/ssh.ts

+24-19
Original file line numberDiff line numberDiff line change
@@ -522,28 +522,24 @@ export class SshFetchStats {
522522

523523
getMemInfo(s: LinuxSession) {
524524
this.execGetStdout(s, 'cat /proc/meminfo', (s: LinuxSession, data: string) => {
525-
const getFieldsValue = (dataLines: string[], line: number): number => {
526-
if (line >= dataLines.length) {
527-
console.log(`get ${line}-th line of data filed`);
528-
return undefined;
529-
}
530-
const selectedLine = dataLines[line];
531-
const fields = selectedLine.split(/\s+/);
532-
if (fields.length < 2) {
533-
console.log(`line ${selectedLine} get number failed`);
534-
return undefined;
525+
const lines = data.split('\n');
526+
const fields = new Map();
527+
lines.forEach((line: string) => {
528+
const splits = line.split(/\s+/);
529+
if (splits.length < 2) {
530+
return;
535531
}
536-
const value = Number(fields[1]);
537-
return value;
538-
}
532+
fields.set(splits[0], Number(splits[1]) * 1000);
533+
});
539534

540-
const lines = data.split('\n');
541-
if (lines.length < 3) {
542-
console.log('data empty');
543-
return;
535+
const memtotal = fields.get('MemTotal:');
536+
let memavail = fields.get('MemAvailable:');
537+
if (memavail == undefined || memavail == null) {
538+
const memfree = fields.get('MemFree:');
539+
const buffers = fields.get('Buffers:');
540+
const cached = fields.get('Cached:');
541+
memavail = memfree + buffers + cached;
544542
}
545-
const memtotal = getFieldsValue(lines, 0);
546-
const memavail = getFieldsValue(lines, 2);
547543
s.stat.memtotal = memtotal;
548544
s.stat.memavail = memavail;
549545
s.stat.memUsePercent = (memtotal - memavail) / memtotal;
@@ -553,16 +549,23 @@ export class SshFetchStats {
553549

554550
getDiskStat(s: LinuxSession) {
555551
this.execGetStdout(s, 'df', (s: LinuxSession, data: string) => {
552+
let prevName = '';
556553
const getFieldsValue = (line: string): DiskStat => {
557554
const fields = line.split(/\s+/);
558555
if (fields.length < 5) {
559556
// console.log(`line ${line} extract failed`);
557+
prevName = fields[0];
560558
return undefined;
561559
}
562560
const res = new DiskStat();
563561
res.name = fields[0];
562+
if (res.name == undefined || res.name == '') {
563+
res.name = prevName;
564+
}
564565
const total = Number(fields[1]);
565566
const avail = Number(fields[3]);
567+
res.total = total * 1000;
568+
res.avail = avail * 1000;
566569
res.usePercent = (total - avail) / total;
567570
return res;
568571
}
@@ -697,6 +700,8 @@ const OnlineStatus = {
697700
export class DiskStat {
698701
name: string
699702
usePercent: number
703+
total: number
704+
avail: number
700705
}
701706

702707
export class LinuxStat {

src/pages/EditSmtp.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ export function EditSmtp(props) {
7777
<EuiToolTip
7878
position="top"
7979
content={
80-
<p>
80+
<>
8181
一般端口是<EuiCode>465</EuiCode>就勾上,<EuiCode>587</EuiCode><EuiCode>25</EuiCode>就别勾了
82-
</p>
82+
</>
8383
}>
8484
<EuiCheckbox
8585
id='useSecure'

src/pages/ServerCard.jsx

+55-14
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,23 @@ export class ServerCard extends React.Component {
9595
render() {
9696
const diskX = this.state.stat.disks.map((it) => {
9797
return (
98-
<EuiProgress
98+
<EuiToolTip
99+
display='block'
99100
key={it.name}
100-
valueText={true}
101-
max={100}
102-
color={this.selectColor(it.usePercent * 100)}
103-
label={"磁盘占用率 (" + it.name + ')'}
104-
value={(it.usePercent * 100).toFixed(2)}
105-
/>);
101+
title={"磁盘占用率 " + it.name}
102+
content={<>
103+
<p>总大小: {humanFileSize(it.total)}</p>
104+
<p>剩余空间: {humanFileSize(it.avail)}</p>
105+
</>}>
106+
<EuiProgress
107+
valueText={true}
108+
max={100}
109+
color={this.selectColor(it.usePercent * 100)}
110+
label={"磁盘占用率 (" + it.name + ')'}
111+
value={(it.usePercent * 100).toFixed(2)}
112+
/>
113+
</EuiToolTip>
114+
);
106115
});
107116
return (
108117
<EuiCard
@@ -256,15 +265,47 @@ export class ServerCard extends React.Component {
256265
label="CPU 占用率"
257266
value={(this.state.stat.cpuload * 100).toFixed(2)}
258267
/>
259-
<EuiProgress
260-
valueText={true}
261-
max={100}
262-
color={this.selectColor(this.state.stat.memUsePercent * 100)}
263-
label="内存占用率"
264-
value={(this.state.stat.memUsePercent * 100).toFixed(2)}
265-
/>
268+
269+
<EuiToolTip
270+
display='block'
271+
title='内存占用'
272+
content={<><p>内存总大小: {humanFileSize(this.state.stat.memtotal)}</p>
273+
<p>内存剩余: {humanFileSize(this.state.stat.memavail)}</p>
274+
<p>MemAvailable = MemFree + Buffers + Cached</p></>}>
275+
<EuiProgress
276+
valueText={true}
277+
max={100}
278+
color={this.selectColor(this.state.stat.memUsePercent * 100)}
279+
label="内存占用率"
280+
value={(this.state.stat.memUsePercent * 100).toFixed(2)}
281+
/>
282+
283+
</EuiToolTip>
266284
{diskX}
267285
</EuiCard>
268286
);
269287
}
270288
}
289+
290+
291+
function humanFileSize(bytes, si = false, dp = 1) {
292+
const thresh = si ? 1000 : 1024;
293+
294+
if (Math.abs(bytes) < thresh) {
295+
return bytes + ' B';
296+
}
297+
298+
const units = si
299+
? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
300+
: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
301+
let u = -1;
302+
const r = 10 ** dp;
303+
304+
do {
305+
bytes /= thresh;
306+
++u;
307+
} while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
308+
309+
310+
return bytes.toFixed(dp) + ' ' + units[u];
311+
}

0 commit comments

Comments
 (0)