]> git.proxmox.com Git - mirror_lxcfs.git/commitdiff
Preseve cpu sum in /proc/stat when cpuset changes
authorNguyen Phan Huy <phanhuy1502@gmail.com>
Thu, 27 Jan 2022 11:31:47 +0000 (19:31 +0800)
committerNguyen Phan Huy <nguyenph@sea.com>
Mon, 31 Jan 2022 05:34:50 +0000 (13:34 +0800)
Signed-off-by: Nguyen Phan Huy <phanhuy1502@gmail.com>
.gitignore
src/proc_cpuview.c

index f3af2b694ebe4bbb5091a29612e0943dfd75279a..8c6525f0c0f4901a8c685d083d5cb9873c5ca088 100644 (file)
@@ -19,3 +19,4 @@ lxcfs-*.tar.gz
 *.la
 .vscode
 src/cgroups/.dirstamp
+.idea/
\ No newline at end of file
index 37e9a20886777422e53152446bf06dc79aed0165..8e83174b326cf3ad8ba579fd3bd48fdb1451113c 100644 (file)
@@ -700,10 +700,6 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                        stat_node->view[curcpu].system  += diff[curcpu].system;
                        stat_node->view[curcpu].idle    += diff[curcpu].idle;
 
-                       user_sum        += stat_node->view[curcpu].user;
-                       system_sum      += stat_node->view[curcpu].system;
-                       idle_sum        += stat_node->view[curcpu].idle;
-
                        diff_user       += diff[curcpu].user;
                        diff_system     += diff[curcpu].system;
                        diff_idle       += diff[curcpu].idle;
@@ -716,6 +712,12 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                }
                lxcfs_v("total. diff_user: %" PRIu64 ", diff_system: %" PRIu64 ", diff_idle: %" PRIu64 "\n", diff_user, diff_system, diff_idle);
 
+               for (curcpu = 0; curcpu < nprocs; curcpu++) {
+                       user_sum        += stat_node->view[curcpu].user;
+                       system_sum      += stat_node->view[curcpu].system;
+                       idle_sum        += stat_node->view[curcpu].idle;
+               }
+
                /* revise cpu usage view to support partial cpu case. */
                exact_cpus = exact_cpu_count(cg);
 
@@ -776,21 +778,50 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
        buf_size -= l;
        total_len += l;
 
-       /* Render visible CPUs */
+       /* Render visible CPUs 
+       Assume there are K CPUs: 0, 1, 2, ..., K-1.
+       Among them, there are M online CPUs with index: a1, a2, ... aN ... aM (M >= N)
+       N = max_cpus, M = number of online CPUs
+
+       There will be N rendered cpus, indexed from 0 to N-1, cpu times of the cpus are calculated from those formula:
+       - user_time[0] = stat_node->view[0].user + stat_node->view[1].user + ... + stat_node->view[a1].user
+       - user_time[1] = stat_node->view[a1+1].user + stat_node->view[a1+1].user + ... + stat_node->view[a2].user
+       ...
+       - user_time[N-2] = stat_node->view[a(N-2)+1].user + stat_node->view[a(N-2)+2].user + ... 
+                           + stat_node->view[a(N-1)].user
+       - user_time[N-1] = stat_node->view[a(N-1)+1].user + stat_node->view[a(N-1)+2].user + ...
+                           + stat_node->view[aN] + ... + stat_node->view[K-1] (sum of all remaining CPUs)
+       
+       Similar formula applied for system and idle time
+       */
+
+       uint64_t curcpu_view_user_sum = 0, curcpu_view_system_sum = 0, curcpu_view_idle_sum = 0;
        for (curcpu = 0, i = -1; curcpu < nprocs; curcpu++) {
-               if (!stat_node->usage[curcpu].online)
-                       continue;
+               curcpu_view_user_sum += stat_node->view[curcpu].user;
+               curcpu_view_system_sum += stat_node->view[curcpu].system;
+               curcpu_view_idle_sum += stat_node->view[curcpu].idle;
 
+               if (!stat_node->usage[curcpu].online && curcpu < nprocs - 1) {
+                       continue;
+               }
+               
                i++;
 
-               if (max_cpus > 0 && i == max_cpus)
-                       break;
+               if (max_cpus > 0 && i >= max_cpus) {
+                       // max(i) = count(rendered cpus) = max_cpus - 1
+                       i--;
+               }
+
+               if (max_cpus > 0 && i == max_cpus - 1 && curcpu < nprocs - 1) {
+                       // last 'rendered' cpu, sum until reaches the last cpu
+                       continue;
+               }
 
                l = snprintf(buf, buf_size, "cpu%d %" PRIu64 " 0 %" PRIu64 " %" PRIu64 " 0 0 0 0 0 0\n",
                             i,
-                            stat_node->view[curcpu].user,
-                            stat_node->view[curcpu].system,
-                            stat_node->view[curcpu].idle);
+                            curcpu_view_user_sum,
+                            curcpu_view_system_sum,
+                            curcpu_view_idle_sum);
                lxcfs_v("cpu: %s\n", buf);
                if (l < 0) {
                        lxcfs_error("Failed to write cache");
@@ -806,6 +837,10 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                buf += l;
                buf_size -= l;
                total_len += l;
+
+               curcpu_view_user_sum = 0;
+               curcpu_view_system_sum = 0;
+               curcpu_view_idle_sum = 0;
        }
 
        /* Pass the rest of /proc/stat, start with the last line read */