@@ -214,58 +214,63 @@ impl Sampler {
214214 }
215215
216216 pub fn get_metrics ( & mut self , duration : u64 ) -> WithError < Metrics > {
217- let mut rs = Metrics :: default ( ) ;
218-
219- let mut ecpu_usages = Vec :: new ( ) ;
220- let mut pcpu_usages = Vec :: new ( ) ;
221-
222- for x in self . ior . get_sample ( duration) {
223- // if x.group == "CPU Stats" && x.subgroup == CPU_FREQ_DICE_SUBG {
224- // match x.channel.as_str() {
225- // "ECPU" => rs.ecpu_usage = calc_freq(x.item, &self.soc.ecpu_freqs),
226- // "PCPU" => rs.pcpu_usage = calc_freq(x.item, &self.soc.pcpu_freqs),
227- // _ => {}
228- // }
229- // }
230-
231- if x. group == "CPU Stats" && x. subgroup == CPU_FREQ_CORE_SUBG {
232- if x. channel . contains ( "ECPU" ) {
233- ecpu_usages. push ( calc_freq ( x. item , & self . soc . ecpu_freqs ) ) ;
234- continue ;
217+ let measures: usize = 4 ;
218+ let mut results: Vec < Metrics > = Vec :: with_capacity ( measures) ;
219+
220+ // do several samples to smooth metrics
221+ // see: https://github.com/vladkens/macmon/issues/10
222+ for ( sample, sample_dt) in self . ior . get_samples ( duration, measures) {
223+ let mut ecpu_usages = Vec :: new ( ) ;
224+ let mut pcpu_usages = Vec :: new ( ) ;
225+ let mut rs = Metrics :: default ( ) ;
226+
227+ for x in sample {
228+ if x. group == "CPU Stats" && x. subgroup == CPU_FREQ_CORE_SUBG {
229+ if x. channel . contains ( "ECPU" ) {
230+ ecpu_usages. push ( calc_freq ( x. item , & self . soc . ecpu_freqs ) ) ;
231+ continue ;
232+ }
233+
234+ if x. channel . contains ( "PCPU" ) {
235+ pcpu_usages. push ( calc_freq ( x. item , & self . soc . pcpu_freqs ) ) ;
236+ continue ;
237+ }
235238 }
236239
237- if x. channel . contains ( "PCPU" ) {
238- pcpu_usages. push ( calc_freq ( x. item , & self . soc . pcpu_freqs ) ) ;
239- continue ;
240+ if x. group == "GPU Stats" && x. subgroup == GPU_FREQ_DICE_SUBG {
241+ match x. channel . as_str ( ) {
242+ "GPUPH" => rs. gpu_usage = calc_freq ( x. item , & self . soc . gpu_freqs [ 1 ..] . to_vec ( ) ) ,
243+ _ => { }
244+ }
240245 }
241- }
242246
243- if x. group == "GPU Stats" && x. subgroup == GPU_FREQ_DICE_SUBG {
244- match x. channel . as_str ( ) {
245- "GPUPH" => rs. gpu_usage = calc_freq ( x. item , & self . soc . gpu_freqs [ 1 ..] . to_vec ( ) ) ,
246- _ => { }
247+ if x. group == "Energy Model" {
248+ match x. channel . as_str ( ) {
249+ "CPU Energy" => rs. cpu_power += cfio_watts ( x. item , & x. unit , sample_dt) ?,
250+ "GPU Energy" => rs. gpu_power += cfio_watts ( x. item , & x. unit , sample_dt) ?,
251+ c if c. starts_with ( "ANE" ) => rs. ane_power += cfio_watts ( x. item , & x. unit , sample_dt) ?,
252+ _ => { }
253+ }
247254 }
248255 }
249256
250- if x. group == "Energy Model" {
251- match x. channel . as_str ( ) {
252- "CPU Energy" => rs. cpu_power += cfio_watts ( x. item , & x. unit , duration) ?,
253- "GPU Energy" => rs. gpu_power += cfio_watts ( x. item , & x. unit , duration) ?,
254- c if c. starts_with ( "ANE" ) => rs. ane_power += cfio_watts ( x. item , & x. unit , duration) ?,
255- _ => { }
256- }
257- }
257+ rs. ecpu_usage = calc_freq_final ( & ecpu_usages, & self . soc . ecpu_freqs ) ;
258+ rs. pcpu_usage = calc_freq_final ( & pcpu_usages, & self . soc . pcpu_freqs ) ;
259+ results. push ( rs) ;
258260 }
259261
260- // println!("----------");
261- // println!("{:?}", ecpu_usages);
262- // println!("{:?}", pcpu_usages);
263- // println!("1 {:?} {:?}", rs.ecpu_usage, rs.pcpu_usage);
264- rs. ecpu_usage = calc_freq_final ( & ecpu_usages, & self . soc . ecpu_freqs ) ;
265- rs. pcpu_usage = calc_freq_final ( & pcpu_usages, & self . soc . pcpu_freqs ) ;
266- // println!("2 {:?} {:?}", rs.ecpu_usage, rs.pcpu_usage);
267-
262+ let mut rs = Metrics :: default ( ) ;
263+ rs. ecpu_usage . 0 = zero_div ( results. iter ( ) . map ( |x| x. ecpu_usage . 0 ) . sum ( ) , measures as _ ) ;
264+ rs. ecpu_usage . 1 = zero_div ( results. iter ( ) . map ( |x| x. ecpu_usage . 1 ) . sum ( ) , measures as _ ) ;
265+ rs. pcpu_usage . 0 = zero_div ( results. iter ( ) . map ( |x| x. pcpu_usage . 0 ) . sum ( ) , measures as _ ) ;
266+ rs. pcpu_usage . 1 = zero_div ( results. iter ( ) . map ( |x| x. pcpu_usage . 1 ) . sum ( ) , measures as _ ) ;
267+ rs. gpu_usage . 0 = zero_div ( results. iter ( ) . map ( |x| x. gpu_usage . 0 ) . sum ( ) , measures as _ ) ;
268+ rs. gpu_usage . 1 = zero_div ( results. iter ( ) . map ( |x| x. gpu_usage . 1 ) . sum ( ) , measures as _ ) ;
269+ rs. cpu_power = zero_div ( results. iter ( ) . map ( |x| x. cpu_power ) . sum ( ) , measures as _ ) ;
270+ rs. gpu_power = zero_div ( results. iter ( ) . map ( |x| x. gpu_power ) . sum ( ) , measures as _ ) ;
271+ rs. ane_power = zero_div ( results. iter ( ) . map ( |x| x. ane_power ) . sum ( ) , measures as _ ) ;
268272 rs. all_power = rs. cpu_power + rs. gpu_power + rs. ane_power ;
273+
269274 rs. memory = self . get_mem ( ) ?;
270275 rs. temp = self . get_temp ( ) ?;
271276
0 commit comments