Method: LinuxStat::CPU.stat
- Defined in:
- lib/linux_stat/cpu.rb
.stat(sleep = ticks_to_ms_t5) ⇒ Object Also known as: usages
stat(sleep = 1.0 / LinuxStat::Sysconf.sc_clk_tck * 5)
Where sleep is the delay to gather the data.
The minimum possible value at anytime is 1.0 / LinuxStat::Sysconf.sc_clk_tck
This method returns the cpu usage of all threads.
The first one is aggregated CPU usage reported by the Linux kernel.
And the consecutive ones are the real core usages.
For example, on a system with 4 threads:
LinuxStat::CPU.stat
=> {0=>84.38, 1=>100.0, 2=>50.0, 3=>87.5, 4=>87.5}
If the information is not available, it will return an empty Hash
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/linux_stat/cpu.rb', line 23 def stat(sleep = ticks_to_ms_t5) return {} unless stat? data = IO.readlines('/proc/stat'.freeze).select { |x| x[/^cpu\d*/] }.map! { |x| x.split.map!(&:to_f) } sleep(sleep) data2 = IO.readlines('/proc/stat'.freeze).select { |x| x[/^cpu\d*/] }.map! { |x| x.split.map!(&:to_f) } # On devices like android, the core count can change anytime (hotplugging). # I had crashes on Termux. # So better just count the min number of CPU and iterate over that # If data.length is smaller than data2.length, we don't have enough data to compare. dl, d2l = data.length, data2.length min = dl > d2l ? d2l : dl min.times.reduce({}) do |h, x| user, nice, sys, idle, iowait, irq, softirq, steal = *data[x].drop(1) user2, nice2, sys2, idle2, iowait2, irq2, softirq2, steal2 = *data2[x].drop(1) idle_then, idle_now = idle + iowait, idle2 + iowait2 totald = idle_now.+(user2 + nice2 + sys2 + irq2 + softirq2 + steal2) - idle_then.+(user + nice + sys + irq + softirq + steal) res = totald.-(idle_now - idle_then).fdiv(totald).abs.*(100) res = res.nan? ? 0.0 : res > 100 ? 100.0 : res.round(2) h.merge!( x => res ) end end |