chenBright commented on code in PR #3009:
URL: https://github.com/apache/brpc/pull/3009#discussion_r2173618731


##########
src/bthread/task_control.cpp:
##########
@@ -524,12 +525,29 @@ void TaskControl::print_rq_sizes(std::ostream& os) {
 
 double TaskControl::get_cumulated_worker_time() {
     int64_t cputime_ns = 0;
+    int64_t now = butil::cpuwide_time_ns();
     BAIDU_SCOPED_LOCK(_modify_group_mutex);
     for_each_task_group([&](TaskGroup* g) {
         if (g) {
-            cputime_ns += g->_cumulated_cputime_ns;
+            // With the acquire-release atomic operation, the CPU time of the 
bthread is
+            // only calculated once through `_cumulated_cputime_ns' or 
`_last_run_ns'.
+            cputime_ns += 
g->_cumulated_cputime_ns.load(butil::memory_order_acquire);
+            // The bthread is still running on the worker,
+            // so we need to add the elapsed time since it started.
+            // In extreme cases, before getting `_last_run_ns_in_tc',
+            // `_last_run_ns_in_tc' may have been updated multiple times,
+            // and `cputime_ns' will miss some cpu time, which is ok.
+            int64_t last_run_ns = g->_last_run_ns;
+            if (last_run_ns > _last_get_cumulated_time_ns) {
+                g->_last_run_ns_in_tc = last_run_ns;
+                cputime_ns += now - last_run_ns;
+            } else if (last_run_ns == g->_last_run_ns_in_tc) {
+                // The bthread is still running on the same worker.
+                cputime_ns += now - last_run_ns;
+            }

Review Comment:
   > read `_last_run_ns` **before and after** reading `_cumulated_cputime_ns`, 
and verify that both `_last_run_ns` reads return the same value.
   
   I guess your intention is to try to read `_cumulated_cputime_ns` again when 
the `_last_run_ns` read twice are different. However, this approach cannot 
guarantee that the value of `_cumulated_cputime_ns` read the second time is 
3e9, and it may still read 0. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org
For additional commands, e-mail: dev-h...@brpc.apache.org

Reply via email to