This is an automated email from the ASF dual-hosted git repository. mattisonchao pushed a commit to branch introduce_oshi in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit c9cd5322994460a7bdd9a03a7bdcac00c5164afc Author: mattisonchao <[email protected]> AuthorDate: Mon Dec 19 17:58:46 2022 +0800 Introduce oshi --- pulsar-broker/pom.xml | 5 +++++ .../pulsar/broker/loadbalance/LinuxInfoUtils.java | 17 +++++++++++--- .../loadbalance/impl/LinuxBrokerHostUsageImpl.java | 26 +++++++++++++++------- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/pulsar-broker/pom.xml b/pulsar-broker/pom.xml index 136bd670d5e..2a213ec2905 100644 --- a/pulsar-broker/pom.xml +++ b/pulsar-broker/pom.xml @@ -426,6 +426,11 @@ <artifactId>pulsar-package-filesystem-storage</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>com.github.oshi</groupId> + <artifactId>oshi-core-java11</artifactId> + <version>6.4.0</version> + </dependency> </dependencies> <build> 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 42ef264b6db..a7a759a70f6 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 @@ -37,6 +37,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.SystemUtils; import org.apache.pulsar.broker.BitRateUnit; +import oshi.SystemInfo; +import oshi.hardware.NetworkIF; @Slf4j public class LinuxInfoUtils { @@ -55,6 +57,7 @@ public class LinuxInfoUtils { /** * Determine whether the OS is the linux kernel. + * * @return Whether the OS is the linux kernel */ public static boolean isLinux() { @@ -75,6 +78,7 @@ public class LinuxInfoUtils { /** * Get total cpu limit. + * * @param isCGroupsEnabled Whether CGroup is enabled * @return Total cpu limit */ @@ -97,6 +101,7 @@ public class LinuxInfoUtils { /** * Get CGroup cpu usage. + * * @return Cpu usage */ public static double getCpuUsageForCGroup() { @@ -145,6 +150,7 @@ public class LinuxInfoUtils { /** * Determine whether the VM has physical nic. + * * @param nicPath Nic path * @return whether The VM has physical nic. */ @@ -166,6 +172,7 @@ public class LinuxInfoUtils { /** * Determine whether nic is usable. + * * @param nicPath Nic path * @return whether nic is usable. */ @@ -190,7 +197,8 @@ public class LinuxInfoUtils { /** * Get all physical nic limit. - * @param nics All nic path + * + * @param nics All nic path * @param bitRateUnit Bit rate unit * @return Total nic limit */ @@ -207,8 +215,9 @@ public class LinuxInfoUtils { /** * Get all physical nic usage. - * @param nics All nic path - * @param type Nic's usage type: transport, receive + * + * @param nics All nic path + * @param type Nic's usage type: transport, receive * @param bitRateUnit Bit rate unit * @return Total nic usage */ @@ -225,6 +234,7 @@ public class LinuxInfoUtils { /** * Get paths of all usable physical nic. + * * @return All usable physical nic paths. */ public static List<String> getUsablePhysicalNICs() { @@ -241,6 +251,7 @@ public class LinuxInfoUtils { /** * Check this VM has nic speed. + * * @return Whether the VM has nic speed */ public static boolean checkHasNicSpeeds() { 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 318f37f7f7a..1162b6a759e 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 @@ -34,6 +34,7 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.pulsar.broker.BitRateUnit; import org.apache.pulsar.broker.PulsarService; @@ -41,6 +42,9 @@ import org.apache.pulsar.broker.loadbalance.BrokerHostUsage; import org.apache.pulsar.broker.loadbalance.LinuxInfoUtils; import org.apache.pulsar.policies.data.loadbalancer.ResourceUsage; import org.apache.pulsar.policies.data.loadbalancer.SystemResourceUsage; +import oshi.SystemInfo; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.hardware.NetworkIF; /** @@ -60,9 +64,9 @@ public class LinuxBrokerHostUsageImpl implements BrokerHostUsage { public LinuxBrokerHostUsageImpl(PulsarService pulsar) { this( - pulsar.getConfiguration().getLoadBalancerHostUsageCheckIntervalMinutes(), - pulsar.getConfiguration().getLoadBalancerOverrideBrokerNicSpeedGbps(), - pulsar.getLoadManagerExecutor() + pulsar.getConfiguration().getLoadBalancerHostUsageCheckIntervalMinutes(), + pulsar.getConfiguration().getLoadBalancerOverrideBrokerNicSpeedGbps(), + pulsar.getLoadManagerExecutor() ); } @@ -88,10 +92,16 @@ public class LinuxBrokerHostUsageImpl implements BrokerHostUsage { @Override public void calculateBrokerHostUsage() { - List<String> nics = getUsablePhysicalNICs(); - double totalNicLimit = getTotalNicLimitWithConfiguration(nics); - double totalNicUsageTx = getTotalNicUsage(nics, NICUsageType.TX, BitRateUnit.Kilobit); - double totalNicUsageRx = getTotalNicUsage(nics, NICUsageType.RX, BitRateUnit.Kilobit); + HardwareAbstractionLayer hardware = new SystemInfo().getHardware(); + List<NetworkIF> physicalNics = hardware.getNetworkIFs().stream() + .filter(ifs -> !ifs.queryNetworkInterface().isVirtual()) + .filter(ifs -> ifs.getIfOperStatus() == NetworkIF.IfOperStatus.UP || + ifs.getIfOperStatus() == NetworkIF.IfOperStatus.UNKNOWN || + ifs.getIfOperStatus() == NetworkIF.IfOperStatus.DORMANT) + .collect(Collectors.toList()); + long totalNicLimit = physicalNics.stream().mapToLong(NetworkIF::getSpeed).sum(); + long totalNicUsageTx = physicalNics.stream().mapToLong(NetworkIF::getBytesSent).sum(); + long totalNicUsageRx = physicalNics.stream().mapToLong(NetworkIF::getBytesRecv).sum(); double totalCpuLimit = getTotalCpuLimit(isCGroupsEnabled); long now = System.currentTimeMillis(); double elapsedSeconds = (now - lastCollection) / 1000d; @@ -153,7 +163,7 @@ public class LinuxBrokerHostUsageImpl implements BrokerHostUsage { * cpu user nice system idle iowait irq softirq steal guest guest_nice * cpu 317808 128 58637 2503692 7634 0 13472 0 0 0 * </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 substracting the idle cycles, this would include iowait, irq and steal. */
