github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/disk_linux.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:39</date>
    10  //</624450098213949440>
    11  
    12  
    13  //包含进程磁盘IO计数器检索的Linux实现。
    14  
    15  package metrics
    16  
    17  import (
    18  	"bufio"
    19  	"fmt"
    20  	"io"
    21  	"os"
    22  	"strconv"
    23  	"strings"
    24  )
    25  
    26  //readdiskstats检索属于当前进程的磁盘IO状态。
    27  func ReadDiskStats(stats *DiskStats) error {
    28  //打开进程磁盘IO计数器文件
    29  	inf, err := os.Open(fmt.Sprintf("/proc/%d/io", os.Getpid()))
    30  	if err != nil {
    31  		return err
    32  	}
    33  	defer inf.Close()
    34  	in := bufio.NewReader(inf)
    35  
    36  //迭代IO计数器,提取我们需要的
    37  	for {
    38  //读取下一行并拆分为键和值
    39  		line, err := in.ReadString('\n')
    40  		if err != nil {
    41  			if err == io.EOF {
    42  				return nil
    43  			}
    44  			return err
    45  		}
    46  		parts := strings.Split(line, ":")
    47  		if len(parts) != 2 {
    48  			continue
    49  		}
    50  		key := strings.TrimSpace(parts[0])
    51  		value, err := strconv.ParseInt(strings.TrimSpace(parts[1]), 10, 64)
    52  		if err != nil {
    53  			return err
    54  		}
    55  
    56  //根据键更新计数器
    57  		switch key {
    58  		case "syscr":
    59  			stats.ReadCount = value
    60  		case "syscw":
    61  			stats.WriteCount = value
    62  		case "rchar":
    63  			stats.ReadBytes = value
    64  		case "wchar":
    65  			stats.WriteBytes = value
    66  		}
    67  	}
    68  }
    69