Timing Discrepancy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I know that mpstat uses /proc/stat to gather it's data and pidstat uses /proc/<pid>/stat to get it's data so they are kind of looking at different info. The mpstat is looking at the cpustat structure in the kernel and the pidsat is looking at the data inside each task structure.

I get a situation once in a while where things don't seem to add up:

# mpstat -P 4 1
05:34:51 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s 05:34:51 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 525.00 05:34:52 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 533.00 05:34:53 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 508.00 05:34:54 4 0.99 0.00 0.00 0.00 0.00 0.00 0.00 99.01 512.00 05:34:55 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 1010.00 05:34:56 4 0.99 0.00 0.99 0.00 0.99 0.00 0.00 97.03 751.00 05:34:57 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 746.00 05:34:58 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 762.00 05:34:59 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 642.00

# pidstat -p 2358 -p 592 -p 3607 -p 2362 -p 2324 -u  1
05:34:51          PID   %user %system    %CPU   CPU  Command
05:34:52        2358    2.00    0.00    2.00     4  prog1
05:34:52        592    2.00    0.00    2.00     4  prog2
05:34:52        3607   10.00    2.00   12.00     4  prog3
05:34:52        2362    0.00    0.00    0.00     4  prog4
05:34:52        2324    0.00    0.00    0.00     8  prog5

05:34:52          PID   %user %system    %CPU   CPU  Command
05:34:53        2358    0.00    0.00    0.00     4  prog1
05:34:53        592    2.00    0.00    2.00     4  prog2
05:34:53        3607   12.00    3.00   15.00     4  prog3
05:34:53        2362    0.00    0.00    0.00     4  prog4
05:34:53        2324    0.00    0.00    0.00     8  prog5

05:34:53          PID   %user %system    %CPU   CPU  Command
05:34:54        2358    0.00    0.00    0.00     4  prog1
05:34:54        592    6.00    1.00    7.00     4  prog2
05:34:54        3607    7.00    2.00    9.00     4  prog3
05:34:54        2362    0.00    0.00    0.00     4  prog4
05:34:54        2324    0.00    0.00    0.00     8  prog5

05:34:54          PID   %user %system    %CPU   CPU  Command
05:34:55        2358    0.00    0.00    0.00     4  prog1
05:34:55        592    2.00    1.00    3.00     4  prog2
05:34:55        3607   10.00    3.00   13.00     4  prog3
05:34:55        2362    0.00    0.00    0.00     4  prog4
05:34:55        2324    0.00    0.00    0.00     8  prog5

05:34:55          PID   %user %system    %CPU   CPU  Command
05:34:56        2358    0.00    1.00    1.00     4  prog1
05:34:56        592    7.00    0.00    7.00     4  prog2
05:34:56        3607   12.00    2.00   14.00     4  prog3
05:34:56        2362    0.00    0.00    0.00     4  prog4
05:34:56        2324    0.00    0.00    0.00     8  prog5

05:34:56          PID   %user %system    %CPU   CPU  Command
05:34:57        2358    0.00    0.00    0.00     4  prog1
05:34:57        592    1.00    1.00    2.00     4  prog2
05:34:57        3607   15.00    3.00   18.00     4  prog3
05:34:57        2362    0.00    0.00    0.00     4  prog4
05:34:57        2324    0.00    0.00    0.00     8  prog5

05:34:57          PID   %user %system    %CPU   CPU  Command
05:34:58        2358    2.00    0.00    2.00     4  prog1
05:34:58        592    5.00    1.00    6.00     4  prog2
05:34:58        3607   11.00    3.00   14.00     4  prog3
05:34:58        2362    0.00    0.00    0.00     4  prog4
05:34:58        2324    0.00    0.00    0.00     8  prog5

These processes are tied to processor 4.

You'll see that mpstat shows 0% user while prog3 shows as much as 10% or 12% in some of the corresponding intervals. From looking in the kernel is seems this routine increments both the task utime used by pidstat and the cpustat used by mpstat.

/*
 * Account user cpu time to a process.
 * @p: the process that the cpu time gets accounted to
 * @cputime: the cpu time spent in user space since the last update
 */
void account_user_time(struct task_struct *p, cputime_t cputime)
{
        struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
        cputime64_t tmp;

        p->utime = cputime_add(p->utime, cputime);

        /* Add user time to cpustat. */
        tmp = cputime_to_cputime64(cputime);
        if (TASK_NICE(p) > 0)
                cpustat->nice = cputime64_add(cpustat->nice, tmp);
        else
                cpustat->user = cputime64_add(cpustat->user, tmp);
        /* Account for user time used */
        acct_update_integrals(p);
}

This essentially gets called from tick_periodic(), which I assume gets called each tick, from the update_process_times() routine which calls the account_process_tick() routine which calls the above routine, if it's in userspace at the tim eof the tick or a corresponding account_system_time() routine if it is in the kernel at the time of the tick.

I believe the p->utime = sputime_add() increments the task structure that pidstat uses and cpustat->user|nice = cputime64_add() increments the cpustat that mpstat looks at. This seems like the only palce in the kernel where the task utime gets incemented or the cpustat user time gets incremented.

The data shows that the specific process times are as much as 10% but the overall is 0%.

How can this happen if these get incremented together in this one place?

What am I missing ?

Thanks
Chris Kottaridis

--
users mailing list
users@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe or change subscription options:
https://admin.fedoraproject.org/mailman/listinfo/users
Guidelines: http://fedoraproject.org/wiki/Mailing_list_guidelines
Have a question? Ask away: http://ask.fedoraproject.org


[Index of Archives]     [Older Fedora Users]     [Fedora Announce]     [Fedora Package Announce]     [EPEL Announce]     [EPEL Devel]     [Fedora Magazine]     [Fedora Summer Coding]     [Fedora Laptop]     [Fedora Cloud]     [Fedora Advisory Board]     [Fedora Education]     [Fedora Security]     [Fedora Scitech]     [Fedora Robotics]     [Fedora Infrastructure]     [Fedora Websites]     [Anaconda Devel]     [Fedora Devel Java]     [Fedora Desktop]     [Fedora Fonts]     [Fedora Marketing]     [Fedora Management Tools]     [Fedora Mentors]     [Fedora Package Review]     [Fedora R Devel]     [Fedora PHP Devel]     [Kickstart]     [Fedora Music]     [Fedora Packaging]     [Fedora SELinux]     [Fedora Legal]     [Fedora Kernel]     [Fedora OCaml]     [Coolkey]     [Virtualization Tools]     [ET Management Tools]     [Yum Users]     [Yosemite News]     [Gnome Users]     [KDE Users]     [Fedora Art]     [Fedora Docs]     [Fedora Sparc]     [Libvirt Users]     [Fedora ARM]

  Powered by Linux