mirror of
https://github.com/ClusterCockpit/cc-metric-collector.git
synced 2024-12-27 07:39:05 +01:00
Add caching
This commit is contained in:
parent
2dc78ee0aa
commit
3ac1ada204
@ -20,6 +20,12 @@ const (
|
|||||||
PROCFS_CPUINFO = `/proc/cpuinfo`
|
PROCFS_CPUINFO = `/proc/cpuinfo`
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var cache struct {
|
||||||
|
SocketList []int
|
||||||
|
HwthreadList []int
|
||||||
|
CoreList []int
|
||||||
|
}
|
||||||
|
|
||||||
// fileToInt reads an integer value from a file
|
// fileToInt reads an integer value from a file
|
||||||
// In case of an error -1 is returned
|
// In case of an error -1 is returned
|
||||||
// Used internally for sysfs file reads
|
// Used internally for sysfs file reads
|
||||||
@ -39,61 +45,68 @@ func fileToInt(path string) int {
|
|||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
// SocketList gets the list of CPU socket IDs
|
func initSocketHwthreadCoreList() {
|
||||||
func SocketList() []int {
|
|
||||||
|
|
||||||
file, err := os.Open(string(PROCFS_CPUINFO))
|
file, err := os.Open(string(PROCFS_CPUINFO))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
packs := make([]int, 0)
|
|
||||||
scanner := bufio.NewScanner(file)
|
scanner := bufio.NewScanner(file)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Text()
|
lineSplit := strings.Split(scanner.Text(), ":")
|
||||||
if strings.HasPrefix(line, "physical id") {
|
if len(lineSplit) == 2 {
|
||||||
lv := strings.Fields(line)
|
key := strings.TrimSpace(lineSplit[0])
|
||||||
id, err := strconv.Atoi(lv[3])
|
value := strings.TrimSpace(lineSplit[1])
|
||||||
if err != nil {
|
switch key {
|
||||||
log.Print(err)
|
case "physical id":
|
||||||
return nil
|
id, err := strconv.Atoi(value)
|
||||||
}
|
if err != nil {
|
||||||
if found := slices.Contains(packs, id); !found {
|
log.Print(err)
|
||||||
packs = append(packs, id)
|
return
|
||||||
|
}
|
||||||
|
if found := slices.Contains(cache.SocketList, id); !found {
|
||||||
|
cache.SocketList = append(cache.SocketList, id)
|
||||||
|
}
|
||||||
|
case "processor":
|
||||||
|
id, err := strconv.Atoi(value)
|
||||||
|
if err != nil {
|
||||||
|
log.Print(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if found := slices.Contains(cache.HwthreadList, id); !found {
|
||||||
|
cache.HwthreadList = append(cache.HwthreadList, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
case "core id":
|
||||||
|
id, err := strconv.Atoi(value)
|
||||||
|
if err != nil {
|
||||||
|
log.Print(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if found := slices.Contains(cache.CoreList, id); !found {
|
||||||
|
cache.CoreList = append(cache.CoreList, id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return packs
|
}
|
||||||
|
|
||||||
|
// SocketList gets the list of CPU socket IDs
|
||||||
|
func SocketList() []int {
|
||||||
|
if cache.SocketList == nil {
|
||||||
|
initSocketHwthreadCoreList()
|
||||||
|
}
|
||||||
|
return slices.Clone(cache.SocketList)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HwthreadList gets the list of hardware thread IDs in the order of listing in /proc/cpuinfo
|
// HwthreadList gets the list of hardware thread IDs in the order of listing in /proc/cpuinfo
|
||||||
func HwthreadList() []int {
|
func HwthreadList() []int {
|
||||||
file, err := os.Open(string(PROCFS_CPUINFO))
|
if cache.HwthreadList == nil {
|
||||||
if err != nil {
|
initSocketHwthreadCoreList()
|
||||||
log.Print(err)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
defer file.Close()
|
return slices.Clone(cache.HwthreadList)
|
||||||
|
|
||||||
cpuList := make([]int, 0)
|
|
||||||
scanner := bufio.NewScanner(file)
|
|
||||||
for scanner.Scan() {
|
|
||||||
line := scanner.Text()
|
|
||||||
if strings.HasPrefix(line, "processor") {
|
|
||||||
lv := strings.Fields(line)
|
|
||||||
id, err := strconv.Atoi(lv[2])
|
|
||||||
if err != nil {
|
|
||||||
log.Print(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if found := slices.Contains(cpuList, id); !found {
|
|
||||||
cpuList = append(cpuList, id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cpuList
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get list of hardware thread IDs in the order of listing in /proc/cpuinfo
|
// Get list of hardware thread IDs in the order of listing in /proc/cpuinfo
|
||||||
@ -104,30 +117,10 @@ func CpuList() []int {
|
|||||||
|
|
||||||
// CoreList gets the list of CPU core IDs in the order of listing in /proc/cpuinfo
|
// CoreList gets the list of CPU core IDs in the order of listing in /proc/cpuinfo
|
||||||
func CoreList() []int {
|
func CoreList() []int {
|
||||||
file, err := os.Open(string(PROCFS_CPUINFO))
|
if cache.CoreList == nil {
|
||||||
if err != nil {
|
initSocketHwthreadCoreList()
|
||||||
log.Print(err)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
defer file.Close()
|
return slices.Clone(cache.CoreList)
|
||||||
|
|
||||||
coreList := make([]int, 0)
|
|
||||||
scanner := bufio.NewScanner(file)
|
|
||||||
for scanner.Scan() {
|
|
||||||
line := scanner.Text()
|
|
||||||
if strings.HasPrefix(line, "core id") {
|
|
||||||
lv := strings.Fields(line)
|
|
||||||
id, err := strconv.Atoi(lv[3])
|
|
||||||
if err != nil {
|
|
||||||
log.Print(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if found := slices.Contains(coreList, id); !found {
|
|
||||||
coreList = append(coreList, id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return coreList
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get list of NUMA node IDs
|
// Get list of NUMA node IDs
|
||||||
|
Loading…
Reference in New Issue
Block a user