This is an automated email from the ASF dual-hosted git repository.

technoboy pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 3897c4bf255 [fix] [broker] consider iowait as idle. (#19110)
3897c4bf255 is described below

commit 3897c4bf255ae9d57d19424220db0b3bf6265c25
Author: thetumbled <[email protected]>
AuthorDate: Thu Aug 31 15:26:52 2023 +0800

    [fix] [broker] consider iowait as idle. (#19110)
---
 .../pulsar/broker/loadbalance/LinuxInfoUtils.java  |  5 ++-
 .../loadbalance/impl/LinuxBrokerHostUsageImpl.java |  3 +-
 .../broker/loadbalance/LinuxInfoUtilsTest.java     | 50 ++++++++++++++++++++++
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtils.java
 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtils.java
index 17aa7170fc6..61f34ef4901 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtils.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtils.java
@@ -161,7 +161,8 @@ public class LinuxInfoUtils {
      * </pre>
      * <p>
      * Line is split in "words", filtering the first. The sum of all numbers 
give the amount of cpu cycles used this
-     * far. Real CPU usage should equal the sum subtracting the idle cycles, 
this would include iowait, irq and steal.
+     * far. Real CPU usage should equal the sum substracting the idle 
cycles(that is idle+iowait), this would include
+     * cpu, user, nice, system, irq, softirq, steal, guest and guest_nice.
      */
     public static ResourceUsage getCpuUsageForEntireHost() {
         try (Stream<String> stream = Files.lines(Paths.get(PROC_STAT_PATH))) {
@@ -175,7 +176,7 @@ public class LinuxInfoUtils {
                     .filter(s -> !s.contains("cpu"))
                     .mapToLong(Long::parseLong)
                     .sum();
-            long idle = Long.parseLong(words[4]);
+            long idle = Long.parseLong(words[4]) + Long.parseLong(words[5]);
             return ResourceUsage.builder()
                     .usage(total - idle)
                     .idle(idle)
diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LinuxBrokerHostUsageImpl.java
 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LinuxBrokerHostUsageImpl.java
index 2f7ca614943..6d0e6bb9073 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LinuxBrokerHostUsageImpl.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LinuxBrokerHostUsageImpl.java
@@ -155,7 +155,8 @@ public class LinuxBrokerHostUsageImpl implements 
BrokerHostUsage {
      * </pre>
      *
      * Line is split in "words", filtering the first. The sum of all numbers 
give the amount of cpu cycles used this
-     * far. Real CPU usage should equal the sum subtracting the idle cycles, 
this would include iowait, irq and steal.
+     * far. Real CPU usage should equal the sum substracting the idle 
cycles(that is idle+iowait), this would include
+     * cpu, user, nice, system, irq, softirq, steal, guest and guest_nice.
      */
     private double getTotalCpuUsageForEntireHost() {
         LinuxInfoUtils.ResourceUsage cpuUsageForEntireHost = 
getCpuUsageForEntireHost();
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtilsTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtilsTest.java
new file mode 100644
index 00000000000..ac21b30bdde
--- /dev/null
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LinuxInfoUtilsTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.broker.loadbalance;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mockStatic;
+import static org.testng.Assert.assertEquals;
+import java.nio.file.Files;
+import java.util.stream.Stream;
+import lombok.extern.slf4j.Slf4j;
+import org.mockito.MockedStatic;
+import org.testng.annotations.Test;
+
+@Slf4j
+@Test(groups = "broker")
+public class LinuxInfoUtilsTest {
+
+    /**
+     * simulate reading first line of /proc/stat to get total cpu usage.
+     */
+    @Test
+    public void testGetCpuUsageForEntireHost(){
+        try (MockedStatic<Files> filesMockedStatic = mockStatic(Files.class)) {
+            filesMockedStatic.when(() -> Files.lines(any())).thenReturn(
+                    Stream.generate(() -> "cpu  317808 128  58637  2503692 
7634   0   13472   0    0     0"));
+            long idle = 2503692 + 7634, total = 2901371;
+            LinuxInfoUtils.ResourceUsage resourceUsage = 
LinuxInfoUtils.ResourceUsage.builder()
+                    .usage(total - idle)
+                    .idle(idle)
+                    .total(total).build();
+            assertEquals(LinuxInfoUtils.getCpuUsageForEntireHost(), 
resourceUsage);
+        }
+    }
+}

Reply via email to