This is an automated email from the ASF dual-hosted git repository.
technoboy pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new 792a98eedba [fix] [broker] consider iowait as idle. (#19110)
792a98eedba is described below
commit 792a98eedba1c1457651dbe2f9f3afb3a242f1a2
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);
+ }
+ }
+}