Maison >développement back-end >Golang >Extraire la mémoire et échanger les informations de /proc/meminfo dans Golang

Extraire la mémoire et échanger les informations de /proc/meminfo dans Golang

王林
王林avant
2024-02-12 18:24:09395parcourir

从 Golang 中的 /proc/meminfo 中提取内存和交换信息

L'éditeur de PHP, Strawberry, va vous présenter aujourd'hui une méthode très pratique, qui consiste à extraire de la mémoire et à échanger des informations depuis /proc/meminfo en Golang. Au cours du processus de développement de Golang, nous avons souvent besoin d'obtenir la mémoire du système et d'échanger des informations afin d'effectuer certaines opérations d'optimisation des performances ou de gestion des ressources. /proc/meminfo est un fichier qui enregistre la mémoire système et les informations d'échange. Nous pouvons obtenir les informations requises en lisant ce fichier. Ensuite, je présenterai en détail comment utiliser Golang pour extraire la mémoire et échanger des informations dans /proc/meminfo. J'espère que cela vous sera utile.

Contenu de la question

Je souhaite extraire les valeurs de memtotal, memfree, memavailable, swaptotal et swapfree de /proc/meminfo dans golang. Le plus proche que j'ai obtenu jusqu'à présent est d'utiliser fmt.sscanf() qui me donnera la valeur que je veux une à la fois, mais j'obtiens également beaucoup de lignes de sortie avec des zéros. Voici le code que j'utilise :

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    f, e := os.open("/proc/meminfo")
    if e != nil {
        panic(e)
    }
    defer f.close()
    s := bufio.newscanner(f)
    for s.scan() {
        var n int
        fmt.sscanf(s.text(), "memfree: %d kb", &n)
        fmt.println(n)
    }
}

Cela me donne le résultat suivant :

0
11260616
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

Alors première question, existe-t-il un moyen de limiter le résultat à une valeur (non nulle) que je souhaite ? Ou existe-t-il une meilleure façon de résoudre ce problème ?

Mon fichier /proc/meminfo ressemble à ceci :

MemTotal:       16314336 kB
MemFree:        11268004 kB
MemAvailable:   13955820 kB
Buffers:          330284 kB
Cached:          2536848 kB
SwapCached:            0 kB
Active:          1259348 kB
Inactive:        3183140 kB
Active(anon):       4272 kB
Inactive(anon):  1578028 kB
Active(file):    1255076 kB
Inactive(file):  1605112 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4194304 kB
SwapFree:        4194304 kB
Dirty:                96 kB
Writeback:             0 kB
AnonPages:       1411704 kB
Mapped:           594408 kB
Shmem:              6940 kB
KReclaimable:     151936 kB
Slab:             253384 kB
SReclaimable:     151936 kB
SUnreclaim:       101448 kB
KernelStack:       17184 kB
PageTables:        25060 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    12351472 kB
Committed_AS:    6092984 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       40828 kB
VmallocChunk:          0 kB
Percpu:             5696 kB
AnonHugePages:    720896 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      230400 kB
DirectMap2M:    11235328 kB
DirectMap1G:    14680064 kB

Solution

Notez que s.Scan() 逐行读取输入。如果某行与给 fmt.Sscanf 的格式字符串不匹配,则程序将输出 0 作为 var n int est déclaré dans une boucle. Ma suggestion est de vérifier le premier résultat renvoyé par fmt.Sscanf`, qui est le nombre d'éléments correspondants. Donc, si le premier résultat est 1, cela signifie qu'il y a une correspondance et que cette valeur peut être affichée. Voir un exemple fonctionnel ici : https://www.php.cn/link/25d0a45ccd9e33b6b1ef8760801b6841 p>

EDIT : j’ai essayé d’être aussi proche que possible de votre code. Il peut y avoir d'autres problèmes car les unités de mesure utilisées peuvent varier selon la page de manuel. Cependant, si la valeur pertinente sur votre système est toujours affichée en « Ko », cela peut suffire pour votre cas d'utilisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer