diff --git a/.classpath b/.classpath index 70a394f..bef6664 100644 --- a/.classpath +++ b/.classpath @@ -4,8 +4,6 @@ - - diff --git a/.idea/libraries/jctools_core_jdk11_4_0_7.xml b/.idea/libraries/jctools_core_jdk11_4_0_7.xml new file mode 100644 index 0000000..f48a35f --- /dev/null +++ b/.idea/libraries/jctools_core_jdk11_4_0_7.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/KLALB.iml b/KLALB.iml index 493b3cc..112977b 100644 --- a/KLALB.iml +++ b/KLALB.iml @@ -250,5 +250,6 @@ + \ No newline at end of file diff --git a/lib/KNElib1.0.jar b/lib/KNElib1.0.jar index 2d38b26..ddab9ad 100644 Binary files a/lib/KNElib1.0.jar and b/lib/KNElib1.0.jar differ diff --git a/lib/jctools-core-4.0.6-sources.jar b/lib/jctools-core-4.0.6-sources.jar deleted file mode 100644 index 6c98e07..0000000 Binary files a/lib/jctools-core-4.0.6-sources.jar and /dev/null differ diff --git a/lib/jctools-core-4.0.6.jar b/lib/jctools-core-4.0.6.jar deleted file mode 100644 index 94a8307..0000000 Binary files a/lib/jctools-core-4.0.6.jar and /dev/null differ diff --git a/src/klalb_en_US.properties b/src/klalb_en_US.properties index 6d5082a..17719d0 100644 --- a/src/klalb_en_US.properties +++ b/src/klalb_en_US.properties @@ -122,4 +122,6 @@ rttbaseline=RTT baseline rtt=RTT rttmax=RTT max rttmin=RTT min -rto=RTO \ No newline at end of file +rto=RTO +cpuload=CPU load +ramusage=RAM usage \ No newline at end of file diff --git a/src/klalb_zh_CN.properties b/src/klalb_zh_CN.properties index eb0093f..e3667ba 100644 --- a/src/klalb_zh_CN.properties +++ b/src/klalb_zh_CN.properties @@ -122,4 +122,6 @@ rttbaseline=往返延迟基线 rtt=往返延迟 rttmax=往返延迟上限 rttmin=往返延迟下限 -rto=重传超时 \ No newline at end of file +rto=重传超时 +cpuload=CPU负载 +ramusage=RAM占用率 \ No newline at end of file diff --git a/src/org/kne/cloud/network/IPMulticastDiscovery.java b/src/org/kne/cloud/network/IPMulticastDiscovery.java index e6aff23..06ed44b 100644 --- a/src/org/kne/cloud/network/IPMulticastDiscovery.java +++ b/src/org/kne/cloud/network/IPMulticastDiscovery.java @@ -8,6 +8,8 @@ import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.*; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.Enumeration; import java.util.Iterator; import java.util.List; @@ -148,21 +150,39 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { } }).start(); } + // 1. 接收用的 ThreadLocal 缓冲区 + private static final ThreadLocal RX_BUFFER = ThreadLocal.withInitial(() -> ByteBuffer.allocate(2048)); + // 2. 发送用的 ThreadLocal 缓冲区 (广播包一般很小) + private static final ThreadLocal TX_BUFFER = ThreadLocal.withInitial(() -> ByteBuffer.allocate(2048)); private MultiProtocolSocketAddress receive() throws IOException { - byte[] b = new byte[65535]; - DatagramPacket dp = new DatagramPacket(b, b.length); + ByteBuffer bbf = RX_BUFFER.get(); + bbf.clear(); // 重置 position=0, limit=2048 + + // 借用底层数组 + DatagramPacket dp = new DatagramPacket(bbf.array(), bbf.limit()); soc.receive(dp); - ByteArrayInputStream bis = new ByteArrayInputStream(b, 0, dp.getLength()); - DataInputStream dis = new DataInputStream(bis); - String val = dis.readUTF(); - long h=dis.readLong(); - long l=dis.readLong(); - UUID uid=new UUID(h, l); - dis.close(); + + // 限制可读范围 + int length = dp.getLength(); + bbf.limit(length); + + // 直接读 UTF 字符串 (不用 DataInputStream) + // 读取前两个字节的长度,然后创建 String + int strLen = bbf.getShort() & 0xFFFF; // 无符号转 int + byte[] strBytes = new byte[strLen]; // 这里为了 String 还是得分配一次,但很小 + bbf.get(strBytes); + String val = new String(strBytes, StandardCharsets.UTF_8); + + // 直接读两个 Long 拼成 UUID + long h = bbf.getLong(); + long l = bbf.getLong(); + UUID uid = new UUID(h, l); // UUID 对象很小,年轻代瞬间回收,不用池化 + MultiProtocolSocketAddress mpsa = new MultiProtocolSocketAddress(val); - if(mpsa.getInetAddress().isAnyLocalAddress()){ - mpsa=new MultiProtocolSocketAddress(mpsa.getProtocol(),dp.getAddress().getHostAddress(),mpsa.getPort()); + + if (mpsa.getInetAddress().isAnyLocalAddress()) { + mpsa = new MultiProtocolSocketAddress(mpsa.getProtocol(), dp.getAddress().getHostAddress(), mpsa.getPort()); } if(debug) { if(uid.equals(selfUUID)) { @@ -176,15 +196,23 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { } private void send(MultiProtocolSocketAddress multiProtocolSocketAddress) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dops = new DataOutputStream(baos); - dops.writeUTF(multiProtocolSocketAddress.toString()); - dops.writeLong(selfUUID.getMostSignificantBits()); - dops.writeLong(selfUUID.getLeastSignificantBits()); - dops.close(); - byte[] b = baos.toByteArray(); - DatagramPacket dp = new DatagramPacket(b, b.length, group); + ByteBuffer bbf = TX_BUFFER.get(); + bbf.clear(); // 重置 + + // 写字符串 (长度 + 字节) + byte[] strBytes = multiProtocolSocketAddress.toString().getBytes(StandardCharsets.UTF_8); + bbf.putShort((short) strBytes.length); + bbf.put(strBytes); + + // 写 UUID + bbf.putLong(selfUUID.getMostSignificantBits()); + bbf.putLong(selfUUID.getLeastSignificantBits()); + + bbf.flip(); // 准备读取 + + DatagramPacket dp = new DatagramPacket(bbf.array(), bbf.limit(), group); soc.send(dp); + if(debug) System.out.println(ninterface.getDisplayName()+" 发送广播:"+ multiProtocolSocketAddress +" "+group+" "+selfUUID); diff --git a/src/org/kne/cloud/network/congestion/MpscMessageBatcher.java b/src/org/kne/cloud/network/congestion/MpscMessageBatcher.java index cd21127..e0e76f6 100644 --- a/src/org/kne/cloud/network/congestion/MpscMessageBatcher.java +++ b/src/org/kne/cloud/network/congestion/MpscMessageBatcher.java @@ -1,6 +1,7 @@ package org.kne.cloud.network.congestion; -import org.jctools.queues.MpscArrayQueue; +import org.jctools.queues.MessagePassingQueue; +import org.jctools.queues.varhandle.MpscVarHandleArrayQueue; import org.kne.cloud.network.ThreadTool; import org.kne.opencl64.Releaser; @@ -82,7 +83,7 @@ class MpscMessageBatcherReleaser extends Releaser> { class MpscMessageBatcher0 implements Runnable, MessageBatcher { - private final MpscArrayQueue queue; + private final MessagePassingQueue queue; private final int batchSize; private final long maxDelay; private volatile Consumer> consumer; @@ -94,7 +95,7 @@ class MpscMessageBatcher0 implements Runnable, MessageBatcher { public MpscMessageBatcher0(int batchSize, long maxDelay, int queueCapacity) { this.batchSize = batchSize; this.maxDelay = maxDelay; - this.queue = new MpscArrayQueue<>(queueCapacity); + this.queue = new MpscVarHandleArrayQueue<>(queueCapacity); this.batchThread = ThreadTool.makeVDaemonThread("MpscMessageBatcher", this); this.batchThread.start(); diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java b/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java index fc37180..2f440fd 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java @@ -21,7 +21,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.LockSupport; import java.util.function.Consumer; -import org.jctools.queues.MpscArrayQueue; +import org.jctools.queues.varhandle.MpscVarHandleArrayQueue; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.clock.NTPTimestamps; import org.kne.cloud.clock.ReliabilityBackoffTimeClock; @@ -184,7 +184,7 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement private class RemoteSender implements Runnable { - private MpscArrayQueue sendQueue = new MpscArrayQueue(8192); + private MpscVarHandleArrayQueue sendQueue = new MpscVarHandleArrayQueue(8192); private WatchDogTimer watchdog = new WatchDogTimer(400000000L); private ThreadParker tlock = new ThreadParker(); diff --git a/src/org/kne/cloud/network/klalb/KLALBUtils.java b/src/org/kne/cloud/network/klalb/KLALBUtils.java index 7322633..fd5a839 100644 --- a/src/org/kne/cloud/network/klalb/KLALBUtils.java +++ b/src/org/kne/cloud/network/klalb/KLALBUtils.java @@ -13,8 +13,6 @@ import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.jctools.counters.CountersFactory; -import org.jctools.counters.FixedSizeStripedLongCounter; import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ipv6.IPv6Address; @@ -434,7 +432,5 @@ public static String parseAbbrIPv6(String IPv6Str) { } - public static FixedSizeStripedLongCounter createCounter() { - return CountersFactory.createFixedSizeStripedCounter(Runtime.getRuntime().availableProcessors()); - } + } diff --git a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java index 2bcc09d..e0c0f17 100644 --- a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java +++ b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java @@ -4,6 +4,7 @@ import java.awt.*; import java.awt.datatransfer.StringSelection; import java.awt.event.*; import java.io.IOException; +import java.lang.management.ManagementFactory; import java.net.*; import java.util.ArrayList; import java.util.List; @@ -16,6 +17,7 @@ import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import com.sun.management.OperatingSystemMXBean; import org.jfree.chart.plot.dial.*; import org.jfree.data.general.DefaultValueDataset; import org.kne.cloud.clock.HighAccuracyClock; @@ -56,7 +58,8 @@ public class KLALBStateGUI3 extends XFrame { private DefaultValueDataset backplanePPS; private DefaultValueDataset backplaneECNRate; private DefaultValueDataset backplaneLossRate; - + private DefaultValueDataset CPUload; + private DefaultValueDataset RAMusage; // ==================== 仪表盘文本标注 ==================== private DialTextAnnotation upSpeedText; // 上行速度文本标注 private DialTextAnnotation downSpeedText; // 下行速度文本标注 @@ -66,6 +69,8 @@ public class KLALBStateGUI3 extends XFrame { private DialTextAnnotation backplanePPSText; private DialTextAnnotation backplaneECNRateText; private DialTextAnnotation backplaneLossRateText; + private DialTextAnnotation CPUloadText; + private DialTextAnnotation RAMusageText; // ==================== UI组件 ==================== private YScrollPane ysp, yspc; // 可垂直滚动的面板 @@ -433,6 +438,22 @@ public class KLALBStateGUI3 extends XFrame { backplaneLossRateText = lossRate1.getTextAnnotation(); dashs.add(lossRate1); + + // CPU + CPUload = new DefaultValueDataset(0); + DialPanel cload=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("cpuload"), CPUload, null, Color.BLUE, new Color(0, 0, 127)); + cload.addGradientRanges(UIEnv.RANGE_1); + CPUloadText = cload.getTextAnnotation(); + + dashs.add(cload); + + // RAM + RAMusage = new DefaultValueDataset(0); + DialPanel ruse=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("ramusage"), RAMusage, null, Color.BLUE, new Color(0, 0, 127)); + ruse.addGradientRanges(UIEnv.RANGE_1); + RAMusageText = ruse.getTextAnnotation(); + + dashs.add(ruse); } @@ -1392,6 +1413,7 @@ public class KLALBStateGUI3 extends XFrame { } }, 100, 100,TimeUnit.MILLISECONDS); + // 网络图刷新任务 if (tsk5 != null) { tsk5.cancel(false); @@ -1497,7 +1519,28 @@ public class KLALBStateGUI3 extends XFrame { backplaneLossRate.setValue(Math.min(backplaneLossRate.getValue().doubleValue() * 0.98 + backplaneLossv * 0.02, 101.0)); } } - + + // 更新CPU + OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + double sys=osBean.getCpuLoad(); + double proc=osBean.getProcessCpuLoad(); + double load = proc/(1-sys+proc)* 100.0 ; + if (Double.isFinite(load)) { + CPUload.setValue(Math.min(CPUload.getValue().doubleValue() * 0.98 + load * 0.02, 101.0)); + } + CPUloadText.setLabel(String.format("%.1f",load) + "%"); + + + // 更新RAM + long max=Runtime.getRuntime().maxMemory(); + long free=Runtime.getRuntime().freeMemory(); + double ramUsage = (double) (max - free) /max* 100.0 ; + if (Double.isFinite(ramUsage)) { + RAMusage.setValue(Math.min(RAMusage.getValue().doubleValue() * 0.98 + ramUsage * 0.02, 101.0)); + } + RAMusageText.setLabel(KLALBUtils.convertIBUint(max- free)+"/"+KLALBUtils.convertIBUint(max ) ); + + // 更新在线设备数 String contt = Long.toString(kc.getIpv6Router().getKlalbRouteProtol().getDevicesFound()); if (!contt.equals(devicesOnline.getText())) { diff --git a/src/org/kne/cloud/network/klalb/ui/KperfGUI.java b/src/org/kne/cloud/network/klalb/ui/KperfGUI.java index 33afc00..fa08b7c 100644 --- a/src/org/kne/cloud/network/klalb/ui/KperfGUI.java +++ b/src/org/kne/cloud/network/klalb/ui/KperfGUI.java @@ -10,6 +10,7 @@ import org.jfree.chart.plot.dial.DialTextAnnotation; import org.jfree.data.general.DefaultValueDataset; import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.klalb.CONST; +import org.kne.cloud.network.klalb.KLALBScheduler; import org.kne.cloud.network.klalb.KLALBUtils; import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl; import org.kne.cloud.network.perf.Kperf; @@ -35,11 +36,12 @@ import java.awt.event.ActionEvent; import javax.swing.JLabel; import javax.imageio.ImageIO; import java.awt.Font; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; import javax.swing.SwingConstants; import javax.swing.ImageIcon; public class KperfGUI extends XFrame{ - private static Timer tmr=new Timer(); private KperfReports reports=new KperfReportsImpl(); private Kperf kperf; @@ -67,7 +69,7 @@ public class KperfGUI extends XFrame{ private DialTextAnnotation downPPSText; - private TimerTask tsk; + private ScheduledFuture tsk; private class KperfReportsImpl implements KperfReports{ @Override public void testFinish() { @@ -211,254 +213,12 @@ public class KperfGUI extends XFrame{ panel_6.add(downPPSLabel, BorderLayout.EAST); - - /* - { - upSpeed = new DefaultValueDataset(0); - upDataSpeed = new DefaultValueDataset(0); - DialPlot dpup = new DialPlot(); - dpup.setDataset(1, upSpeed); - dpup.setDataset(0, upDataSpeed); - StandardDialFrame sdfs = new StandardDialFrame(); - sdfs.setVisible(false); - dpup.setDialFrame(sdfs); - StandardDialScale sds = new StandardDialScale(0, 100, -120, -300, 10, 5); - sds.setTickRadius(0.9); - sds.setTickLabelsVisible(false); - dpup.addScale(0, sds); - StandardDialRange sdrr = new StandardDialRange(0, 70, Color.GREEN); - sdrr.setInnerRadius(0.92); - sdrr.setOuterRadius(0.93); - dpup.addLayer(sdrr); - - StandardDialRange sdrr2 = new StandardDialRange(70, 90, Color.YELLOW); - sdrr2.setInnerRadius(0.92); - sdrr2.setOuterRadius(0.93); - dpup.addLayer(sdrr2); - - StandardDialRange sdrr3 = new StandardDialRange(90, 100, Color.RED); - sdrr3.setInnerRadius(0.92); - sdrr3.setOuterRadius(0.93); - dpup.addLayer(sdrr3); - - DialPointer.Pointer dpd = new DialPointer.Pointer(); - dpd.setRadius(0.8); - dpd.setFillPaint(new Color(127, 0, 0, 0)); - dpd.setOutlinePaint(new Color(127, 0, 0)); - dpd.setDatasetIndex(0); - //dpup.addLayer(dpd); - - DialPointer.Pointer dp = new DialPointer.Pointer(); - dp.setRadius(0.8); - dp.setFillPaint(Color.RED); - dp.setOutlinePaint(Color.RED); - dp.setDatasetIndex(1); - dpup.addLayer(dp); - - upSpeedText = new DialTextAnnotation("0%"); - upSpeedText.setFont(UIEnv.getFont().deriveFont(20.0f)); - dpup.addLayer(upSpeedText); - - JFreeChart jfup = new JFreeChart(dpup); - jfup.setBorderPaint(Color.WHITE); - jfup.setTitle(UIEnv.getRsb().getString("uploadspeed")); - jfup.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); - jfup.getTitle().setPosition(RectangleEdge.BOTTOM); - dpup.setView(0, 0, 1, 1); - ChartPanel cpup = new ChartPanel(jfup); - cpup.setPreferredSize(dashSize); - cpup.setSize(dashSize); - cpup.setMinimumSize(dashSize); - cpup.setBackground(Color.WHITE); - cpup.setBorder(new LineBorder(Color.LIGHT_GRAY)); - panel_3.add(cpup, BorderLayout.WEST); - - downSpeed = new DefaultValueDataset(0); - downDataSpeed = new DefaultValueDataset(0); - DialPlot dpup1 = new DialPlot(); - dpup1.setDataset(1, downSpeed); - dpup1.setDataset(0, downDataSpeed); - StandardDialFrame sdfs1 = new StandardDialFrame(); - sdfs1.setVisible(false); - dpup1.setDialFrame(sdfs1); - StandardDialScale sds1 = new StandardDialScale(0, 100, -120, -300, 10, 5); - sds1.setTickRadius(0.9); - sds1.setTickLabelsVisible(false); - dpup1.addScale(0, sds1); - - StandardDialRange sdrr1 = new StandardDialRange(0, 70, Color.GREEN); - sdrr1.setInnerRadius(0.92); - sdrr1.setOuterRadius(0.93); - dpup1.addLayer(sdrr1); - - StandardDialRange sdrr21 = new StandardDialRange(70, 90, Color.YELLOW); - sdrr21.setInnerRadius(0.92); - sdrr21.setOuterRadius(0.93); - dpup1.addLayer(sdrr21); - - StandardDialRange sdrr31 = new StandardDialRange(90, 100, Color.RED); - sdrr31.setInnerRadius(0.92); - sdrr31.setOuterRadius(0.93); - dpup1.addLayer(sdrr31); - - DialPointer.Pointer dp11 = new DialPointer.Pointer(); - dp11.setRadius(0.8); - dp11.setFillPaint(new Color(0, 127, 0, 0)); - dp11.setOutlinePaint(new Color(0, 127, 0)); - dp11.setDatasetIndex(0); - //dpup1.addLayer(dp11); - - DialPointer.Pointer dp1 = new DialPointer.Pointer(); - dp1.setRadius(0.8); - dp1.setFillPaint(Color.GREEN); - dp1.setOutlinePaint(Color.GREEN); - dp1.setDatasetIndex(1); - dpup1.addLayer(dp1); - - downSpeedText = new DialTextAnnotation("0%"); - downSpeedText.setFont(UIEnv.getFont().deriveFont(20.0f)); - dpup1.addLayer(downSpeedText); - - JFreeChart jfup1 = new JFreeChart(dpup1); - jfup1.setBorderPaint(Color.WHITE); - jfup1.setTitle(UIEnv.getRsb().getString("downloadspeed")); - jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); - jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); - dpup1.setView(0, 0, 1, 1); - ChartPanel cpup1 = new ChartPanel(jfup1); - cpup1.setPreferredSize(dashSize); - cpup1.setSize(dashSize); - cpup1.setMinimumSize(dashSize); - cpup1.setBackground(Color.WHITE); - cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY)); - panel_4.add(cpup1, BorderLayout.WEST); - - } - { - upPPS = new DefaultValueDataset(0); - upDataPPS = new DefaultValueDataset(0); - DialPlot dpup = new DialPlot(); - dpup.setDataset(1, upPPS); - dpup.setDataset(0, upDataPPS); - StandardDialFrame sdfs = new StandardDialFrame(); - sdfs.setVisible(false); - dpup.setDialFrame(sdfs); - StandardDialScale sds = new StandardDialScale(0, 100, -120, -300, 10, 5); - sds.setTickRadius(0.9); - sds.setTickLabelsVisible(false); - dpup.addScale(0, sds); - - StandardDialRange sdrr = new StandardDialRange(0, 70, Color.GREEN); - sdrr.setInnerRadius(0.92); - sdrr.setOuterRadius(0.93); - dpup.addLayer(sdrr); - - StandardDialRange sdrr2 = new StandardDialRange(70, 90, Color.YELLOW); - sdrr2.setInnerRadius(0.92); - sdrr2.setOuterRadius(0.93); - dpup.addLayer(sdrr2); - - StandardDialRange sdrr3 = new StandardDialRange(90, 100, Color.RED); - sdrr3.setInnerRadius(0.92); - sdrr3.setOuterRadius(0.93); - dpup.addLayer(sdrr3); - - DialPointer.Pointer dp1 = new DialPointer.Pointer(); - dp1.setRadius(0.8); - dp1.setFillPaint(new Color(127, 0, 0, 0)); - dp1.setOutlinePaint(new Color(127, 0, 0)); - dp1.setDatasetIndex(0); - //dpup.addLayer(dp1); - - DialPointer.Pointer dp = new DialPointer.Pointer(); - dp.setRadius(0.8); - dp.setFillPaint(Color.RED); - dp.setOutlinePaint(Color.RED); - dp.setDatasetIndex(1); - dpup.addLayer(dp); - - upPPSText = new DialTextAnnotation("0PPS"); - upPPSText.setFont(UIEnv.getFont().deriveFont(20.0f)); - dpup.addLayer(upPPSText); - - JFreeChart jfup = new JFreeChart(dpup); - jfup.setBorderPaint(Color.WHITE); - jfup.setTitle(UIEnv.getRsb().getString("uploadpps")); - jfup.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); - jfup.getTitle().setPosition(RectangleEdge.BOTTOM); - dpup.setView(0, 0, 1, 1); - ChartPanel cpup = new ChartPanel(jfup); - cpup.setPreferredSize(dashSize); - cpup.setSize(cpup.getPreferredSize()); - cpup.setBackground(Color.WHITE); - cpup.setBorder(new LineBorder(Color.LIGHT_GRAY)); - panel_5.add(cpup, BorderLayout.WEST); - - downPPS = new DefaultValueDataset(0); - downDataPPS = new DefaultValueDataset(0); - DialPlot dpup1 = new DialPlot(); - dpup1.setDataset(1, downPPS); - dpup1.setDataset(0, downDataPPS); - StandardDialFrame sdfs1 = new StandardDialFrame(); - sdfs1.setVisible(false); - dpup1.setDialFrame(sdfs1); - StandardDialScale sds1 = new StandardDialScale(0, 100, -120, -300, 10, 5); - sds1.setTickRadius(0.9); - sds1.setTickLabelsVisible(false); - dpup1.addScale(0, sds1); - - StandardDialRange sdrr1 = new StandardDialRange(0, 70, Color.GREEN); - sdrr1.setInnerRadius(0.92); - sdrr1.setOuterRadius(0.93); - dpup1.addLayer(sdrr1); - - StandardDialRange sdrr21 = new StandardDialRange(70, 90, Color.YELLOW); - sdrr21.setInnerRadius(0.92); - sdrr21.setOuterRadius(0.93); - dpup1.addLayer(sdrr21); - - StandardDialRange sdrr31 = new StandardDialRange(90, 100, Color.RED); - sdrr31.setInnerRadius(0.92); - sdrr31.setOuterRadius(0.93); - dpup1.addLayer(sdrr31); - - DialPointer.Pointer dp111 = new DialPointer.Pointer(); - dp111.setRadius(0.8); - dp111.setFillPaint(new Color(0, 127, 0, 0)); - dp111.setOutlinePaint(new Color(0, 127, 0)); - dp111.setDatasetIndex(0); - ///dpup1.addLayer(dp111); - DialPointer.Pointer dp11 = new DialPointer.Pointer(); - dp11.setRadius(0.8); - dp11.setFillPaint(Color.GREEN); - dp11.setOutlinePaint(Color.GREEN); - dp11.setDatasetIndex(1); - dpup1.addLayer(dp11); - - downPPSText = new DialTextAnnotation("0PPS"); - downPPSText.setFont(UIEnv.getFont().deriveFont(20.0f)); - dpup1.addLayer(downPPSText); - - JFreeChart jfup1 = new JFreeChart(dpup1); - jfup1.setBorderPaint(Color.WHITE); - jfup1.setTitle(UIEnv.getRsb().getString("downloadpps")); - jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); - jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); - dpup1.setView(0, 0, 1, 1); - ChartPanel cpup1 = new ChartPanel(jfup1); - cpup1.setPreferredSize(dashSize); - cpup1.setSize(cpup1.getPreferredSize()); - cpup1.setBackground(Color.WHITE); - cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY)); - panel_6.add(cpup1, BorderLayout.WEST); - }*/ - // 上行速度仪表盘 upSpeed = new DefaultValueDataset(0); upDataSpeed = new DefaultValueDataset(0); - DialPanel dialup=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadspeed"), upSpeed, upDataSpeed, Color.RED, new Color(127, 0, 0)); + DialPanel dialup=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadspeed"), upSpeed, null, Color.RED, new Color(127, 0, 0)); dialup.addGradientRanges(UIEnv.RANGE_1); upSpeedText =dialup.getTextAnnotation(); @@ -469,7 +229,7 @@ public class KperfGUI extends XFrame{ // 下行速度仪表盘 downSpeed = new DefaultValueDataset(0); downDataSpeed = new DefaultValueDataset(0); - DialPanel dialdown=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadspeed"), downSpeed, downDataSpeed, Color.GREEN, new Color(0, 127, 0)); + DialPanel dialdown=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadspeed"), downSpeed, null, Color.GREEN, new Color(0, 127, 0)); dialdown.addGradientRanges(UIEnv.RANGE_1); downSpeedText =dialdown.getTextAnnotation(); @@ -479,7 +239,7 @@ public class KperfGUI extends XFrame{ // 上行包速率仪表盘 upPPS = new DefaultValueDataset(0); upDataPPS = new DefaultValueDataset(0); - DialPanel dialupPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadpps"), upPPS, upDataPPS, Color.RED, new Color(127, 0, 0)); + DialPanel dialupPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadpps"), upPPS, null, Color.RED, new Color(127, 0, 0)); dialupPPS.addGradientRanges(UIEnv.RANGE_1); upPPSText = dialupPPS.getTextAnnotation(); @@ -488,7 +248,7 @@ public class KperfGUI extends XFrame{ // 下行包速率仪表盘 downPPS = new DefaultValueDataset(0); downDataPPS = new DefaultValueDataset(0); - DialPanel dialdownPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadpps"), downPPS, downDataPPS, Color.GREEN, new Color(0, 127, 0)); + DialPanel dialdownPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadpps"), downPPS, null, Color.GREEN, new Color(0, 127, 0)); dialdownPPS.addGradientRanges(UIEnv.RANGE_1); downPPSText = dialdownPPS.getTextAnnotation(); @@ -524,38 +284,37 @@ public class KperfGUI extends XFrame{ setSize(CONST.windowwidth,CONST.windowheight ); setResizable(false); setLocationRelativeTo(comp); - tsk=new TimerTask() { - - @Override - public void run() { - if(monitor!=null) { - double outload = monitor.getOutSpeed() * 100.0 / monitor.getOutSpeedMax(); - upSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getOutSpeed()) + "/s"); - if (Double.isFinite(outload)) { - upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue() * 0.98 + outload * 0.02, 101.0)); - } + tsk=KLALBScheduler.getScheduler().scheduleWithFixedDelay(new TimerTask() { - double inload = monitor.getInSpeed() * 100.0 / monitor.getInSpeedMax(); - downSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getInSpeed()) + "/s"); - if (Double.isFinite(inload)) { - downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue() * 0.98 + inload * 0.02, 101.0)); - } - - double outPPSload = monitor.getOutPPS() * 100.0 / monitor.getOutPPSMax(); - upPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getOutPPS()) + "PPS"); - if (Double.isFinite(outPPSload)) { - upPPS.setValue(Math.min(upPPS.getValue().doubleValue() * 0.98 + outPPSload * 0.02, 101.0)); - } - - double inPPSload = monitor.getInPPS() * 100.0 / monitor.getInPPSMax(); - downPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getInPPS()) + "PPS"); - if (Double.isFinite(inPPSload)) { - downPPS.setValue(Math.min(downPPS.getValue().doubleValue() * 0.98 + inPPSload * 0.02, 101.0)); - } - } + @Override + public void run() { + if(monitor!=null) { + double outload = monitor.getOutSpeed() * 100.0 / monitor.getOutSpeedMax(); + upSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getOutSpeed()) + "/s"); + if (Double.isFinite(outload)) { + upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue() * 0.98 + outload * 0.02, 101.0)); } - }; - tmr.scheduleAtFixedRate(tsk, 200, 100); + + double inload = monitor.getInSpeed() * 100.0 / monitor.getInSpeedMax(); + downSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getInSpeed()) + "/s"); + if (Double.isFinite(inload)) { + downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue() * 0.98 + inload * 0.02, 101.0)); + } + + double outPPSload = monitor.getOutPPS() * 100.0 / monitor.getOutPPSMax(); + upPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getOutPPS()) + "PPS"); + if (Double.isFinite(outPPSload)) { + upPPS.setValue(Math.min(upPPS.getValue().doubleValue() * 0.98 + outPPSload * 0.02, 101.0)); + } + + double inPPSload = monitor.getInPPS() * 100.0 / monitor.getInPPSMax(); + downPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getInPPS()) + "PPS"); + if (Double.isFinite(inPPSload)) { + downPPS.setValue(Math.min(downPPS.getValue().doubleValue() * 0.98 + inPPSload * 0.02, 101.0)); + } + } + } + }, 200, 100, TimeUnit.MILLISECONDS); addWindowListener(new WindowListener() { @Override @@ -585,7 +344,7 @@ public class KperfGUI extends XFrame{ @Override public void windowClosing(WindowEvent e) { if(tsk!=null) - tsk.cancel(); + tsk.cancel(false); } @Override diff --git a/src/org/kne/cloud/network/perf/Kperf.java b/src/org/kne/cloud/network/perf/Kperf.java index c15d917..aaf588f 100644 --- a/src/org/kne/cloud/network/perf/Kperf.java +++ b/src/org/kne/cloud/network/perf/Kperf.java @@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit; import org.kne.cloud.clock.AdjustedNanoClock; import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.clock.NTPTimestamps; import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.SpeedLimiter; import org.kne.cloud.network.ThreadTool; @@ -16,6 +17,7 @@ import org.kne.cloud.network.klalb.*; import org.kne.cloud.network.monitor.LinkStatus; import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl; import org.kne.concurrent.ThreadParker; +import org.kne.math.Long128; public class Kperf implements Runnable{ @@ -36,8 +38,8 @@ public class Kperf implements Runnable{ private volatile KLALBPacketLink link; private LinkStatus status=new LinkStatus(); - private SpeedAndTrafficAndDelayMonitorDataImpl monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(HighAccuracyClock.SYSTEM_CLOCK); - + private HighAccuracyClock sysclk =HighAccuracyClock.SYSTEM_CLOCK; + private SpeedAndTrafficAndDelayMonitorDataImpl monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(sysclk); private volatile boolean closed = false; private volatile ThreadParker tlock=new ThreadParker(); @@ -200,7 +202,9 @@ public class Kperf implements Runnable{ while ((!link.isClosed()) && (!closed)) { if (checkPingTimeSleep()) { - writePacketToKPL(new PINGPacket(System.nanoTime(),0, 0)); + PINGPacket ping = new PINGPacket(sysclk.getCurrentTimeNTP64().longValue(), monitor.getOutSpeed(), + monitor.getInSpeed()); + writePacketToKPL(ping); }else { KLALBPacket kpip = IsendDequeList.poll(); @@ -243,7 +247,17 @@ public class Kperf implements Runnable{ } switch (kpp.getType()) { case KLALBPacket.PING: - sendIPacket(new PONGPacket(((PINGPacket) kpp).getTime() ,kpp.getRcvtime(), System.nanoTime(),0, 0)); + long pct = System.nanoTime() - kpp.getRcvtime(); + Long128 curr = sysclk.getCurrentTimeNanos(); + Long128 rcv = curr.subtract(pct); + + Long128 local1281 = NTPTimestamps.nanosToNtp128BitTimestamp(curr); + PONGPacket pong = new PONGPacket(((PINGPacket) kpp).getTime(), + NTPTimestamps.ntp128To64(NTPTimestamps.nanosToNtp128BitTimestamp(rcv)).longValue(), + NTPTimestamps.ntp128To64(NTPTimestamps.nanosToNtp128BitTimestamp(curr)).longValue(), + monitor.getUploadBandwidth().calculateBandwidth(500000000L), + monitor.getDownloadBandwidth().calculateBandwidth(500000000L)); + sendIPacket(pong); break; case KLALBPacket.PONG: if (fst) { @@ -260,37 +274,43 @@ public class Kperf implements Runnable{ tc.start(); fst = false; } - + PONGPacket png = (PONGPacket) kpp; - long ul = png.getRcvtime() - png.getTimepingsnd()-(png.getTimepongsnd()-png.getTimepingrcv()); + Long128 local = sysclk.getCurrentTimeNanos(); + Long128 local128 = NTPTimestamps.nanosToNtp128BitTimestamp(local); - long DsndDelayFactor0 = png.getTimepingrcv() - png.getTimepingsnd(); - long DrcvDelayFactor0 = png.getRcvtime() - png.getTimepongsnd(); - long DsndDelayFactor; - long DrcvDelayFactor; + Long128 psnd = NTPTimestamps.ntp128BitToNanosTimestamp( + NTPTimestamps.inferNtp64To128(png.getTimepingsnd(), local128)); + // System.out.println("psnd"+NTPTimestamps.nanosSince1970ToString( + // NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( + // psnd,local128)))); + Long128 prcv = NTPTimestamps.ntp128BitToNanosTimestamp( + NTPTimestamps.inferNtp64To128(png.getTimepingrcv(), local128)); + // System.out.println("prcv"+NTPTimestamps.nanosSince1970ToString( + // NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( + // prcv,local128)))); + Long128 posnd = NTPTimestamps.ntp128BitToNanosTimestamp( + NTPTimestamps.inferNtp64To128(png.getTimepongsnd(), local128)); + // System.out.println("posnd"+NTPTimestamps.nanosSince1970ToString( + // NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( + // posnd,local128)))); - adjnc.getLock().lock(); - try { - adjnc.calibrate(png.getTimepongsnd() + ul / 2 - png.getRcvtime(), ul / 2); - DsndDelayFactor = DsndDelayFactor0 - adjnc.getDelta(); - DrcvDelayFactor = DrcvDelayFactor0 + adjnc.getDelta(); - if (DsndDelayFactor < 0) { - if (DrcvDelayFactor < 0) { + long DsndDelay = prcv.subtract(psnd).longValue(); + long DrcvDelay = local.subtract(posnd).longValue(); + // System.out.println(DsndDelay+" "+DrcvDelay); - } else { - adjnc.setDelta(adjnc.getDelta() + DsndDelayFactor); - DsndDelayFactor = DsndDelayFactor0 - adjnc.getDelta(); - DrcvDelayFactor = DrcvDelayFactor0 + adjnc.getDelta(); - } - } else { - if (DrcvDelayFactor < 0) { - adjnc.setDelta(adjnc.getDelta() - DrcvDelayFactor); - DsndDelayFactor = DsndDelayFactor0 - adjnc.getDelta(); - DrcvDelayFactor = DrcvDelayFactor0 + adjnc.getDelta(); - } + long rtt = DsndDelay + DrcvDelay; + if (DsndDelay >= 0 && DrcvDelay >= 0) { + monitor.recordUploadDelay(DsndDelay); + monitor.recordDownloadDelay(DrcvDelay); + //sysclk.adjustClock(Long128.valueOf( DsndDelay-DrcvDelay), 0.001); + } else { + long Dfallback = rtt / 2; + if (Dfallback >= 0) { + monitor.recordUploadDelay(Dfallback); + monitor.recordDownloadDelay(Dfallback); } - } finally { - adjnc.getLock().unlock(); + // sysclk.adjustClock(Long128.valueOf( DsndDelay-DrcvDelay), 0.1); } diff --git a/src/org/kne/cloud/network/srv6/SRv6Router.java b/src/org/kne/cloud/network/srv6/SRv6Router.java index d600670..d521a63 100644 --- a/src/org/kne/cloud/network/srv6/SRv6Router.java +++ b/src/org/kne/cloud/network/srv6/SRv6Router.java @@ -17,13 +17,13 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.LongAdder; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Supplier; -import org.jctools.counters.FixedSizeStripedLongCounter; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.network.congestion.MessageBatcher; import org.kne.cloud.network.ipv6.ControlledIPv6NetworkLink; @@ -48,10 +48,8 @@ import org.kne.cloud.network.klalb.KLALBRemoteLink; import org.kne.cloud.network.klalb.KLALBScheduler; import org.kne.cloud.network.klalb.KLALBUtils; import org.kne.cloud.network.klalb.PerformanceStrategy; -import org.kne.cloud.network.klalb.ui.PerformanceStrategyItem; -import org.kne.concurrent.HighPerformanceExecutor2; +import org.kne.concurrent.HighPerformanceExecutor; import org.kne.concurrent.TimeoutConcurrentHashMap; -import org.kne.io.KNEChannels; import com.google.gson.internal.Pair; @@ -501,7 +499,7 @@ public class SRv6Router { } //System.out.println("Send failed:" + iPv6Packet); - LosscountAdder.inc(1); + LosscountAdder.add(1); if (debug) { dbg.append("miss.\n"); // 路由失败 @@ -747,8 +745,8 @@ public class SRv6Router { }); } - private static HighPerformanceExecutor2 defaultExecutor = new HighPerformanceExecutor2( - (int) (Runtime.getRuntime().availableProcessors()), Thread.ofVirtual().name("SRv6 Routing").factory()); + private static HighPerformanceExecutor defaultExecutor = new HighPerformanceExecutor( + (int) (Runtime.getRuntime().availableProcessors()), 32,Thread.ofVirtual().name("SRv6 Routing").factory()); //private static HighPerformanceExecutor2 defaultExecutor = new HighPerformanceExecutor2(4, Thread.ofVirtual().name("SRv6 Routing").factory()); @@ -766,9 +764,10 @@ public class SRv6Router { break; case MULTI_FILL: case MULTI_SCATTER: - defaultExecutor.executeWithCongestionReport((state) -> { - runPacketSendTask0(sendTask, state); - }, 20,performanceStrategy); + Thread curr2=Thread.currentThread(); + defaultExecutor.execute(() -> { + runPacketSendTask0(sendTask, Thread.currentThread()==curr2); + }); break; } @@ -798,20 +797,22 @@ public class SRv6Router { } public void enqueuePacketReceiveTask(IPv6NetworkLink link, Supplier pack) { - defaultExecutor.executeWithCongestionReport((state) -> { + + Thread curr2=Thread.currentThread(); + defaultExecutor.execute(() -> { try { long start=System.nanoTime(); IPv6Packet packet = pack.get(); - if(state) { + if(Thread.currentThread()==curr2) { packet.markCE(); } onReceive(link ,packet); long time=System.nanoTime()-start; - backplaneCount(time,state); + backplaneCount(time,Thread.currentThread()==curr2); } catch (Exception e) { e.printStackTrace(); } - },20,performanceStrategy); + }); } public void enqueuePacket(IPv6Packet packet) { @@ -821,15 +822,15 @@ public class SRv6Router { } //private BandwidthSampler sampler=new BandwidthSampler(); - private FixedSizeStripedLongCounter timeAdder=KLALBUtils.createCounter(); - private FixedSizeStripedLongCounter countAdder=KLALBUtils.createCounter(); - private FixedSizeStripedLongCounter ECNcountAdder=KLALBUtils.createCounter(); - private FixedSizeStripedLongCounter LosscountAdder=KLALBUtils.createCounter(); + private LongAdder timeAdder=new LongAdder(); + private LongAdder countAdder=new LongAdder(); + private LongAdder ECNcountAdder=new LongAdder(); + private LongAdder LosscountAdder=new LongAdder(); private void backplaneCount(long time,boolean ECN) { - timeAdder.inc(time); - countAdder.inc(1); + timeAdder.add(time); + countAdder.add(1); if(ECN) { - ECNcountAdder.inc(1); + ECNcountAdder.add(1); } } private volatile long backplaneTime=0; @@ -841,10 +842,10 @@ public class SRv6Router { private void updateBackplaneCounter() { long curr=System.nanoTime(); - long totalTime=timeAdder.getAndReset(); - long totalCount=countAdder.getAndReset(); - long ECNCount=ECNcountAdder.getAndReset(); - long LossCount=LosscountAdder.getAndReset(); + long totalTime=timeAdder.sumThenReset(); + long totalCount=countAdder.sumThenReset(); + long ECNCount=ECNcountAdder.sumThenReset(); + long LossCount=LosscountAdder.sumThenReset(); if(totalCount!=0) { backplaneTime=totalTime/totalCount; ECNRate=((double)ECNCount)/totalCount; diff --git a/src/org/kne/concurrent/HighPerformanceExecutor2.java b/src/org/kne/concurrent/HighPerformanceExecutor2.java deleted file mode 100644 index 52d30a7..0000000 --- a/src/org/kne/concurrent/HighPerformanceExecutor2.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.kne.concurrent; - -import java.util.Queue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; - -import org.jctools.queues.MpscArrayQueue; -import org.kne.cloud.network.klalb.PerformanceStrategy; - -public class HighPerformanceExecutor2 implements Executor { - - private ThreadElement[] threads; - - public HighPerformanceExecutor2(int threadcount) { - //this(threadcount,Executors.defaultThreadFactory()); - this(threadcount,Thread.ofVirtual().factory()); - } - public HighPerformanceExecutor2(int threadcount,ThreadFactory th) { - threads=new ThreadElement[threadcount]; - for (int i = 0; i < threadcount; i++) { - ThreadElement t= new ThreadElement(); - th.newThread(t).start(); - threads[i]=t; - } - } - - - private static class ThreadElement implements Runnable{ - private MpscArrayQueue queue=new MpscArrayQueue(2048); - private AtomicInteger size=new AtomicInteger(); - - private volatile ThreadParker parker=new ThreadParker(); - public Queue getQueue() { - return queue; - } - public int size() { - - return queue.size(); - } - public long prev=System.nanoTime(); - public boolean putTask(Runnable e) { - boolean b=queue.offer(e); - if(b) { - // size.incrementAndGet(); - long curr=System.nanoTime(); - if(curr-prev>1000L||queue.size()>=8) { - prev=curr; - parker.unpark(); - } - } - return b; - - } - @Override - public void run() { - while(true) { - Runnable r=queue.poll(); - if(r!=null) { - // size.decrementAndGet(); - try { - r.run(); - }catch(Throwable e) { - e.printStackTrace(); - } - ThreadYieldCheckpoint.yieldCheckpoint(1000000L); - }else { - parker.parkNanos(1000000L); - - } - } - } - } - @Override - public void execute(Runnable command) { - if(execute0((x)->{command.run();},1000, PerformanceStrategy.MULTI_FILL)) { - return; - } - System.out.println("loss!"); - //backup.execute(command); - - - } - - private long vl=0; - - private boolean execute0(Consumer command, int limit, PerformanceStrategy strategy) { - if(strategy.equals(PerformanceStrategy.MULTI_SCATTER)){ - long ord=vl++; - ThreadElement te= threads[(int) (ord%threads.length)]; - boolean b=te.size()>limit; - return te.putTask( ()->{command.accept(b);}); - }else { - for (int i = 0; i < threads.length; i++) { - ThreadElement te = threads[i]; - boolean b = te.size() > limit; - if (!b) { - if (te.putTask(() -> { - command.accept(false); - })) { - return true; - } - } - } - - for (int i = 0; i < threads.length; i++) { - ThreadElement te = threads[i]; - if (te.putTask(() -> { - command.accept(true); - })) { - return true; - } - } - return false; - } - } - - public void executeWithCongestionReport(Consumer command) { - if(execute0(command,1000, PerformanceStrategy.MULTI_FILL)) { - return; - } - System.out.println("loss!"); - } - public void executeWithCongestionReport(Consumer command, int limit, PerformanceStrategy strategy) { - if(execute0(command,limit,strategy)) { - return; - } - System.out.println("loss!"); - - - } -}