mirror of
https://github.com/shirou/gopsutil.git
synced 2025-04-28 13:48:49 +08:00
[cpu]freebsd: cpu.Info() now returns CPUInfos same number as CPU nums.
This commit is contained in:
parent
d28b003411
commit
eb5bfca902
@ -26,6 +26,7 @@ var originMatch = regexp.MustCompile(`Origin\s*=\s*"(.+)"\s+Id\s*=\s*(.+)\s+Fami
|
|||||||
var featuresMatch = regexp.MustCompile(`Features=.+<(.+)>`)
|
var featuresMatch = regexp.MustCompile(`Features=.+<(.+)>`)
|
||||||
var featuresMatch2 = regexp.MustCompile(`Features2=[a-f\dx]+<(.+)>`)
|
var featuresMatch2 = regexp.MustCompile(`Features2=[a-f\dx]+<(.+)>`)
|
||||||
var cpuEnd = regexp.MustCompile(`^Trying to mount root`)
|
var cpuEnd = regexp.MustCompile(`^Trying to mount root`)
|
||||||
|
var cpuCores = regexp.MustCompile(`FreeBSD/SMP: (\d*) package\(s\) x (\d*) core\(s\)`)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
getconf, err := exec.LookPath("/usr/bin/getconf")
|
getconf, err := exec.LookPath("/usr/bin/getconf")
|
||||||
@ -107,11 +108,12 @@ func Times(percpu bool) ([]TimesStat, error) {
|
|||||||
// are the same across CPUs.
|
// are the same across CPUs.
|
||||||
func Info() ([]InfoStat, error) {
|
func Info() ([]InfoStat, error) {
|
||||||
const dmesgBoot = "/var/run/dmesg.boot"
|
const dmesgBoot = "/var/run/dmesg.boot"
|
||||||
lines, _ := common.ReadLines(dmesgBoot)
|
|
||||||
|
|
||||||
c := InfoStat{}
|
c, num, err := parseDmesgBoot(dmesgBoot)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
var vals []string
|
var vals []string
|
||||||
var err error
|
|
||||||
if vals, err = common.DoSysctrl("hw.clockrate"); err != nil {
|
if vals, err = common.DoSysctrl("hw.clockrate"); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -133,19 +135,28 @@ func Info() ([]InfoStat, error) {
|
|||||||
}
|
}
|
||||||
c.ModelName = strings.Join(vals, " ")
|
c.ModelName = strings.Join(vals, " ")
|
||||||
|
|
||||||
var cpuNums int32
|
ret := make([]InfoStat, num)
|
||||||
|
for i := 0; i < num; i++ {
|
||||||
|
ret[i] = c
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseDmesgBoot(fileName string) (InfoStat, int, error) {
|
||||||
|
c := InfoStat{}
|
||||||
|
lines, _ := common.ReadLines(fileName)
|
||||||
|
var cpuNum int
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
if matches := cpuEnd.FindStringSubmatch(line); matches != nil {
|
if matches := cpuEnd.FindStringSubmatch(line); matches != nil {
|
||||||
break
|
break
|
||||||
} else if matches := cpuMatch.FindStringSubmatch(line); matches != nil {
|
|
||||||
c.CPU = cpuNums
|
|
||||||
} else if matches := originMatch.FindStringSubmatch(line); matches != nil {
|
} else if matches := originMatch.FindStringSubmatch(line); matches != nil {
|
||||||
c.VendorID = matches[1]
|
c.VendorID = matches[1]
|
||||||
c.Family = matches[3]
|
c.Family = matches[3]
|
||||||
c.Model = matches[4]
|
c.Model = matches[4]
|
||||||
t, err := strconv.ParseInt(matches[5], 10, 32)
|
t, err := strconv.ParseInt(matches[5], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Unable to parse FreeBSD CPU stepping information from %q: %v", line, err)
|
return c, 0, fmt.Errorf("Unable to parse FreeBSD CPU stepping information from %q: %v", line, err)
|
||||||
}
|
}
|
||||||
c.Stepping = int32(t)
|
c.Stepping = int32(t)
|
||||||
} else if matches := featuresMatch.FindStringSubmatch(line); matches != nil {
|
} else if matches := featuresMatch.FindStringSubmatch(line); matches != nil {
|
||||||
@ -156,8 +167,19 @@ func Info() ([]InfoStat, error) {
|
|||||||
for _, v := range strings.Split(matches[1], ",") {
|
for _, v := range strings.Split(matches[1], ",") {
|
||||||
c.Flags = append(c.Flags, strings.ToLower(v))
|
c.Flags = append(c.Flags, strings.ToLower(v))
|
||||||
}
|
}
|
||||||
|
} else if matches := cpuCores.FindStringSubmatch(line); matches != nil {
|
||||||
|
t, err := strconv.ParseInt(matches[1], 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return c, 0, fmt.Errorf("Unable to parse FreeBSD CPU Nums from %q: %v", line, err)
|
||||||
|
}
|
||||||
|
cpuNum = int(t)
|
||||||
|
t2, err := strconv.ParseInt(matches[2], 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return c, 0, fmt.Errorf("Unable to parse FreeBSD CPU cores from %q: %v", line, err)
|
||||||
|
}
|
||||||
|
c.Cores = int32(t2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return []InfoStat{c}, nil
|
return c, cpuNum, nil
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,12 @@ package cpu
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCpu_times(t *testing.T) {
|
func TestCpu_times(t *testing.T) {
|
||||||
@ -62,6 +65,33 @@ func TestCpuInfo(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseDmesgBoot(t *testing.T) {
|
||||||
|
var cpuTests = []struct {
|
||||||
|
file string
|
||||||
|
cpuNum int
|
||||||
|
cores int32
|
||||||
|
}{
|
||||||
|
{"1cpu_2core.txt", 1, 2},
|
||||||
|
{"1cpu_4core.txt", 1, 4},
|
||||||
|
{"2cpu_4core.txt", 2, 4},
|
||||||
|
}
|
||||||
|
for _, tt := range cpuTests {
|
||||||
|
v, num, err := parseDmesgBoot(filepath.Join("expected/freebsd/", tt.file))
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("parseDmesgBoot failed(%s), %v", tt.file, err)
|
||||||
|
}
|
||||||
|
if num != tt.cpuNum {
|
||||||
|
t.Errorf("parseDmesgBoot wrong length(%s), %v", tt.file, err)
|
||||||
|
}
|
||||||
|
if v.Cores != tt.cores {
|
||||||
|
t.Errorf("parseDmesgBoot wrong core(%s), %v", tt.file, err)
|
||||||
|
}
|
||||||
|
if !common.StringsContains(v.Flags, "fpu") {
|
||||||
|
t.Errorf("parseDmesgBoot fail to parse features(%s), %v", tt.file, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testCPUPercent(t *testing.T, percpu bool) {
|
func testCPUPercent(t *testing.T, percpu bool) {
|
||||||
numcpu := runtime.NumCPU()
|
numcpu := runtime.NumCPU()
|
||||||
testCount := 3
|
testCount := 3
|
||||||
|
43
cpu/expected/freebsd/1cpu_2core.txt
Normal file
43
cpu/expected/freebsd/1cpu_2core.txt
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Copyright (c) 1992-2016 The FreeBSD Project.
|
||||||
|
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
|
||||||
|
The Regents of the University of California. All rights reserved.
|
||||||
|
FreeBSD is a registered trademark of The FreeBSD Foundation.
|
||||||
|
FreeBSD 11.0-RELEASE-p2 #0: Mon Oct 24 06:55:27 UTC 2016
|
||||||
|
root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
|
||||||
|
FreeBSD clang version 3.8.0 (tags/RELEASE_380/final 262564) (based on LLVM 3.8.0)
|
||||||
|
VT(vga): resolution 640x480
|
||||||
|
CPU: Intel(R) Core(TM) i3 CPU 550 @ 3.20GHz (3192.07-MHz K8-class CPU)
|
||||||
|
Origin="GenuineIntel" Id=0x20655 Family=0x6 Model=0x25 Stepping=5
|
||||||
|
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
|
||||||
|
Features2=0x9ae3bd<SSE3,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,POPCNT>
|
||||||
|
AMD Features=0x28100800<SYSCALL,NX,RDTSCP,LM>
|
||||||
|
AMD Features2=0x1<LAHF>
|
||||||
|
VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID
|
||||||
|
TSC: P-state invariant, performance statistics
|
||||||
|
real memory = 8589934592 (8192 MB)
|
||||||
|
avail memory = 8046452736 (7673 MB)
|
||||||
|
Event timer "LAPIC" quality 600
|
||||||
|
ACPI APIC Table: <INTEL DH55HC >
|
||||||
|
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
|
||||||
|
FreeBSD/SMP: 1 package(s) x 2 core(s) x 2 hardware threads
|
||||||
|
random: unblocking device.
|
||||||
|
ioapic0 <Version 2.0> irqs 0-23 on motherboard
|
||||||
|
random: entropy device external interface
|
||||||
|
kbd1 at kbdmux0
|
||||||
|
netmap: loaded module
|
||||||
|
module_register_init: MOD_LOAD (vesa, 0xffffffff8101c970, 0) error 19
|
||||||
|
vtvga0: <VT VGA driver> on motherboard
|
||||||
|
cryptosoft0: <software crypto> on motherboard
|
||||||
|
aesni0: No AESNI support.
|
||||||
|
acpi0: <INTEL DH55HC> on motherboard
|
||||||
|
acpi0: Power Button (fixed)
|
||||||
|
cpu0: <ACPI CPU> on acpi0
|
||||||
|
ACPI BIOS Warning (bug): Incorrect checksum in table [SSDT] - 0x3F, should be 0x1F (20160527/tbprint-229)
|
||||||
|
cpu1: <ACPI CPU> on acpi0
|
||||||
|
cpu2: <ACPI CPU> on acpi0
|
||||||
|
cpu3: <ACPI CPU> on acpi0
|
||||||
|
attimer0: <AT timer> port 0x40-0x43 irq 0 on acpi0
|
||||||
|
Timecounter "i8254" frequency 1193182 Hz quality 0
|
||||||
|
Event timer "i8254" frequency 1193182 Hz quality 100
|
||||||
|
atrtc0: <AT realtime clock> port 0x70-0x71 irq 8 on acpi0
|
||||||
|
Event timer "RTC" frequency 32768 Hz quality 0
|
38
cpu/expected/freebsd/1cpu_4core.txt
Normal file
38
cpu/expected/freebsd/1cpu_4core.txt
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
Copyright (c) 1992-2016 The FreeBSD Project.
|
||||||
|
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
|
||||||
|
The Regents of the University of California. All rights reserved.
|
||||||
|
FreeBSD is a registered trademark of The FreeBSD Foundation.
|
||||||
|
FreeBSD 10.3-RELEASE-p4 #0: Sat May 28 12:23:44 UTC 2016
|
||||||
|
root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
|
||||||
|
FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512
|
||||||
|
CPU: Intel(R) Xeon(R) CPU E5-1620 v2 @ 3.70GHz (3700.09-MHz K8-class CPU)
|
||||||
|
Origin="GenuineIntel" Id=0x306e4 Family=0x6 Model=0x3e Stepping=4
|
||||||
|
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
|
||||||
|
Features2=0x7fbee3ff<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,PCID,DCA,SSE4.1,SSE4.2,x2APIC,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND>
|
||||||
|
AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM>
|
||||||
|
AMD Features2=0x1<LAHF>
|
||||||
|
Structured Extended Features=0x281<FSGSBASE,SMEP,ERMS>
|
||||||
|
XSAVE Features=0x1<XSAVEOPT>
|
||||||
|
VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID,VID,PostIntr
|
||||||
|
TSC: P-state invariant, performance statistics
|
||||||
|
real memory = 34368126976 (32776 MB)
|
||||||
|
avail memory = 33228333056 (31689 MB)
|
||||||
|
Event timer "LAPIC" quality 600
|
||||||
|
ACPI APIC Table: < >
|
||||||
|
FreeBSD/SMP: Multiprocessor System Detected: 8 CPUs
|
||||||
|
FreeBSD/SMP: 1 package(s) x 4 core(s) x 2 SMT threads
|
||||||
|
cpu0 (BSP): APIC ID: 0
|
||||||
|
cpu1 (AP): APIC ID: 1
|
||||||
|
cpu2 (AP): APIC ID: 2
|
||||||
|
cpu3 (AP): APIC ID: 3
|
||||||
|
cpu4 (AP): APIC ID: 4
|
||||||
|
cpu5 (AP): APIC ID: 5
|
||||||
|
cpu6 (AP): APIC ID: 6
|
||||||
|
cpu7 (AP): APIC ID: 7
|
||||||
|
random: <Software, Yarrow> initialized
|
||||||
|
ioapic0 <Version 2.0> irqs 0-23 on motherboard
|
||||||
|
ioapic1 <Version 2.0> irqs 24-47 on motherboard
|
||||||
|
kbd1 at kbdmux0
|
||||||
|
cryptosoft0: <software crypto> on motherboard
|
||||||
|
aesni0: <AES-CBC,AES-XTS> on motherboard
|
||||||
|
acpi0: <SUPERM SMCI--MB> on motherboard
|
45
cpu/expected/freebsd/2cpu_4core.txt
Normal file
45
cpu/expected/freebsd/2cpu_4core.txt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
Copyright (c) 1992-2011 The FreeBSD Project.
|
||||||
|
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
|
||||||
|
The Regents of the University of California. All rights reserved.
|
||||||
|
FreeBSD is a registered trademark of The FreeBSD Foundation.
|
||||||
|
FreeBSD 8.2-RELEASE #1: Sat Mar 5 23:03:14 CET 2011
|
||||||
|
root@host1:/usr/obj/usr/src/sys/MYKERNEL amd64
|
||||||
|
Timecounter "i8254" frequency 1193182 Hz quality 0
|
||||||
|
CPU: Intel(R) Xeon(R) CPU E5420 @ 2.50GHz (2500.11-MHz K8-class CPU)
|
||||||
|
Origin = "GenuineIntel" Id = 0x10676 Family = 6 Model = 17 Stepping = 6
|
||||||
|
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
|
||||||
|
Features2=0xce3bd<SSE3,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,DCA,SSE4.1>
|
||||||
|
AMD Features=0x20100800<SYSCALL,NX,LM>
|
||||||
|
AMD Features2=0x1<LAHF>
|
||||||
|
TSC: P-state invariant
|
||||||
|
real memory = 17179869184 (16384 MB)
|
||||||
|
avail memory = 16531587072 (15765 MB)
|
||||||
|
ACPI APIC Table: <PTLTD APIC >
|
||||||
|
FreeBSD/SMP: Multiprocessor System Detected: 8 CPUs
|
||||||
|
FreeBSD/SMP: 2 package(s) x 4 core(s)
|
||||||
|
cpu0 (BSP): APIC ID: 0
|
||||||
|
cpu1 (AP): APIC ID: 1
|
||||||
|
cpu2 (AP): APIC ID: 2
|
||||||
|
cpu3 (AP): APIC ID: 3
|
||||||
|
cpu4 (AP): APIC ID: 4
|
||||||
|
cpu5 (AP): APIC ID: 5
|
||||||
|
cpu6 (AP): APIC ID: 6
|
||||||
|
cpu7 (AP): APIC ID: 7
|
||||||
|
ioapic0 <Version 2.0> irqs 0-23 on motherboard
|
||||||
|
ioapic1 <Version 2.0> irqs 24-47 on motherboard
|
||||||
|
kbd1 at kbdmux0
|
||||||
|
acpi0: <PTLTD XSDT> on motherboard
|
||||||
|
acpi0: [ITHREAD]
|
||||||
|
acpi0: Power Button (fixed)
|
||||||
|
unknown: I/O range not supported
|
||||||
|
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
|
||||||
|
acpi_timer0: <24-bit timer at 3.579545MHz> port 0x1008-0x100b on acpi0
|
||||||
|
cpu0: <ACPI CPU> on acpi0
|
||||||
|
cpu1: <ACPI CPU> on acpi0
|
||||||
|
cpu2: <ACPI CPU> on acpi0
|
||||||
|
cpu3: <ACPI CPU> on acpi0
|
||||||
|
cpu4: <ACPI CPU> on acpi0
|
||||||
|
cpu5: <ACPI CPU> on acpi0
|
||||||
|
cpu6: <ACPI CPU> on acpi0
|
||||||
|
cpu7: <ACPI CPU> on acpi0
|
||||||
|
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
|
Loading…
x
Reference in New Issue
Block a user