mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
374 lines
14 KiB
Go
374 lines
14 KiB
Go
package linux
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type VMStat struct {
|
|
NrFreePages uint64 `json:"nr_free_pages"`
|
|
NrAllocBatch uint64 `json:"nr_alloc_batch"`
|
|
NrInactiveAnon uint64 `json:"nr_inactive_anon"`
|
|
NrActiveAnon uint64 `json:"nr_active_anon"`
|
|
NrInactiveFile uint64 `json:"nr_inactive_file"`
|
|
NrActiveFile uint64 `json:"nr_active_file"`
|
|
NrUnevictable uint64 `json:"nr_unevictable"`
|
|
NrMlock uint64 `json:"nr_mlock"`
|
|
NrAnonPages uint64 `json:"nr_anon_pages"`
|
|
NrMapped uint64 `json:"nr_mapped"`
|
|
NrFilePages uint64 `json:"nr_file_pages"`
|
|
NrDirty uint64 `json:"nr_dirty"`
|
|
NrWriteback uint64 `json:"nr_writeback"`
|
|
NrSlabReclaimable uint64 `json:"nr_slab_reclaimable"`
|
|
NrSlabUnreclaimable uint64 `json:"nr_slab_unreclaimable"`
|
|
NrPageTablePages uint64 `json:"nr_page_table_pages"`
|
|
NrKernelStack uint64 `json:"nr_kernel_stack"`
|
|
NrUnstable uint64 `json:"nr_unstable"`
|
|
NrBounce uint64 `json:"nr_bounce"`
|
|
NrVmscanWrite uint64 `json:"nr_vmscan_write"`
|
|
NrVmscanImmediateReclaim uint64 `json:"nr_vmscan_immediate_reclaim"`
|
|
NrWritebackTemp uint64 `json:"nr_writeback_temp"`
|
|
NrIsolatedAnon uint64 `json:"nr_isolated_anon"`
|
|
NrIsolatedFile uint64 `json:"nr_isolated_file"`
|
|
NrShmem uint64 `json:"nr_shmem"`
|
|
NrDirtied uint64 `json:"nr_dirtied"`
|
|
NrWritten uint64 `json:"nr_written"`
|
|
NumaHit uint64 `json:"numa_hit"`
|
|
NumaMiss uint64 `json:"numa_miss"`
|
|
NumaForeign uint64 `json:"numa_foreign"`
|
|
NumaInterleave uint64 `json:"numa_interleave"`
|
|
NumaLocal uint64 `json:"numa_local"`
|
|
NumaOther uint64 `json:"numa_other"`
|
|
WorkingsetRefault uint64 `json:"workingset_refault"`
|
|
WorkingsetActivate uint64 `json:"workingset_activate"`
|
|
WorkingsetNodereclaim uint64 `json:"workingset_nodereclaim"`
|
|
NrAnonTransparentHugepages uint64 `json:"nr_anon_transparent_hugepages"`
|
|
NrFreeCma uint64 `json:"nr_free_cma"`
|
|
NrDirtyThreshold uint64 `json:"nr_dirty_threshold"`
|
|
NrDirtyBackgroundThreshold uint64 `json:"nr_dirty_background_threshold"`
|
|
PagePagein uint64 `json:"pgpgin"`
|
|
PagePageout uint64 `json:"pgpgout"`
|
|
PageSwapin uint64 `json:"pswpin"`
|
|
PageSwapout uint64 `json:"pswpout"`
|
|
PageAllocDMA uint64 `json:"pgalloc_dma"`
|
|
PageAllocDMA32 uint64 `json:"pgalloc_dma32"`
|
|
PageAllocNormal uint64 `json:"pgalloc_normal"`
|
|
PageAllocMovable uint64 `json:"pgalloc_movable"`
|
|
PageFree uint64 `json:"pgfree"`
|
|
PageActivate uint64 `json:"pgactivate"`
|
|
PageDeactivate uint64 `json:"pgdeactivate"`
|
|
PageFault uint64 `json:"pgfault"`
|
|
PageMajorFault uint64 `json:"pgmajfault"`
|
|
PageRefillDMA uint64 `json:"pgrefill_dma"`
|
|
PageRefillDMA32 uint64 `json:"pgrefill_dma32"`
|
|
PageRefillMormal uint64 `json:"pgrefill_normal"`
|
|
PageRefillMovable uint64 `json:"pgrefill_movable"`
|
|
PageStealKswapdDMA uint64 `json:"pgsteal_kswapd_dma"`
|
|
PageStealKswapdDMA32 uint64 `json:"pgsteal_kswapd_dma32"`
|
|
PageStealKswapdNormal uint64 `json:"pgsteal_kswapd_normal"`
|
|
PageStealKswapdMovable uint64 `json:"pgsteal_kswapd_movable"`
|
|
PageStealDirectDMA uint64 `json:"pgsteal_direct_dma"`
|
|
PageStealDirectDMA32 uint64 `json:"pgsteal_direct_dma32"`
|
|
PageStealDirectNormal uint64 `json:"pgsteal_direct_normal"`
|
|
PageStealDirectMovable uint64 `json:"pgsteal_direct_movable"`
|
|
PageScanKswapdDMA uint64 `json:"pgscan_kswapd_dma"`
|
|
PageScanKswapdDMA32 uint64 `json:"pgscan_kswapd_dma32"`
|
|
PageScanKswapdNormal uint64 `json:"pgscan_kswapd_normal"`
|
|
PageScanKswapdMovable uint64 `json:"pgscan_kswapd_movable"`
|
|
PageScanDirectDMA uint64 `json:"pgscan_direct_dma"`
|
|
PageScanDirectDMA32 uint64 `json:"pgscan_direct_dma32"`
|
|
PageScanDirectNormal uint64 `json:"pgscan_direct_normal"`
|
|
PageScanDirectMovable uint64 `json:"pgscan_direct_movable"`
|
|
PageScanDirectThrottle uint64 `json:"pgscan_direct_throttle"`
|
|
ZoneReclaimFailed uint64 `json:"zone_reclaim_failed"`
|
|
PageInodeSteal uint64 `json:"pginodesteal"`
|
|
SlabsScanned uint64 `json:"slabs_scanned"`
|
|
KswapdInodesteal uint64 `json:"kswapd_inodesteal"`
|
|
KswapdLowWatermarkHitQuickly uint64 `json:"kswapd_low_wmark_hit_quickly"`
|
|
KswapdHighWatermarkHitQuickly uint64 `json:"kswapd_high_wmark_hit_quickly"`
|
|
PageoutRun uint64 `json:"pageoutrun"`
|
|
AllocStall uint64 `json:"allocstall"`
|
|
PageRotated uint64 `json:"pgrotated"`
|
|
DropPagecache uint64 `json:"drop_pagecache"`
|
|
DropSlab uint64 `json:"drop_slab"`
|
|
NumaPteUpdates uint64 `json:"numa_pte_updates"`
|
|
NumaHugePteUpdates uint64 `json:"numa_huge_pte_updates"`
|
|
NumaHintFaults uint64 `json:"numa_hint_faults"`
|
|
NumaHintFaults_local uint64 `json:"numa_hint_faults_local"`
|
|
NumaPagesMigrated uint64 `json:"numa_pages_migrated"`
|
|
PageMigrateSuccess uint64 `json:"pgmigrate_success"`
|
|
PageMigrateFail uint64 `json:"pgmigrate_fail"`
|
|
CompactMigrateScanned uint64 `json:"compact_migrate_scanned"`
|
|
CompactFreeScanned uint64 `json:"compact_free_scanned"`
|
|
CompactIsolated uint64 `json:"compact_isolated"`
|
|
CompactStall uint64 `json:"compact_stall"`
|
|
CompactFail uint64 `json:"compact_fail"`
|
|
CompactSuccess uint64 `json:"compact_success"`
|
|
HtlbBuddyAllocSuccess uint64 `json:"htlb_buddy_alloc_success"`
|
|
HtlbBuddyAllocFail uint64 `json:"htlb_buddy_alloc_fail"`
|
|
UnevictablePagesCulled uint64 `json:"unevictable_pgs_culled"`
|
|
UnevictablePagesScanned uint64 `json:"unevictable_pgs_scanned"`
|
|
UnevictablePagesRescued uint64 `json:"unevictable_pgs_rescued"`
|
|
UnevictablePagesMlocked uint64 `json:"unevictable_pgs_mlocked"`
|
|
UnevictablePagesMunlocked uint64 `json:"unevictable_pgs_munlocked"`
|
|
UnevictablePagesCleared uint64 `json:"unevictable_pgs_cleared"`
|
|
UnevictablePagesStranded uint64 `json:"unevictable_pgs_stranded"`
|
|
THPFaultAlloc uint64 `json:"thp_fault_alloc"`
|
|
THPFaultFallback uint64 `json:"thp_fault_fallback"`
|
|
THPCollapseAlloc uint64 `json:"thp_collapse_alloc"`
|
|
THPCollapseAllocFailed uint64 `json:"thp_collapse_alloc_failed"`
|
|
THPSplit uint64 `json:"thp_split"`
|
|
THPZeroPageAlloc uint64 `json:"thp_zero_page_alloc"`
|
|
THPZeroPageAllocFailed uint64 `json:"thp_zero_page_alloc_failed"`
|
|
}
|
|
|
|
func ReadVMStat(path string) (*VMStat, error) {
|
|
b, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
content := string(b)
|
|
lines := strings.Split(content, "\n")
|
|
vmstat := VMStat{}
|
|
for _, line := range lines {
|
|
fields := strings.Fields(line)
|
|
if len(fields) != 2 {
|
|
continue
|
|
}
|
|
name := fields[0]
|
|
value, _ := strconv.ParseUint(fields[1], 10, 64)
|
|
switch name {
|
|
case "nr_free_pages":
|
|
vmstat.NrFreePages = value
|
|
case "nr_alloc_batch":
|
|
vmstat.NrAllocBatch = value
|
|
case "nr_inactive_anon":
|
|
vmstat.NrInactiveAnon = value
|
|
case "nr_active_anon":
|
|
vmstat.NrActiveAnon = value
|
|
case "nr_inactive_file":
|
|
vmstat.NrInactiveFile = value
|
|
case "nr_active_file":
|
|
vmstat.NrActiveFile = value
|
|
case "nr_unevictable":
|
|
vmstat.NrUnevictable = value
|
|
case "nr_mlock":
|
|
vmstat.NrMlock = value
|
|
case "nr_anon_pages":
|
|
vmstat.NrAnonPages = value
|
|
case "nr_mapped":
|
|
vmstat.NrMapped = value
|
|
case "nr_file_pages":
|
|
vmstat.NrFilePages = value
|
|
case "nr_dirty":
|
|
vmstat.NrDirty = value
|
|
case "nr_writeback":
|
|
vmstat.NrWriteback = value
|
|
case "nr_slab_reclaimable":
|
|
vmstat.NrSlabReclaimable = value
|
|
case "nr_slab_unreclaimable":
|
|
vmstat.NrSlabUnreclaimable = value
|
|
case "nr_page_table_pages":
|
|
vmstat.NrPageTablePages = value
|
|
case "nr_kernel_stack":
|
|
vmstat.NrKernelStack = value
|
|
case "nr_unstable":
|
|
vmstat.NrUnstable = value
|
|
case "nr_bounce":
|
|
vmstat.NrBounce = value
|
|
case "nr_vmscan_write":
|
|
vmstat.NrVmscanWrite = value
|
|
case "nr_vmscan_immediate_reclaim":
|
|
vmstat.NrVmscanImmediateReclaim = value
|
|
case "nr_writeback_temp":
|
|
vmstat.NrWritebackTemp = value
|
|
case "nr_isolated_anon":
|
|
vmstat.NrIsolatedAnon = value
|
|
case "nr_isolated_file":
|
|
vmstat.NrIsolatedFile = value
|
|
case "nr_shmem":
|
|
vmstat.NrShmem = value
|
|
case "nr_dirtied":
|
|
vmstat.NrDirtied = value
|
|
case "nr_written":
|
|
vmstat.NrWritten = value
|
|
case "numa_hit":
|
|
vmstat.NumaHit = value
|
|
case "numa_miss":
|
|
vmstat.NumaMiss = value
|
|
case "numa_foreign":
|
|
vmstat.NumaForeign = value
|
|
case "numa_interleave":
|
|
vmstat.NumaInterleave = value
|
|
case "numa_local":
|
|
vmstat.NumaLocal = value
|
|
case "numa_other":
|
|
vmstat.NumaOther = value
|
|
case "workingset_refault":
|
|
vmstat.WorkingsetRefault = value
|
|
case "workingset_activate":
|
|
vmstat.WorkingsetActivate = value
|
|
case "workingset_nodereclaim":
|
|
vmstat.WorkingsetNodereclaim = value
|
|
case "nr_anon_transparent_hugepages":
|
|
vmstat.NrAnonTransparentHugepages = value
|
|
case "nr_free_cma":
|
|
vmstat.NrFreeCma = value
|
|
case "nr_dirty_threshold":
|
|
vmstat.NrDirtyThreshold = value
|
|
case "nr_dirty_background_threshold":
|
|
vmstat.NrDirtyBackgroundThreshold = value
|
|
case "pgpgin":
|
|
vmstat.PagePagein = value
|
|
case "pgpgout":
|
|
vmstat.PagePageout = value
|
|
case "pswpin":
|
|
vmstat.PageSwapin = value
|
|
case "pswpout":
|
|
vmstat.PageSwapout = value
|
|
case "pgalloc_dma":
|
|
vmstat.PageAllocDMA = value
|
|
case "pgalloc_dma32":
|
|
vmstat.PageAllocDMA32 = value
|
|
case "pgalloc_normal":
|
|
vmstat.PageAllocNormal = value
|
|
case "pgalloc_movable":
|
|
vmstat.PageAllocMovable = value
|
|
case "pgfree":
|
|
vmstat.PageFree = value
|
|
case "pgactivate":
|
|
vmstat.PageActivate = value
|
|
case "pgdeactivate":
|
|
vmstat.PageDeactivate = value
|
|
case "pgfault":
|
|
vmstat.PageFault = value
|
|
case "pgmajfault":
|
|
vmstat.PageMajorFault = value
|
|
case "pgrefill_dma":
|
|
vmstat.PageRefillDMA = value
|
|
case "pgrefill_dma32":
|
|
vmstat.PageRefillDMA32 = value
|
|
case "pgrefill_normal":
|
|
vmstat.PageRefillMormal = value
|
|
case "pgrefill_movable":
|
|
vmstat.PageRefillMovable = value
|
|
case "pgsteal_kswapd_dma":
|
|
vmstat.PageStealKswapdDMA = value
|
|
case "pgsteal_kswapd_dma32":
|
|
vmstat.PageStealKswapdDMA32 = value
|
|
case "pgsteal_kswapd_normal":
|
|
vmstat.PageStealKswapdNormal = value
|
|
case "pgsteal_kswapd_movable":
|
|
vmstat.PageStealKswapdMovable = value
|
|
case "pgsteal_direct_dma":
|
|
vmstat.PageStealDirectDMA = value
|
|
case "pgsteal_direct_dma32":
|
|
vmstat.PageStealDirectDMA32 = value
|
|
case "pgsteal_direct_normal":
|
|
vmstat.PageStealDirectNormal = value
|
|
case "pgsteal_direct_movable":
|
|
vmstat.PageStealDirectMovable = value
|
|
case "pgscan_kswapd_dma":
|
|
vmstat.PageScanKswapdDMA = value
|
|
case "pgscan_kswapd_dma32":
|
|
vmstat.PageScanKswapdDMA32 = value
|
|
case "pgscan_kswapd_normal":
|
|
vmstat.PageScanKswapdNormal = value
|
|
case "pgscan_kswapd_movable":
|
|
vmstat.PageScanKswapdMovable = value
|
|
case "pgscan_direct_dma":
|
|
vmstat.PageScanDirectDMA = value
|
|
case "pgscan_direct_dma32":
|
|
vmstat.PageScanDirectDMA32 = value
|
|
case "pgscan_direct_normal":
|
|
vmstat.PageScanDirectNormal = value
|
|
case "pgscan_direct_movable":
|
|
vmstat.PageScanDirectMovable = value
|
|
case "pgscan_direct_throttle":
|
|
vmstat.PageScanDirectThrottle = value
|
|
case "zone_reclaim_failed":
|
|
vmstat.ZoneReclaimFailed = value
|
|
case "pginodesteal":
|
|
vmstat.PageInodeSteal = value
|
|
case "slabs_scanned":
|
|
vmstat.SlabsScanned = value
|
|
case "kswapd_inodesteal":
|
|
vmstat.KswapdInodesteal = value
|
|
case "kswapd_low_wmark_hit_quickly":
|
|
vmstat.KswapdLowWatermarkHitQuickly = value
|
|
case "kswapd_high_wmark_hit_quickly":
|
|
vmstat.KswapdHighWatermarkHitQuickly = value
|
|
case "pageoutrun":
|
|
vmstat.PageoutRun = value
|
|
case "allocstall":
|
|
vmstat.AllocStall = value
|
|
case "pgrotated":
|
|
vmstat.PageRotated = value
|
|
case "drop_pagecache":
|
|
vmstat.DropPagecache = value
|
|
case "drop_slab":
|
|
vmstat.DropSlab = value
|
|
case "numa_pte_updates":
|
|
vmstat.NumaPteUpdates = value
|
|
case "numa_huge_pte_updates":
|
|
vmstat.NumaHugePteUpdates = value
|
|
case "numa_hint_faults":
|
|
vmstat.NumaHintFaults = value
|
|
case "numa_hint_faults_local":
|
|
vmstat.NumaHintFaults_local = value
|
|
case "numa_pages_migrated":
|
|
vmstat.NumaPagesMigrated = value
|
|
case "pgmigrate_success":
|
|
vmstat.PageMigrateSuccess = value
|
|
case "pgmigrate_fail":
|
|
vmstat.PageMigrateFail = value
|
|
case "compact_migrate_scanned":
|
|
vmstat.CompactMigrateScanned = value
|
|
case "compact_free_scanned":
|
|
vmstat.CompactFreeScanned = value
|
|
case "compact_isolated":
|
|
vmstat.CompactIsolated = value
|
|
case "compact_stall":
|
|
vmstat.CompactStall = value
|
|
case "compact_fail":
|
|
vmstat.CompactFail = value
|
|
case "compact_success":
|
|
vmstat.CompactSuccess = value
|
|
case "htlb_buddy_alloc_success":
|
|
vmstat.HtlbBuddyAllocSuccess = value
|
|
case "htlb_buddy_alloc_fail":
|
|
vmstat.HtlbBuddyAllocFail = value
|
|
case "unevictable_pgs_culled":
|
|
vmstat.UnevictablePagesCulled = value
|
|
case "unevictable_pgs_scanned":
|
|
vmstat.UnevictablePagesScanned = value
|
|
case "unevictable_pgs_rescued":
|
|
vmstat.UnevictablePagesRescued = value
|
|
case "unevictable_pgs_mlocked":
|
|
vmstat.UnevictablePagesMlocked = value
|
|
case "unevictable_pgs_munlocked":
|
|
vmstat.UnevictablePagesMunlocked = value
|
|
case "unevictable_pgs_cleared":
|
|
vmstat.UnevictablePagesCleared = value
|
|
case "unevictable_pgs_stranded":
|
|
vmstat.UnevictablePagesStranded = value
|
|
case "thp_fault_alloc":
|
|
vmstat.THPFaultAlloc = value
|
|
case "thp_fault_fallback":
|
|
vmstat.THPFaultFallback = value
|
|
case "thp_collapse_alloc":
|
|
vmstat.THPCollapseAlloc = value
|
|
case "thp_collapse_alloc_failed":
|
|
vmstat.THPCollapseAllocFailed = value
|
|
case "thp_split":
|
|
vmstat.THPSplit = value
|
|
case "thp_zero_page_alloc":
|
|
vmstat.THPZeroPageAlloc = value
|
|
case "thp_zero_page_alloc_failed":
|
|
vmstat.THPZeroPageAllocFailed = value
|
|
}
|
|
}
|
|
return &vmstat, nil
|
|
}
|