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